我曾经在 akka 框架的帮助下用 java 编写了一个多人游戏。通过他们的“至少一次”交付,我一直想知道如果所有akka参与者都在同一个本地 jvm 中运行,在哪些情况下消息会丢失。游戏的设计就像一个巨大的状态机(因为事件需要按顺序处理),所以大多数时候只有一条消息在所有相关参与者之间传输。(可以并行运行多个会话)我读过,在本地运行时,演员的交流是在内存中完成的。因此,不考虑内存不足错误,他们的其他(最好是可重现的)场景是消息实际上丢失的地方吗?注意:消息框操作也不是我想要的。只是出现问题并且消息确实丢失的合法情况。
1 回答
长风秋雁
TA贡献1757条经验 获得超7个赞
我读过,在本地运行时,演员的交流是在内存中完成的。因此,不考虑内存不足错误,他们的其他(最好是可重现的)场景是消息实际上丢失的地方吗?
因此,通常内存中交付是正确的,但您还指定您正在谈论“至少一次交付”功能。文档 ( https://doc.akka.io/docs/akka/current/persistence.html#at-least-once-delivery ) 特别讨论了 at-least-once 如何改变很多正常行为。具体来说,至少一次使用持久性来跟踪已发送的内容和已确认的内容。
因此,当您使用 at-least-once 时,发送消息时必须进行完整的操作。首先,必须存储消息,以便在发送方失败时,该工作可以在其他地方恢复。其次,必须发送消息。第三,任何响应都必须与发送的消息相关联,并且收据持久存在,这样如果 actor 在该点之后失败,恢复的 actor 就知道不必重试该消息。
因此,应该不会出现消息丢失的情况。即使 JVM 丢失。(即使所有 JVM 都丢失了。)这毕竟是“至少一次”的要点,可以保证消息被传递(并回复)。但是,请注意,这确实需要权衡。(有关权衡,请参阅文档,尽管一个明显的因素是性能。)
添加回答
举报
0/150
提交
取消