我曾經在 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
提交
取消