【问题标题】:How to handle client response during Transient Exception retrying?如何在瞬态异常重试期间处理客户端响应?
【发布时间】:2019-12-25 05:32:48
【问题描述】:

上下文

我正在开发一个 REST API,正如您所料,它由多个外部跨网络服务、API 和数据库提供支持。很可能在任何时候都会遇到暂时性故障,并且应该重试该操作。我的问题是,在重试操作期间,我的 API 应该如何响应客户端?

假设一个客户端正在发布一个资源,而我的服务器在尝试写入数据库时​​遇到了一个暂时的异常。使用重试模式可能与断路器模式的组合,我的服务器端代码应该尝试重试操作,遵循随机线性/指数回退实现。客户显然会在那段时间等待,这不是我们想要的。

问题

客户端在哪里适合重试操作?

  1. 我是否应该在 JSON 响应中提供 isTransient: true 指示符并让客户端重试?
  2. 我是否应该将重试留给服务器并以指示服务器正在主动重试请求的消息和状态代码进行响应,然后让客户端轮询更新?在这种情况下,您将如何确定轮询间隔而不会使服务器超载?或者,服务器是否应该通过 Web 套接字进行响应,以便客户端无需轮询?
  3. 如果在重试操作期间出现意外的服务器崩溃,会发生什么情况?显然,当服务器恢复时,它不会“记住”它正在重试操作的事实,除非该事实在某个地方持续存在。我想这是一个非关键问题,如果我尝试解决它只会导致进一步不必要的复杂性。

我可能想多了这个问题,但是虽然有很多关于实现瞬态异常重试逻辑的文档,但我很少遇到讨论如何在此期间让客户端“挂起”的资源。

注意:我知道有人问过类似的问题,但我的问题更具体,因为我对客户端适合给定重试的不同选项特别感兴趣操作,客户​​端在这些情况下应如何反应,以及如果发生中断重试序列的崩溃会发生什么。

非常感谢。

【问题讨论】:

    标签: rest http exception response transient-failure


    【解决方案1】:

    有一些重试规则:

    • 始终创建幂等键以了解有重试操作。
    • 如果您的操作很复杂,并且您想用重试包装休息调用,您必须确保对于重复的请求不会产生副作用(从失败点开始并且不执行成功代码)。

    就我个人而言,我认为客户端不应该知道你重试了某事,当然isTransient: true 不应该作为资源的一部分。

    警告:在添加重试策略之前,您必须检查副作用,将重试策略放在任何地方都是不好的做法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 2017-08-27
      • 2020-11-26
      • 2019-07-27
      • 2015-04-26
      • 1970-01-01
      • 2018-03-25
      • 2012-11-17
      相关资源
      最近更新 更多