1 概要说明
我们在关闭或重启dubbo服务时往往会出现请求超时而导致pv lost。
2 原因分析
- 关闭dubbo服务:部分请求未处理完被直接关闭;
- 启动dubbo服务:服务刚启动完毕就瞬间涌入大量流量,而此时的服务吞吐能力有限,服务处理不过来而导致请求超时,因为服务往往有一个慢热的过程。深层原因分析:服务一般会使用各种连接池,而刚启动的服务各种资源连接数有限,如果此时服务瞬间涌入大量流量,则会花较多的时间去创建新的资源连接)。
3 解决之道
dubbo为我们提供了优雅停机
3.1 使用方式
- 对于通过dubbo Main方式启动dubbo容器的,只需在启动前添加java环境变量-Ddubbo.shutdown.hook=true即可。
- 对于tomcat等web容器方式启动dubbo的,需要在关闭时执行方法ProtocolConfig.destroyAll();
3.2 注意事项:
- kill -9 默认对于dubbo Main方式启动的,优雅停机不生效
- 对于tomcat等web容器方式启动,注意tomcat等容器关闭等待超时时长(tomcat默认为等待5s)应大于等于dubbo优雅停机等待超时时长(dubbo默认为10s)
- 针对刚启动dubbo服务吞吐能力有限场景,dubbo2.6.2版本增强了优雅停机,可以考虑升级dubbo至2.6.2版本以上。