我的服务是DService,我是服务链中的第四个链接,即调用流程为:在线用户-> AService-> BService-> CService-> DService-> EService。
当我从DService调用EService时,它可能会抛出可重试的异常,如HttpTimeoutException。我通常会重试2-3次,如果即使在2-3次重试后仍然失败,则会抛出异常。
我的问题是,我向CService抛出的异常应该是可重试还是不可重试?请查看以下两个选项的优缺点:
从DService抛出可重试异常的缺点 - 如果DService抛出可重试异常,按照同样的惯例,CService也可能会重试DService 2-3次,并且在每个C-D调用中,D将再次尝试2-3次EService调用。随着我们沿着调用链向上移动,最终到达EService的调用将呈指数增长。因此,如果EService网络确实长时间处于关闭状态,我们正在谈论大量不必要的调用。这可以通过为链中的每个调用设置超时来缓解,但不确定是否足以缓解不必要的调用次数。
从DService抛出可重试异常的优点 - CService将在一段时间后进行重试,因为在后续的重试中,我们可能会得到正确的值(在时间限制内) - 特别是如果客户端是某些后端作业,则它们可以指数级地重试很长时间,然后才放弃。抛出不可重试异常将淘汰这种选项
请提供您的意见和建议
谢谢, 哈里什