两种线程
- IO线程:配置在netty连接点的用于处理网络数据的线程,主要处理编解码等直接与网络数据打交道的事件。
- 业务线程:用于处理具体业务逻辑的线程,可以理解为自己在provider上写的代码所执行的线程环境。
Dubbo 默认采用的是长连接的方式,即默认情况下一个consumer和一个provider之间只会建立一条链接,这种情况下:
IO线程的工作就是编码和解码数据,监听具体的数据请求,直接通过Channel发布数据等等;
业务线程就是处理IO线程处理之后的数据,业务线程并不知道任何跟网络相关的内容,只是纯粹的处理业务逻辑,在业务处理逻辑的时候往往存在复杂的逻辑,所以业务线程池的配置往往都要比IO线程池的配置大很多。
IO线程部分,Netty服务提供方NettyServer又使用了两级线程池,master主要用来接受客户端的连接请求,并把接受的请求分发给worker来处理。整个过程如下图:

IO线程的派发策略
- all(默认):所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。即worker线程接收到事件后,将该事件提交到业务线程池中,自己再去处理其他IO事件。
- direct:worker 线程接收到事件后,由 worker (IO线程)执行到底。
- message:只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
- execution:只有请求消息派发到线程池,不含响应(客户端线程池),响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
- connection:在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
业务线程池设置
- fixed:固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
coresize:200
maxsize:200
队列:SynchronousQueue
回绝策略:AbortPolicyWithReport-打印线程信息jstack,之后抛出异常 - cached:缓存线程池,空闲一分钟自动删除,需要时重建。
- limited:可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
配置示例:
<dubbo:protocol name="dubbo"dispatcher="a11"threadpool="fixed"threads="100"/>
573

被折叠的 条评论
为什么被折叠?



