具有持久邮箱的 Akka 无状态 Actor

Arc*_*hie 3 actor akka akka-cluster akka-persistence

我想创建一个包含 1000 个 actor 的 Akka 集群。每个参与者接收一条消息,进行一些计算并将结果写入专用的 Kafka 主题。

它应该部署在集群中,例如 Kubernetes。

我的理解是 - 如果 actor 因任何原因被终止(JVM 崩溃、重新部署或其他任何原因),那么其邮箱的内容 - 以及当前正在处理的消息 - 都会丢失!

这对我来说是完全不可接受的,因此我想实现一种拥有持久邮箱的方法。请注意,参与者本身是无状态的,他们不需要重播消息或重建状态。我所需要的只是在演员被终止时不丢失消息。

问题是:推荐的方法是什么? 他们在这里这里建议实施持久参与者。但就像我说的,我不需要坚持并恢复演员的任何状态。我是否应该实现基于持久存储(如 SQL 数据库)的自定义邮箱?

我还看到Akka之前的某个版本支持“耐用”邮箱,这似乎正是我所需要的。但由于某种原因,他们删除了它,这令人困惑......

Dav*_*ren 6

针对此类需求的建议是在客户端上使用持久参与者。我理解您的意思是您的接收参与者不需要持久性/有状态性,但是通过在客户端上使用持久性,您可以在接收参与者终止时重试,或者使用开箱即用的保证消息传递功能来确保其得到处理。本质上,持久性用于(在客户端)保存所发出的请求,以便客户可以在必要时重新发送消息以“重建邮箱”。

使用客户端持久性是:

  • 比持久邮箱性能更高
  • 防止更多故障场景(例如在网络层丢失的消息、应用程序逻辑故障)
  • 更加灵活,支持更多类型的恢复(例如:只需要恢复部分消息的场景)

这就是为什么持久性邮箱从 Akka 中被删除:Akka 持久性/保证至少一次交付本质上是比持久性邮箱在所有方面都更好的解决方案。

stikkos 使用 Kafka 的答案也是可行的。我只是担心引入 Kafka 会增加很多复杂性。当然,任何持久性存储都会增加复杂性,所以我想这仅取决于您已经拥有的内容。