【问题标题】:Scenario's for loseing messages with akka when all actors run in the same jvm当所有 actor 在同一个 jvm 中运行时使用 akka 丢失消息的场景
【发布时间】:2019-05-25 20:51:00
【问题描述】:

我曾经在 akka 框架的帮助下用 java 编写了一个多人游戏。通过他们的“至少一次”传递,我一直想知道如果所有 akka 演员都在同一个本地 jvm 中运行,那么在哪种情况下消息会丢失。

游戏的设计就像一个巨大的状态机(因为事件需要按顺序处理),所以大多数时候只有一条消息在所有相关参与者之间传递。 (可以并行运行多个会话)

我已经读到,在本地运行时,actor 的通信是在内存中完成的。所以不考虑内存不足错误,他们的其他(最好是可重复的)场景是消息实际丢失的地方吗?

注意: 消息框操作也不是我想要的。只是出现问题并且消息确实丢失的合法案例。

【问题讨论】:

    标签: java akka


    【解决方案1】:

    我已经读到,在本地运行时,actor 的通信是在内存中完成的。所以不考虑内存不足错误,他们的其他(最好是可重复的)场景是消息实际丢失的地方吗?

    因此,通常内存中传递是正确的,但您还指定您正在谈论“至少一次传递”功能。文档(https://doc.akka.io/docs/akka/current/persistence.html#at-least-once-delivery)专门讨论了 at-least-once 如何改变很多正常行为。具体来说,at-least-once 使用持久性来跟踪已发送的内容和已确认的内容。

    因此,当您使用 at-least-once 时,发送消息时必须进行整个舞蹈。首先,必须存储消息,以便如果发送参与者失败,该工作可以在其他地方恢复。其次,必须发送消息。第三,任何响应都必须与发送的消息相关联,并且接收保持不变,以便如果参与者在此之后失败,恢复的参与者知道不必重试消息。

    因此,不应该有消息丢失的情况。即使 JVM 丢失。 (即使所有 JVM 都丢失了。)毕竟这是“至少一次”的重点,即保证消息被传递(并回复)。但是,请注意,这确实需要权衡。 (有关权衡,请参阅文档,尽管一个明显的问题是性能。)

    【讨论】:

    • 感谢您的回答。据我了解,只有第二部分“必须发送消息”(包括重新发送的)是由 akka 完成的,其余的我需要实现。 ------ 另一方面:您是否知道“最多一次”交付的场景?所以这是一个额外的问题 - 所以我可以打开另一个问题。
    • 不,akka 会为您完成所有关于保证交付的工作。 (好吧,如果你实现了所需的 API,它就可以了。)我需要稍微整理一下我的答案,我写得很快,我掩盖了“舞蹈”的一些细节。但这都在我链接的文档中。
    • 也许我只是误解了文档。第 2 段(使用您提供的链接时)声明“...... AtLeastOnceDelivery traitAbstractPersistentActorWithAtLeastOnceDelivery 类本身不会保留任何内容。您有责任坚持发送消息并已收到确认的意图。”
    • 关于您关于“最多一次”的问题,几乎所有场景都可以更好地使用“最多一次”。将您指向有关该主题的 Akka 文档可能是最简单的:doc.akka.io/docs/akka/current/general/…
    • 关于对文档的误解,我确实说过“如果您实现 API”。如果持久化状态(表示消息已发送)、处理恢复(包括存储和防止过载)、处理重试、关联 DeliveryId 等,Akka 会完成工作,但您将必须实现以下方法updateState、receiveCommand 等
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2015-05-29
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多