0

语境

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

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

问题

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

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

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

注意:我意识到已经提出了类似的问题,但我的查询更具体,因为我对客户端适合给定重试操作的不同选项特别感兴趣,客户端在这些情况下应该如何反应,以及什么如果发生中断重试序列的崩溃,就会发生这种情况。

非常感谢。

4

1 回答 1

0

重试有一些规则:

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

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

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

于 2019-12-25T09:18:04.533 回答