【问题标题】:At-least-once delivery using Akka Persistence and the Extra-Cameo pattern使用 Akka Persistence 和 Extra-Cameo 模式的至少一次交付
【发布时间】:2018-06-20 10:40:06
【问题描述】:

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

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

实现了 Cameo 模式来处理来自 SK 演员的响应。

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

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

非常感谢

【问题讨论】:

    标签: akka akka-persistence reliable-message-delivery


    【解决方案1】:

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

    我试着总结一下 Jamie 所说的话。

    为了至少一次可靠,使用 Akka Cluster 和 Persistence 来完成它是可能的,但可能有点矫枉过正。我说尽量保持简单。拥有请求的 GUID,并将其与请求一起发送到三个 SK。

    在不可变账本场景中,您会偶尔扫描账本以通过 GUID 清除重复数据。数据需要的一致性将决定这一点。

    简单性将更容易维护并避免部分故障。您可以通过以下几种方式之一在 SK 端处理幂等性:在通过过期缓存处理请求时跟踪所有 GUID,或者将具有不可变更新的 GUID 存储在分类帐中。

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

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

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

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

    正如杰米所说:

    我认为 ACK 必须是调用者的责任,一直到原始请求的发送者。这是最安全、最简单的方法。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      相关资源
      最近更新 更多