前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dubbo 消费者(consumer)线程模型及2.7.1版本问题

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

作者头像
MickyInvQ
发布2021-03-02 15:19:07
7670
发布2021-03-02 15:19:07
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏

背景

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 消费端何时设置的线程池?
  • 缓存线程池有何问题?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档