在netty中的两种线程:boss线程、work线程缓存
1 boss线程ide
做用:性能
accept客户端的链接线程
将接收到的链接注册到一个worker线程上netty
个数:server
一般状况下,服务端每绑定一个端口,开启一个boss线程队列
2 worker线程事件
做用:ci
处理注册在其身上的链接connection上的各类io事件get
个数:
默认是:核数+1
注意:
一个worker线程能够注册多个connection
一个connection只能注册在一个worker线程上
dubbo的事件派发策略和线程池
一、dubbo基于netty。有5种派发策略:
all:(默认),全部消息都派发到线程池,包括请求,响应,链接事件,断开事件,心跳等。 即worker线程接收到事件后,将该事件提交到业务线程池中,本身再去处理其余事。
direct:worker线程接收到事件后,由worker执行到底。
message:只有请求响应消息派发到线程池,其它链接断开事件,心跳等消息,直接在 IO线程上执行
execution:只请求消息派发到线程池,不含响应(客户端线程池),响应和其它链接断开事件,心跳等消息,直接在 IO 线程上执行
connection:在 IO 线程上,将链接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
二、业务线程池:
fixed:固定大小线程池,启动时创建线程,不关闭,一直持有。(默认)
coresize:200
maxsize:200
队列:SynchronousQueue
回绝策略:AbortPolicyWithReport - 打印线程信息jstack,以后抛出异常
cached:缓存线程池,空闲一分钟自动删除,须要时重建。
limited:可伸缩线程池,但池中的线程数只会增加不会收缩。只增加不收缩的目的是为了不收缩时忽然来了大流量引发的性能问题。
服务端
两种线程池:
io线程池:netty的boss和worker线程池。
boss:创建connection
worker:处理注册在其身上的链接connection上的各类io事件
业务线程池:
fixedThreadPool():“DubboServerHandler-10.10.10.11:20880”
见“ dubbo的事件派发策略和线程池”
与worker配合处理各类请求
客户端
两种线程池:
io线程池:netty的boss和worker线程池
同上
业务线程池:
cachedThreadPool:“DubboClientHandler-10.10.10.10:20880”
与worker配合处理各类响应,最后获得响应后唤醒被阻塞的主线程
dubbo线程模型图
总体步骤:(受限于派发策略,以默认的all为例, 以netty4为例)
客户端的主线程发出一个请求后得到future,在执行get时进行阻塞等待;
服务端使用worker线程(netty通讯模型)接收到请求后,将请求提交到server线程池中进行处理
server线程处理完成以后,将相应结果返回给客户端的worker线程池(netty通讯模型),最后,worker线程将响应结果提交到client线程池进行处理
client线程将响应结果填充到future中,而后唤醒等待的主线程,主线程获取结果,返回给客户端