Dubbo线程池
- dubbo底层是基于netty4进行的网络调用,netty使用的是Reactor模式,分为boss线程和worker线程,boss线程负责监听、分配事件,而worker线程负责处理事件
反应堆模式:http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html
-
dubbo基于netty的线程池模型做了一定的扩展
- iothreads:也就是netty中的线程(boss + worker)线程,默认是cpu核数+1(boss = 1,worker = cpu核数),一般不去修改
- 业务线程:专门用于处理业务逻辑的线程(默认dispatcher-all,全部派发给业务线程池),我们一般的互联网应用都是io密集型应用,默认这样子就ok了
- server端:默认使用fixed线程池,大小200
- client端:默认使用cached线程池,最大Integer.MAX_VALUE
- 队列:
SynchronousQueue
,此队列不是一般的队列,而是只有一个元素,相当于一个点,就相当于没有队列,这样子设计是有好处的,调用繁忙时直接抛出异常以便重新调用其他服务
-
在dubbo应用中,我们所谓的配置线程池一般指的是配置业务线程池,在
2.7.8
版本中,SpringBoot风格的配置有如下:dubbo.consumer.threadpool=默认cached dubbo.consumer.threads=默认0~Integer.MAX_VALUE dubbo.protocol.threadname= dubbo.protocol.threadpool=默认fixed dubbo.protocol.threads=默认200 dubbo.protocol.iothreads=一般使用默认 dubbo.provider.threadname= dubbo.provider.threadpool=默认fixed dubbo.provider.threads=默认200 dubbo.provider.iothreads=一般使用默认
-
消费方:使用dubbo.consumer(因为消费方是被tomcat监听请求,然后直接使用业务线程进行处理,所以并没有iothreads的配置)
-
提供方:使用dubbo.provider或者dubbo.protocol均可,dubbo.protocol优先级高
-
既是消费方又是提供方:综合上述二者即可
-
总结:dubbo.protocol和dubbo.provider均可为provider设置,二选一即可,改善之后就是如下配置(只留下重点配置):
dubbo.consumer.threads=默认0~Integer.MAX_VALUE dubbo.provider.threads=默认200
-
建议配置,根据机器环境性能指定一个consumer.threads,避免被Integer.MAX_VALUE撑爆,设置一个合适的provider.threads,比如:
dubbo.consumer.threads=100(业务逻辑较少,主要是组合数据,性能比较高,可以少一点线程) dubbo.provider.threads=500(io密集型,需要处理业务逻辑,性能相对较差,可以多配置一点线程)
-
完
-