Akka 请求超时

Akka ask timeouts

我们有一个 akka/scala 应用程序,它有一些我需要修复的天真编写的错误处理。

REST 端点与进行远程调用以创建订单的内部参与者通信。

它使用询问来执行此操作,并且当询问超时时,例如由于网络或通信错误,我们通过 REST 端点向客户端发送请求失败的消息。

问题是内部actor有自己的queuing/retry逻辑,会一直调用远程接口,直到请求成功。

所以我们有这样的情况,我们已经告诉客户请求失败了,但它实际上只是在排队(并且通常最终会成功)。客户重新提交请求,我们最终得到了 100 个重复订单。

我的问题是:akka 是否支持在询问请求超时时回滚或中毒询问消息的通用方法?

有两种方法可供选择。两者都不是通用的,因为(特别是一旦涉及网络通信)在这个领域做出的任何选择在某些情况下对于业务逻辑来说是完全错误的:

  • 如果有一些关于订单的东西可以用来确定两个提交的订单实际上是相同的(例如,客户端提供的相关 ID),可以在 actor 中使用它来搭载queuing/retry 处理较早订单的逻辑。这需要一些客户端可见的 API 更改。

  • 如果在消息中的这个时间字段之后从队列中拉出,也可以包括停止重试和忽略;您可以根据询问超时时间设置此时间。