Rest 如何在暂时异常重试期间处理客户端响应?

Rest 如何在暂时异常重试期间处理客户端响应?,rest,http,exception,response,transient-failure,Rest,Http,Exception,Response,Transient Failure,上下文 我正在开发一个RESTAPI,正如您所期望的,它由多个外部跨网络服务、API和数据库支持。很有可能在任何点遇到瞬时故障,因此应重试该操作。我的问题是,在重试操作期间,我的API应该如何响应客户端 假设客户机正在发布资源,而我的服务器在尝试写入数据库时遇到暂时异常。使用重试模式(可能是断路器模式)的组合,我的服务器端代码应该尝试在随机线性/指数退避实现之后重试该操作。客户显然会在这段时间等待,这不是我们想要的 问题 客户机在重试操作中的位置 我是否应该在JSON响应中提供一个isTrans

上下文

我正在开发一个RESTAPI,正如您所期望的,它由多个外部跨网络服务、API和数据库支持。很有可能在任何点遇到瞬时故障,因此应重试该操作。我的问题是,在重试操作期间,我的API应该如何响应客户端

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

问题

客户机在重试操作中的位置

  • 我是否应该在JSON响应中提供一个
    isTransient:true
    指示符,让客户端重试
  • 我是否应该将重试留给服务器,并用一条消息和状态代码进行响应,指示服务器正在积极重试请求,然后让客户端轮询更新?在这种情况下,如何在不使服务器过载的情况下确定轮询间隔?或者,服务器是否应该通过web套接字响应,这样客户端就不需要轮询
  • 如果在重试操作期间出现意外的服务器崩溃,会发生什么情况?显然,当服务器恢复时,它不会“记住”它正在重试某个操作的事实,除非该事实在某个地方被持久化。我认为这是一个非关键问题,如果我试图解决它,它只会导致更多不必要的复杂性
  • 我可能已经考虑过这个问题了,但是尽管有很多关于实现瞬时异常重试逻辑的文档,但我很少遇到讨论如何在这段时间内让客户机处于“挂起”状态的资源

    注意:我意识到有人问过类似的问题,但我的问题更具体,因为我特别感兴趣的是客户端在给定重试操作中的位置、客户端在这些情况下应该如何反应,以及如果发生中断重试序列的崩溃会发生什么


    非常感谢。

    重试有一些规则:

    • 始终创建幂等键以了解存在重试操作
    • 如果您的操作很复杂,并且希望用retry包装rest调用,则必须确保对于重复的请求不会产生任何副作用(从失败点开始,不要执行成功代码)
    就我个人而言,我认为客户机不应该知道您重试了什么,当然,
    isTransient:true
    不应该作为资源的一部分

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