专栏首页Java编程技术Dubbo线程模型与线程池策略

Dubbo线程模型与线程池策略

一、Dubbo的线程模型概述

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

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

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

根据请求的消息类被 IO 线程处理还是被业务线程池处理,Dubbo 提供了下面几种线程模型:

  • all:(AllDispatcher 类) 所有消息都派发到业务线程池,这些消息包括请求、响应、连接事件,断开事件,心跳等,这种线程模型如下图7.1.1:

image.png

图7.1.1

  • direct:(DirectDispatcher 类)所有消息都不派发到业务线程池,全部在 IO 线程上直接执行,模型如下图图7.1.2:

image.png

图7.1.2

  • message:(MessageOnlyDispatcher)只有请求响应消息派发到业务线程池,其它连接断开事件、心跳等消息,直接在 IO 线程上执行,模型图如下图7.1.3:

image.png

图7.1.3

  • execution:(ExecutionDispatcher 类) 只把请求类消息派发到业务线程池处理,但是响应和其它连接断开事件,心跳等消息直接在 IO 线程上执行,模型如下图图7.1.4:

image.png

图7.1.4

  • connection:(ConnectionOrderedDispatcher类) 在 IO 线程上将连接、断开事件放入队列,有序逐个执行,其它消息派发到业务线程池处理,模型如下图图7.1.5:

image.png

图7.1.5

Dubbo中线程模型的扩展接口为Dispatcher,其提供的上述扩展实现都实现了该接口,其中all模型是默认的线程模型。

二、Dubbo的线程池策略概述

上面我们讲解dubbo线程模型时候提到为了尽量早的释放Netty的IO线程,某些线程模型会把请求投递到线程池进行异步处理,那么这里所谓的线程池是什么样的线程池那?其实这里的线程池ThreadPool也是一个扩展接口SPI,Dubbo提供了该扩展接口的一些实现,具体实现如下:

  • FixedThreadPool:创建一个复用固定个数线程的线程池。
  • LimitedThreadPool:创建一个线程池,这个线程池中线程个数随着需要量动态增加,但是数量不超过配置的阈值的个数,另外空闲线程不会被回收,会一直存在。
  • EagerThreadPool :创建一个线程池,这个线程池当所有核心线程都处于忙碌状态时候,创建新的线程来执行新任务,而不是把任务放入线程池阻塞队列。
  • CachedThreadPool: 创建一个自适应线程池,当线程处于空闲1分钟时候,线程会被回收,当有新请求到来时候会创建新线程

三、总结

Dubbo框架提供了几种常见的线程模型以及实现原理和线程池策略,当业务需要定制线程池策略或者线程模型时候,可以基于SPI接口进行定制。本章摘录自《深度剖析Apache Dubbo核心技术内幕》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java中守护线程与用户线程

    Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程是一个用户线程,这个...

    加多
  • Leader-Follower线程模型概述

    IO线程模型一直在演化,由最开始的单线程模型,到BIO方式的单线程接受请求线程池线程具体处理单个请求的读写事件,再到NIO的单线程接受请求线程池里面的单个线程可...

    加多
  • 使用线程池时候当程序结束时候记得调用shutdown关闭线程池

    日常开发中为了便于线程的有效复用,线程池是经常会被用的工具,然而线程池使用完后如果不调用shutdown会导致线程池资源一直不会被释放。下面通过简单例子来说明该...

    加多
  • 多线程编程10个例子--2

    // TODO: Add extra initialization here m_ctrlProgress.SetRange(0,99); m_nMilliSe...

    李海彬
  • 多线程?怎么用?

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

    故里
  • 读书笔记《Java并发编程的艺术 - 方腾飞》- Java并发编程

    在Java中, 我们可以通过 priority 属性来设置线程的优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认的优先级为 5

    lvgo
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • java学习笔记(基础篇)—线程

    线程是程序执行的最小单位,是动态的。 进程是系统进程资源分配和系统调度的最小单位,是动态的。 线程和进程的目的:多任务--->效率高

    chlinlearn
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟

扫码关注云+社区

领取腾讯云代金券