背景
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以上官方已经修复,没这个问题了