我正在开发一个使用Akka的应用程序,其中Actors旨在避免请求 - 响应模式。使用Extra或Cameo模式可以将actor之间的交互建模为消息的“流”。
下图总结了这些演员的架构。
实现Cameo模式以处理来自SK
actor的响应。
现在,想象一下,我想保证SF
和SK
个演员之间的 at-least-once 语义。我怎样才能做到这一点?使用Akka持久性实现 ato 语义需要在这些actor之间实现请求 - 响应模式。
如何确保使用Cameo处理响应的actor之间的 at-least-once 语义?
非常感谢
答案 0 :(得分:0)
Jamie Allen帮助我在Twitter上回答这个问题。 Twitter对话是this。
我试着总结杰米所说的讨论。
对于至少可靠的至少一次,使用Akka Cluster和Persistence来完成它是可能的,但可能是矫枉过正。我说试着保持简单。拥有请求的GUID,并将请求发送给三个SK。
在不可变的分类帐场景中,您偶尔会扫描分类帐以通过GUID删除重复项。数据需要的一致性将定义这一点。
简单易于维护和维护避免部分失败。您可以通过以下几种方式之一处理SK端的幂等性:通过过期缓存处理请求时跟踪所有GUID,或者将不可变更新的GUID存储在分类帐中。
因此,在这种情况下,更好的解决方案是完全删除Akka Persistence并将问题减少到良好的旧消息传递。
SF
向SK
个演员发送消息,Cameo节点等待SK
个响应。如果此类反应未在预定的时间窗口内到达,则Cameo节点使用超时消息警告SF
。 SF
再次向SKs演员重新发送消息。
代表上述解决方案的图表如下。
红色的消息,标有数字5,模拟超时消息。
正如杰米所说:
我认为ACK必须是调用者的责任,一直回到原始请求的发送者。这是最安全的&最简单的方法。
希望它有所帮助。