22.业务侧共享线程池还是隔离线程池区别与实现分析
接下来两篇文章要讨论下线程隔离的问题,有两个维度:
- 一个节点上多个provider之间的隔离。即下图的4 5 6线程是否要隔离在不同的线程池。
- 一个节点上io线程与server handler线程的隔离。即下图的1与4(或者2和5,3和6)是否在同一个线程上执行。
I/O server hadnler
+--------------+ +---------------+
| | | |
+--------> +-------+ +----------->+ +--------+ |
| thread 1 | | thread 4 |
+--------> +-------+ +------------> +--------+ |
| thread 2 | | thread 5 |
+--------> +-------+ +----------->+ +--------+ |
| thread 3 | | thread 6 |
+--------------+ +---------------+
provider node 1
如果我们一个应用提供多个provider服务,那么我们就面临一个问题,当这些provider接到请求后进行处理时,是将这些请求都放到一个线程池中处理,还是可以隔离开?
dubbo支持隔离开的配置。
dubbo server handler线程池的共享与隔离的分析
线程池 分两种,一种是全局共享的,一种是Handler实例级别的。默认全局的。没有配置Handler实例级别就是共享的。
全局共享的是:
// WrappedChannelHandler
protected static final ExecutorService SHARED_EXECUTOR = Executors.newCachedThreadPool(new NamedThreadFactory("DubboSharedHandler", true));
// com.alibaba.dubbo.remoting.transport.dispatcher.WrappedChannelHandler.WrappedChannelHandler(ChannelHandler, URL)
// AllChannelHandler的父类是WrappedChannelHandler
executor = (ExecutorService) ExtensionLoader.getExtensionLoader(ThreadPool.class).getAdaptiveExtension().getExecutor(url);
到底是用全局共享的还是用实例级别的参见这里代码:
// com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.getExecutorService()
private ExecutorService getExecutorService() {
ExecutorService cexecutor = executor;
if (cexecutor == null || cexecutor.isShutdown()) {
cexecutor = SHARED_EXECUTOR;
}
return cexecutor;
}
非共享的取决于配置了何种线程池。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!