dubbo 消费者(consumer)线程模型及2.7.1版本问题

2021-03-02 15:19:07 浏览数 (1)

背景

2.7.1的dubbo,默认情况下,消费者在接收返回消息时,会将消息指定到all的Dispatcher中,然后将消息丢入线程池等待调度处理,消费者接收消息使用的线程池默认是cached(缓存线程池),此时会存在两个问题:

线程池创建过多; 线程池线程数无限制; 第一个问题是因为dubbo的线程模型中,线程池的个数与客户端引用的服务个数,服务提供者的数量,connections都有关,总的来说消费者与提供者建立一条连接,则消费者创建一个线程池处理返回消息,即:

消费方线程池个数 = Reference服务1的提供者数量 * connections Reference服务2的提供者数量 * connections ……

注意:这只是线程池的个数,实际线程数量与线程池的threads数量有关. 若服务1和服务2存在相同地址的服务提供者,则线程池只创建一个

第二个问题是因为缓存线程池的默认最大线程数为2147483647(Integer的最大值,约21亿)。这两个问题最终都可能会导致创建过多线程,进而引发性能问题。

消费端何时设置的线程池?

在初始化NettyClient时,若用户在未指定threadpool参数时,会指定默认线程池为cached。

这里添加线程池的默认值为cached 。添加线程池后的url会在后续的handler中使用。

缓存线程池有何问题?

默认情况下,最大线程数为Integer的最大值,故而导致在请求集中一个时间点返回的情况下,创建过多的线程进而引发性能问题。

源码NettyServer、AllChannelHandler、WrappedChannelHandler

2.7.3以上官方已经修复,没这个问题了

0 人点赞