既然删除了耐用邮箱,如何恢复 Akka Actors 中的消息?

How to recover messages in Akka Actors now that Durable Mailboxes are removed?

当我注意到持久邮箱现在已从 Akka 中删除时,我正在使用最新版本的 Akka。

我需要确保我的消息在崩溃后重新启动时恢复。在没有持久邮箱或其他人的自定义实现的情况下,是否有另一种工作方式。

我也尝试过 Akka Persistence,但它会重播消息,我不想在发生崩溃时发送相同的消息两次,因为所有消息的执行成本都很高。

Akka Persistence 重播根据收到的命令创建的事件。事件是在验证后从命令消息生成的,不应创建无效的参与者状态。

这意味着不需要重播最初收到的消息(命令),但您可以保留事件,这些事件在崩溃后用于重建 actor 的状态时成本更低。另外你可以使用snapshots直接恢复状态。

编辑: 正如我在评论中提到的那样,确实只有演员的状态被持久化并在崩溃中幸存下来。此状态仅反映已使用的消息,而不反映仍驻留在参与者邮箱中的消息。

然而,与其将消息推送到一个 actor,然后将其存储在持久邮箱中,另一种选择可能是 'recipient' 从一个持久性 actor 中提取消息,该 actor 将消息列表存储为他的一部分状态。

UntypedPersistentActorWithAtLeastOnceDelivery 作为 akka 持久性的一部分提供了另一种可能性,发件人负责持久消息。

我意识到这些不能 drop-in 替代持久邮箱,因为它们需要重新考虑系统。到目前为止,从消费者那里拉取工作对我来说很有效。最初我们还考虑了消息队列产品(具有持久队列的 RabbitMQ),但由于我们最初的工作项目来自数据库,我们可以在没有持久消息的情况下处理 akka 崩溃。

虽然这不完全是与 Akka Actors 一起工作的解决方案,但它确实解决了这里的原始问题。

我认为与其在这里使用 Akka,不如将 Kafka 之类的东西与 akka/reactive-kafka.

之类的反应流一起使用是一个更好的主意

这样的系统非常适合持久化,并提供非常好的语义来在崩溃时保留消息队列。这比将消息存储在某个地方待处理要好得多,而且通常性能更好。

它不一定是 Kafka,但可以插入反应流的任何后端(Akka 的实现或其他)。