语境
我正在开发一个 REST API,正如您所料,它由多个外部跨网络服务、API 和数据库支持。很可能在任何时候都会遇到暂时性故障,并且应该重试该操作。我的问题是,在重试操作期间,我的 API 应该如何响应客户端?
假设客户端正在发布资源,而我的服务器在尝试写入数据库时遇到了暂时性异常。使用重试模式可能与断路器模式的组合,我的服务器端代码应该尝试重试操作,遵循随机线性/指数回退实现。客户显然会在那段时间等待,这不是我们想要的。
问题
客户端在哪里适合重试操作?
- 我是否应该
isTransient: true
在 JSON 响应中提供一个指示符并让客户端重试? - 我是否应该将重试留给服务器并以指示服务器正在主动重试请求的消息和状态代码进行响应,然后让客户端轮询更新?在这种情况下,您将如何确定轮询间隔而不会使服务器过载?或者,服务器是否应该通过 Web 套接字进行响应,以便客户端不需要轮询?
- 如果在重试操作期间出现意外的服务器崩溃,会发生什么?显然,当服务器恢复时,它不会“记住”它正在重试操作的事实,除非该事实在某个地方持续存在。我想这是一个非关键问题,如果我试图解决它只会导致进一步不必要的复杂性。
我可能过度思考了这个问题,但是虽然有很多关于实现瞬态异常重试逻辑的文档,但我很少遇到讨论如何在这段时间内让客户端“挂起”的资源。
注意:我意识到已经提出了类似的问题,但我的查询更具体,因为我对客户端适合给定重试操作的不同选项特别感兴趣,客户端在这些情况下应该如何反应,以及什么如果发生中断重试序列的崩溃,就会发生这种情况。
非常感谢。