22.业务侧共享线程池还是隔离线程池区别与实现分析

接下来两篇文章要讨论下线程隔离的问题,有两个维度:

  1. 一个节点上多个provider之间的隔离。即下图的4 5 6线程是否要隔离在不同的线程池。
  2. 一个节点上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;
}

非共享的取决于配置了何种线程池。