上一题下一题

微服务调用链路中某个服务响应变慢引发线程池堆积,如何设置超时、重试和熔断策略

旗舰版
来源:meituan初级工程师重试预算服务隔离熔断降级超时重试策略
答案解析

这个问题我一般会从“避免请求无限等待”和“避免故障扩散”两个角度处理,核心是超时、重试、熔断要配合使用,不能单独看。

在超时设置上,不能只设置一个全局超时,而是要按调用链路拆分超时预算。比如用户请求整体 SLA 是 2 秒,那网关、服务 A、服务 B、数据库或下游 RPC 都要有明确的超时时间,不能让某个下游服务一直占住线程。一般 RPC/HTTP 客户端要设置连接超时、读超时、写超时,线程池队列也要设置上限,避免请求堆积导致内存和线程耗尽。

比如:

超时时间不能拍脑袋,一般会参考下游接口的 TP95、TP99,再结合业务可接受的延迟来定。如果接口平时 TP99 是 100ms,超时可以设置到 300ms 或 500ms;如果设置太短,会误伤正常请求;设置太长,又会导致线程长期阻塞。

重试策略要非常谨慎。重试不是越多越好,因为下游已经慢了,如果上游大量重试,反而会把下游打得更慢,形成重试风暴。一般只对临时性错误做重试,比如网络抖动、连接

登录后查看完整内容