线程池

说明

线程池用于执行同步模式的业务逻辑。网络收发及reactive模式的业务逻辑在Eventloop中执行,与线程池无关

默认所有同步方法都在一个全局内置线程池中执行如果业务有特殊的需求,可以指定使用自定义的全局线程池,并且可以根据schemaId或operationId指定各自使用独立的线程池,实现隔离仓的效果

定制线程池

  • 实现线程池下面的方法任选其一即可
    • 实现java.util.concurrent.Executor接口为了支持优雅退出,如果内部线程未设置为daemon线程,则还需要实现java.io.Closeable接口,负责销毁线程池
    • 实现java.util.concurrent.ExecutorService接口
  • 将实现的线程池声明为spring bean
  • 启用线程池假设新线程池bean id为custom-executor
    • 替换全局线程池servicecomb.executors.default: custom-executor
    • 指定schema专用的线程池servicecomb.executors.Provider.${schemaId}: custom-executor
    • 指定operation专用的线程池servicecomb.executors.Provider.${schemaId}.${operationId}: custom-executor

ServiceComb内置线程池

一般的线程池都是所有线程共享一个任务队列,在这种情况下,所有网络线程需要向同一个队列申请请求入队,线程池中的所有线程需要从同一个队列中抢任务执行,对于高吞吐的场景,这会导致竞争冲突,形成性能瓶颈所以,为了提升性能,ServiceComb内置线程池实际是真正线程池的包装,允许在其内部配置多组线程池,且每个网络线程绑定一组线程池,以减小竞争冲突 线程池  - 图1

  • 1.2.0之前的版本

    配置项默认值含义
    servicecomb.executor.default.group2创建几组线程池
    servicecomb.executor.default.thread-per-groupCPU数每组线程池的线程数
  • 大于等于1.2.0的版本

    配置项默认值含义
    servicecomb.executor.default.group2创建几组线程池
    servicecomb.executor.default.thread-per-group100每组线程池的最大线程数Deprecated,新名字:maxThreads-per-group
    servicecomb.executor.default.coreThreads-per-group25每组线程池的最小线程数线程不会预创建,而是已经创建后,只有大于这个值的线程,才会因idle而销毁
    servicecomb.executor.default.maxThreads-per-group100每组线程池的最大线程数
    servicecomb.executor.default.maxIdleSecond-per-group60每组线程池中超过coreThreads-per-group的线程,如果idle超时,则会销毁该线程
    servicecomb.executor.default.maxQueueSize-per-groupInteger.MAX_VALUE每组线程池中任务队列的最大长度