Dubbo剖析-线程模型
  TEZNKK3IfmPf 2023年11月15日 36 0

一、前言

Dubbo默认的底层网络通讯是使用Netty来做的,在服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客户端的链接请求,并把接受的请求分发给EventLoopGroup(worker)来处理,boss和worker线程组我们称为IO线程。

如果服务提供方的逻辑能迅速完成,并且不会发起新的 IO 请求,则直接在 IO 线程上处理更快,因为这减少了线程池调度。

但如果处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到新线程池,否则 IO 线程阻塞,将导致不能接收其它请求。

二、Dubbo提供的线程模型

  • all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等,模型如下图

Dubbo剖析-线程模型

  • direct 所有消息都不派发到线程池,全部在 IO 线程上直接执行,模型如下图
    Dubbo剖析-线程模型

  • execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行,模型如下图
    Dubbo剖析-线程模型

  • connection 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
    Dubbo剖析-线程模型

其中ThreadPool的spi实现有如下:

  • fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)

  • cached 缓存线程池,空闲一分钟自动删除,需要时重建。

  • limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。

    三、总结

dubbo提供了常用的线程模型和线程池扩展各有利弊,如果您有定制化需要,可以按照spi规范进行定制。

Dubbo剖析-线程模型

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月15日   33   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   36   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   19   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   21   0   0 多线程同步
TEZNKK3IfmPf