我曾经在akka框架的帮助下用Java编写了一个多人游戏。通过他们的“至少一次”交付,我一直想知道如果所有akka
参与者都在同一个本地jvm中运行,在哪种情况下会丢失一条消息。
游戏的设计就像一个巨型状态机(因为事件需要按顺序进行处理),因此在大多数情况下,所有参与者之间只有一条消息在路上。 (可以在Parralel中运行多个会话)
我已经读过,参与者在本地运行时的通信是在内存中完成的。因此,如果不考虑内存不足的错误,那么消息丢失的其他(最好是可还原的)场景是吗?
注意: 消息框的操作也不是我想要的。只是在合法的情况下出现了问题而消息却真的丢失了。
答案 0 :(得分:0)
我已经读过,参与者在本地运行时的通信是在内存中完成的。因此,如果不考虑内存不足的错误,那么消息丢失的其他(最好是可还原的)场景是吗?
因此,通常在内存中传递是正确的,但是您还指定了您在谈论“至少一次传递”功能。而文档(https://doc.akka.io/docs/akka/current/persistence.html#at-least-once-delivery)专门讨论了至少一次如何改变许多正常行为。具体来说,至少一次使用持久性来跟踪已发送的内容和已确认的内容。
因此,当您至少使用一次时,发送消息时必须进行一次完整的舞蹈。首先,必须存储该消息,以便如果发送方失败,则该工作可以在其他地方恢复。其次,必须发送消息。第三,任何响应都必须与发送的消息相关联,并且回执必须持久,以便在此之后如果参与者失败,则恢复参与者知道不必重试该消息。
因此,在任何情况下都不应丢失消息。即使JVM丢失了。 (即使所有的JVM都丢失了。)毕竟,这是“至少一次”的要点,可以保证消息可以传递(并回复)。但是,请注意,这确实需要权衡。 (尽管有一个明显的问题就是性能,但请参考文档中的权衡问题。)