Gateway、Feign 和下游各自有超时,到底谁说了算?客户端超时之后下游会被取消吗?为什么客户端看到的是 500 不是 504?重试叠加以后一个请求会变成几个?这篇用三个服务把时间线逐个量出来。
[Gateway 3s < Feign 5s < B 4s?] 客户端看到 HTTP 504,耗时 3.1 秒;B 一共被请求 1 次(开始时刻 [0.1] 秒);B 的结束 [('B 结束(写出响应)', 4.1)];A 的日志 [('开始', 0.1), ('结束', 4.1)]客户端拿 504,下游照样跑完。
[Feign 2s < Gateway 3s < B] 客户端看到 HTTP 500,耗时 2.2 秒;B 一共被请求 1 次(开始时刻 [0.2] 秒);B 的结束 [('B 结束(写出响应)', 4.2)];A 的日志 [('开始', 0.2), ('失败', 2.2), ('结束', 2.2)]谁先超时客户端看到谁的错误。
[Feign 重试 5 次 × 1s] 客户端看到 HTTP 504,耗时 5.1 秒;B 一共被请求 5 次(开始时刻 [0.1, 1.3, 2.5, 3.8, 5.3] 秒);B 的结束 [('B 结束(写出响应)', 3.1), ('B 结束(写出响应)', 4.3), ('B 结束(写出响应)', 5.5), ('B 结束(写出响应)', 6.8), ('B 结束(写出响应)', 8.4)];A 的日志 [('开始', 0.1), ('失败', 6.3), ('结束', 6.4)]总预算 = 单次超时 × 重试次数。
[Gateway Retry 2 次] 客户端看到 HTTP 500,耗时 6.3 秒;B 一共被请求 3 次(开始时刻 [0.1, 2.2, 4.2] 秒);B 的结束 [('B 结束(写出响应)', 4.1), ('B 结束(写出响应)', 6.2), ('B 结束(写出响应)', 8.2)];A 的日志 [('开始', 0.1), ('失败', 2.1), ('结束', 2.1), ('开始', 2.2), ('失败', 4.2), ('结束', 4.2), ('开始', 4.2), ('失败', 6.2), ('结束', 6.2)]每一层的重试次数相乘。