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