我的服务是 DService,我是服务链中的第四个环节,即调用流程是 Online User -> AService -> BService -> CService -> DService -> EService。
当我从 DService 调用 EService 时,它会抛出像 HttpTimeoutException 这样的可重试异常。我通常重试 2-3 次,如果即使在 2-3 次重试后仍然失败,我也会抛出异常。
我的问题是,我向 CService 抛出的异常应该是可重试的还是不可重试的?请在下面找到我对这两种选择的优缺点的评估
从 DService 抛出可重试异常的缺点 - 如果 DService 抛出可重试异常,按照相同的约定,CService 也可能重试 DService 2-3 次,并且在每次 CD 调用中,D 将再次尝试 2-3 次 E 服务调用。同样,随着我们在调用链上的上升,最终对 EService 的调用将成倍增加。因此,如果 EService 网络确实长时间停机,我们正在谈论大量不必要的呼叫。这可以通过为链中的每个调用设置超时来缓解,但仍然不确定这是否足以缓解不必要的调用次数。
从 DService 抛出可重试异常的优点 - CService 将在某个时间后重试,因为在随后的重试中我们可能会得到正确的值(在时间限制内) - 特别是如果客户端是一些后端作业,那么他们可以在放弃之前以指数方式重试很长时间. 抛出 Un-Retriable 异常会清除此选项
请就此提出您的看法和建议
谢谢, 哈里什