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密集型,需要處理業務邏輯,性能相對較差,可以多配置一點線程)
-
完
-