我们有一个akka/scala应用程序,它有一些天真的错误处理,我需要修复。
REST端点与进行远程调用以创建订单的内部参与者进行通信。
它使用ask来实现这一点,当ask超时时,例如由于网络或通信错误,我们通过REST端点向客户端发送一条消息,表明请求失败。
问题是内部参与者有自己的排队/重试逻辑,它将继续调用远程接口,直到请求成功。
因此,我们会遇到这样的情况:我们已经告诉客户请求失败了,但它实际上只是在排队(通常最终会成功(。客户重新提交了请求,我们最终收到了100份重复订单。
我的问题是:当询问请求超时时,akka是否支持一种通用的方式来回滚或毒害询问消息?
有几种方法可以采用。两者都不是通用的,因为(尤其是在涉及网络通信的情况下(在这一领域做出的任何选择都会在某些情况下对业务逻辑来说都是错误的:
-
如果订单中有一些内容可以用来确定两个提交的订单实际上是相同的(例如,客户端提供的相关性ID(,则可以在actor中使用该内容来承载处理早期订单的排队/重试逻辑。这需要对客户端可见的API进行一些更改。
-
还可以在消息中包含一个停止重试并忽略(如果在该时间字段之后从队列中提取(;您可以根据请求超时时间设置此时间。