[apache/dubbo]希望在文档中可以给出详细一些的线程模型图

2024-04-11 411 views
8

在用户使用文档中,给出了很简单的线程模型图,在读源码的过程中,实际上客户端除了用户线程也会有一个线程池(线程名字为“DubboClientHandler-”,默认是cache线程池),在服务端也会有io线程(boss线程,worker线程),还有一个服务线程池(线程名字为“DubboServerHandler-”,默认是fixed线程池)。希望官方能够给出一个完整的请求响应(包括同步和异步)的线程调用图,这个对于用户对dubbo的使用很重要,谢谢!!!

回答

9

很好的提议,我们在下一步完善文档的过程中会考虑细化这部分内容

8

image

6

消费者线程池数据模型比想象的还要复杂,我们将线程池的核心池数(corethreads)0调整为40,同时某提供者服务配置了connections=50,结果消费者线程数DubboClientHandler-*-thread-*直接达到了15000+个,报OutOfMemoryError: unable to create new native thread异常。 @zhaojigang

简版的Dubbo消费者线程池数据模型

消费者线程池模型:
1、共享连接(connections=0)场景
    简版数据结构:<host:port, CachedThreadPool(corePoolSize)>
    线程池数量:sum(host:port)
    线程池数量示例:假设提供者节点有6个,则消费者应用会创建6个CachedThreadPool实例
2、每服务每连接(connections>0)场景
    简版数据结构:ExchangeClient[connections]<service-host:port, CachedThreadPool(corePoolSize)>
    线程池数量:sum(host:port * connections)
    线程池数量示例:假设提供者节点有6个,且某个服务配置了`connections=50`,则消费者应用对于这个服务会创建6*50=300个CachedThreadPool实例
提供者线程池模型:
1、全局使用一个线程池实例

即使核心池数(corethreads)为0,当消费者应用依赖的服务提供者处理很慢时且请求并发量比较大时,也会出现消费者线程数很多问题。

9

@edwardlee03 请问消费者一侧有线程池吗? 我只看到 DubboInvoker 中有一个固定的 ExchangerClient池。

3

@JerryChin 有的,在NettyClient父类AbstractClient里定义了ExecutorService executor,是基于SPI动态创建的,查找源代码需要些技巧。

image

9

这个地方的consumer基于SPI动态创建的,应该只会有一个吧。