参数配置优先级

dubbo中的配置存在优先级,不考虑优先级的话,很有可能出现调优参数设置了却没生效的问题。

dubbo分为consumer和provider端,在配置各个参数时,其优先级如下:

  1. consumer的method配置 
  2. provider的method配置
  3. consumer的reference配置
  4. provider的service配置
  5. consumer的consumer节点配置
  6. provider的provider节点配置

方法级的配置优先级高于接口级,consumer的优先级高于provider。

参数调优

参数名

作用范围

默认值

说明

备注

threads

provider

200

业务处理线程池大小

 

threadspool

provider

fixed

线程池类型,其值可以是 fixed、cached、limited、eager

fixed 线程池启动时就创建了固定大小的线程数,不做伸缩。 
cached 表示线程池是可伸缩的,线程空闲时间达到阈值时会被回收。 

limited 可伸缩线程池,但池中的线程数只会增长不会收缩,为了避免收缩时突然来了大流量引起的性能问题。
eager 优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。

dispatcher

provider

All

一般可以选message只有请求响应消息派发到线程池,其它连接断开事件、心跳等消息,直接在IO线程上执行

设置成message不会存在Provider线程池满了,Consumer却还在等待的情况,因为默认IO线程池是无界的,一定会有线程来处理异常和应答,减少在Provider线程池打满时整个系统雪崩的风险。

iothreads

provider

CPU+1

io线程池大小

 

queues

provider

0

线程池队列大小,当线程池满时,排队等待执行的队列大小,

建议不要设置,当线程程池时应立即失败,重试其它服务提供机器。

 

connections

consumer

0

对每个提供者的最大连接数,

rmi、http、hessian等短连接协议表示限制连接数,

Dubbo等长连接协表示建立的长连接个数

Dubbo协议默认共享一个长连接

actives

consumer

0

每服务消费者每服务每方法最大并发调用数

0表示不限制

acceptes

provider

0

服务提供方最大可接受连接数

0表示不限制

executes

provider

0

服务提供者每服务每方法最大可并行执行请求数

0表示不限制

 

 参数在dubbo流程中应用

  1. consumer发起一个请求时,首先经过active limit(参数actives消费端最大并发调用数)进行方法级别的限制,如果超过actives则等待有其他请求完成后重试或者超时后失败。
  2. 从多个连接(connections)中选择一个连接发送数据,对于默认的netty实现来说,由于可以复用连接,默认一个连接就可以。线上业务由于有多个consumer多个provider,因此不建议增加connections参数。
  3. 连接到达provider时(如dubbo的初次连接),首先会判断总连接数是否超限(acceps),超过限制连接将被拒绝。
  4. 连接成功后,具体的请求交给io thread处理。io threads虽然是处理数据的读写,但io部分为异步,更多的消耗的是cpu,因此iothreads默认cpu个数+1是比较合理的设置,不建议调整此参数。
  5. 数据读取并反序列化以后,交给业务线程池处理,默认情况下线程池为fixed,且排队队列为0(queues),这种情况下,最大并发等于业务线程池大小(threads),如果希望有请求的堆积能力,可以调整queues参数。如果希望快速失败由其他节点处理(官方推荐方式),则不修改queues,只调整threads。
  6. execute limit(参数executes)是方法级别的并发限制,原理与actives类似,只是少了等待的过程,即受限后立即失败。
  7. tps,控制指定时间内(默认60s)的请求数。注意目前dubbo默认没有支持该参数,需要加一个META-INF/dubbo/com.alibaba.dubbo.rpc.Filter文件,文件内容为:tps=com.alibaba.dubbo.rpc.filter.TpsLimitFilter