Apache Dubbo系列:Dubbo线程模型

本文深入解析了Dubbo的线程模型,包括All、Direct、MessageOnly、Execution和ConnectionOrdered五种模型,分析了它们的处理方式和应用场景。重点讨论了各种模型下事件如何在I/O线程和业务线程池之间分派,以及如何通过自定义线程模型来适应不同的服务处理需求。
摘要由CSDN通过智能技术生成

导读

我们都知道,Dubbo使用默认的网络传输框架是Netty,服务提供方NettyServer使用两个NIO线程池EventLoopGroup(boss)和EventLoopGroup(worker),前者负责接收客户端的连接,并分发给后者处理。我们把这两个线程组成为I/O线程(或Netty线程)。

 

如果服务提供方能快速处理客户端的请求,那么直接在I/O线程(Netty线程)上处理比较合适。否则(如查DB、请求三方接口等),需要将客户端的请求,分派(Dispatcher)给业务线程池(Dubbo线程池),我们称之为I/O线程与业务线程分离。

 

如果大家对Reactor或Netty的线程模型不够熟悉的话,推荐阅读深入理解Netty线程模型

下面的内容,我为大家深入讲解Dubbo线程模型与线程池策略等相关内容,通过本章内容,大家可以学到如下知识点:

  • Dubbo线程模型分类

  • Dubbo线程模型源码分析

  • Dubbo线程模型的确认时机

  • 如何自定义线程模型

Dubbo线程模型分类

Dubbo提供了如下几种线程模型:

1、all(Dubbo默认),对应于AllDispatcher类,该线程模型表示,所有的消息事件都分派给业务线程池,包括请求响应、连接事件、断开连接事件、心跳事件等。

2、direct,对应于DirectDispatcher类,该线程模型表示,所有消息事件都不派发到业务线程池,全部在I/O线程池上处理。

3、message,对应于MessageOnlyDispatcher类,该线程模型表示,只有请求和响应事件分派给业务线程池,其他的事件如连接事件、心跳事件等,直接在I/O线程池中处理。

4、execution,对应于ExecutionDispatcher类,该线程模型表示,只把请求事件分派给业务线程池,其他事件如心跳、连接、响应等直接在I/O线程池中执行

5、connection,对应于ConnectionOrderedDispatcher类,该线程模型表示,将连接事件、断开连接事件等放入一个队列有序等I/O线程池执行,其他类型事件直接分派给业务线程池执行。

 

Dubbo线程模型源码分析

首先,我们看一下Dispatcher接口,这个接口是所有线程模型需要实现的接口,代码如下

@SPI(AllDispatcher.NAME)
public interface Dispatcher {
    @Adaptive({Constants.DISPATCHER_KEY, "dispather", "channel.handler"})
    ChannelHandler dispatch(ChannelHandler handler, URL url);
}

我们可以看到,这个接口只有一个dispatch方法,并且是一个SPI的扩展点(如果大家对Dubbo的SPI机制不熟悉的话,请务必熟悉该机制,推荐阅读Apache Dubbo系列:增强SPI),并且默认的线程模型是all,即AllDispatcher类,接下来我们分析AllDispatcher类。


public class AllDispatcher implements Dispatcher {
    public static final String NAME = "all";
    @Override
    public ChannelHandler dispatch(ChannelHandler handler, URL url) {
        return new AllChannelHandler(handler, url);
    }
}

public class AllChannelHandler extends WrappedCh
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值