sofastack / sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.
https://www.sofastack.tech/sofa-rpc/docs/Home
Apache License 2.0
3.81k stars 1.17k forks source link

processInIOThread #380

Closed dahanwang closed 5 years ago

dahanwang commented 5 years ago

Your question

  1. userProcessor.processInIOThread能否可配置?

    • 服务端想直接使用IO线程池,根据RpcRequestProcessor代码只能重写BoltServer与BoltServerProcessor(很麻烦)
  2. 客户端能否支持自定义线程池?

    • RpcResponseProcessor没有重写process方法,也没有办法直接使用IO线程池。

Environment

leizhiyuan commented 5 years ago
  1. 背景是什么?为什么要用 io 线程池处理?这个性能影响会非常严重

2.客户端发起都是客户端自己的线程,RpcResponseProcessor 的执行是在用户发起线程里的。

dahanwang commented 5 years ago

感谢回复。背景是游戏

  1. 只是想使用自己的实现的线程池处理逻辑(与java ThreadPoolExecutor不太一样),如果不能直接使用io线程池就会变成。io threadpool -> sofa default threadpool/sofa userthreadpool -> my threadpool,这种情况sofa threadpool就失去了意义。而期望的使用方式io threadpool -> my threadpool。
  2. sofa-rpc客户端很多时候在业务高发的backend上,情况和上面一样,期望使用io线程池。RpcResponseProcessor没有重写process方法,只能使用sofa default threadpool。期望实现方式与RpcRequestProcessor一致

个人感觉processInIOThread这个很有必要开放出来

leizhiyuan commented 5 years ago
  1. http://www.sofastack.tech/sofa-rpc/docs/Custom-ThreadPool 有个自定义线程池,但是要根据接口维度。不知道是否满足你们的需求

  2. RpcResponseProcessor 这个 @dbl-x 看下呢?

dbl-x commented 5 years ago

@leizhiyuan 理解下来用户是希望RpcResponseProcessor能有自己的Executor,这样在处理的时候会从io线程转到用户自己的Executor,中间不会再有一个Bolt中的DefaultExecutor。

Bolt默认的RpcResponseProcessor支持传入Executor,可以在Bolt RPC模块中增加一个配置来让用户传入自己的Executor。

leizhiyuan commented 5 years ago

@dbl-x 恩,com.alipay.remoting.rpc.protocol.RpcCommandHandler#RpcCommandHandler 现在这里是固定了。如果bolt 支持传的话,rpc 可以支持吧用户配置的传进来。

第一个的话, com.alipay.sofa.rpc.server.bolt.BoltServerProcessor#getExecutorSelector 目前 rpc 是这样选择的, 如果这个不满足需求,可以再改下。支持全局指定一个。

dahanwang commented 5 years ago

@dbl-x @leizhiyuan 感谢二位。 支持传入Executor其实和UserThreadPool性质差不多,再加上可配置processInIOThread,就完美了

leizhiyuan commented 5 years ago

will support in https://github.com/alipay/sofa-rpc/pull/544

this issue will close