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密集型,需要处理业务逻辑,性能相对较差,可以多配置一点线程)
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章