dubbo:protocol
threadpool 和 threads
threadpool 表示线程池类型。其值可以是 “fixed” 或 “cached”。默认值:fixed
fixed 表示线程池启动时就创建了固定大小的线程数,不做任何伸缩。
其创建原理与java内置的 Executors.newFixedThreadPool() 相同。
相关dubbo代码:com.alibaba.dubbo.common.threadpool.support.fixed.FixedThreadPool
cached 表示线程池是可伸缩的,线程空闲时间达到阈值时会被回收。这个阈值默认是1分钟。
其创建原理与java内置的 Executors.newCachedThreadPool() 相同。
相关dubbo代码:com.alibaba.dubbo.common.threadpool.support.cached.CachedThreadPool
对于刚开始性能调优的dubbo服务来说,“默认fixed线程池+200线程”的配置往往是最先需要优化的点。
一旦并发请求数超过200,就会出现异常“Thread pool is EXHAUSTED”。
另,线程池的类型选择也应遵循具体业务场景。
如果请求频繁,cached 意义也不会很大,因为线程根本没有空闲后被回收的机会。
如果请求不频繁,fixed 类型的线程池中大量线程空闲在那也浪费资源
dispatcher
dispatcher 表示协议的消息派发模式。dubbo协议默认值为 “all”。(dubbo服务默认采用dubbo协议)
一般可以选“message”,即只有请求响应消息派发到线程池,其它连接断开事件、心跳等消息,直接在IO线程上执行。
dubbo:service
timeout
Dubbo服务支持在服务端和客户端配置服务调用超时时间。它们的默认值都是1000毫秒。
如果服务端和客户端都配置了 timeout,则以客户端的配置为准。
通常,除非客户端业务规则明确规定超时时间,不会在客户端配置 timeout。所以服务端的 timeout 配置很关键。
timeout 与具体业务和服务部署方式与环境的关系很大,需要根据实际测试数据调整。
对于负载稍高的服务,默认的1000毫秒超时时间,确实容易引发 TimeoutException。
如果服务传输的数据量较大,调用耗时也会非常可观。