使用 Akka Persistence 和 Extra-Cameo 模式进行至少一次交付

At-least-once delivery using Akka Persistence and the Extra-Cameo pattern

我正在开发一个使用 Akka 的应用程序,其中的 Actors 旨在避免请求-响应模式。使用 Extra 或 Cameo 模式可以将参与者之间的交互建模为 "stream" 消息。

下图总结了此类actors的架构。

实施 Cameo 模式是为了处理来自 SK 个参与者的响应。

现在,假设我想保证 at-least-once 语义在 SFSK actors 之间。我怎样才能做到这一点?使用 Akka 持久性实现 ato 语义需要在这些参与者之间实现请求-响应模式。

如何确保使用 Cameo 处理响应的演员之间 至少一次 语义?

非常感谢

Jamie Allen 在 Twitter 上帮我回答了这个问题。推特对话是 this.

我试着总结 Jamie 所说的讨论。

For reliable at-least-once, using Akka Cluster and Persistence to get it done is possible, but probably overkill. I say try to keep it simple. Have a GUID for the request, and send it with the request to the three SKs.

In the immutable ledger scenario, you'd then occasionally sweep the ledger to get rid of dups by GUID. How consistent that data needs to be will define that.

Simplicity is going to be a lot easier to maintain & avoid partial failures. You can handle idempotency on the SK side one of a few ways: either track all GUIDs when the requests are processed via an expiring cache, or store the GUIDs with the immutable updates in a ledger.

因此,在这种情况下,更好的解决方案是完全删除 Akka Persistence 并将问题减少到良好的旧消息传递。

SFSKs 演员发送消息,Cameo 节点等待 SKs 响应。如果此类反应没有在预定的 window 时间内到达,Cameo 节点会使用超时消息发出警报 SFSF 再次向 SKs 演员重新发送消息。

表示上述解决方案的图表如下。

标有数字 5 的红色消息模拟超时消息。

正如杰米所说:

I think ACK has to be the responsibility of the caller, all the way back to the sender of the original request. That’s the safest & simplest approach.

希望对您有所帮助。