在用户使用文档中,给出了很简单的线程模型图,在读源码的过程中,实际上客户端除了用户线程也会有一个线程池(线程名字为“DubboClientHandler-”,默认是cache线程池),在服务端也会有io线程(boss线程,worker线程),还有一个服务线程池(线程名字为“DubboServerHandler-”,默认是fixed线程池)。希望官方能够给出一个完整的请求响应(包括同步和异步)的线程调用图,这个对于用户对dubbo的使用很重要,谢谢!!!
Q
[apache/dubbo]希望在文档中可以给出详细一些的线程模型图
8
A
回答
9
很好的提议,我们在下一步完善文档的过程中会考虑细化这部分内容
8
6
Hello, well done! Can you please send a pull request to https://github.com/apache/incubator-dubbo-docs ?
4
ok, I send a pull request https://github.com/apache/incubator-dubbo-docs/pull/30
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动态创建的,查找源代码需要些技巧。
9
这个地方的consumer基于SPI动态创建的,应该只会有一个吧。