Dubbo線程池

Dubbo線程池

  1. dubbo底層是基於netty4進行的網絡調用,netty使用的是Reactor模式,分爲boss線程和worker線程,boss線程負責監聽、分配事件,而worker線程負責處理事件

反應堆模式:http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html

  1. dubbo基於netty的線程池模型做了一定的擴展

    1. iothreads:也就是netty中的線程(boss + worker)線程,默認是cpu核數+1(boss = 1,worker = cpu核數),一般不去修改
    2. 業務線程:專門用於處理業務邏輯的線程(默認dispatcher-all,全部派發給業務線程池),我們一般的互聯網應用都是io密集型應用,默認這樣子就ok了
      1. server端:默認使用fixed線程池,大小200
      2. client端:默認使用cached線程池,最大Integer.MAX_VALUE
    3. 隊列:SynchronousQueue,此隊列不是一般的隊列,而是隻有一個元素,相當於一個點,就相當於沒有隊列,這樣子設計是有好處的,調用繁忙時直接拋出異常以便重新調用其他服務
  2. 在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=一般使用默認
    
    1. 消費方:使用dubbo.consumer(因爲消費方是被tomcat監聽請求,然後直接使用業務線程進行處理,所以並沒有iothreads的配置)

    2. 提供方:使用dubbo.provider或者dubbo.protocol均可,dubbo.protocol優先級高

    3. 既是消費方又是提供方:綜合上述二者即可

    4. 總結:dubbo.protocol和dubbo.provider均可爲provider設置,二選一即可,改善之後就是如下配置(只留下重點配置):

      dubbo.consumer.threads=默認0~Integer.MAX_VALUE
      dubbo.provider.threads=默認200
      
    5. 建議配置,根據機器環境性能指定一個consumer.threads,避免被Integer.MAX_VALUE撐爆,設置一個合適的provider.threads,比如:

      dubbo.consumer.threads=100(業務邏輯較少,主要是組合數據,性能比較高,可以少一點線程)
      dubbo.provider.threads=500(io密集型,需要處理業務邏輯,性能相對較差,可以多配置一點線程)
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章