Akka學習筆記(六):消息傳遞可靠性
Akka學習筆記(六):消息傳遞可靠性
一般規則
關於消息發送,有兩條基本規則:
- 最多一次,即不保證消息傳遞可靠性
- message ordering per sender–receiver pair
消息傳遞機製
- 最多一次,意味消息有可能丟失
- 最少一次,保證消息傳遞可靠,但可能冗餘
- 保證隻成功一次,性能最差,消息成功傳遞,不冗餘
為什麼不保證傳遞可靠性
問題是,我們要保證消息傳遞在什麼環節可靠:
- 消息已經發到網絡上了?
- 消息被遠程主機接收到了?
- 消息已經在接收者actor的郵箱裏了?
- 目標actor是否能處理這個消息?
- 消息在目標actor上開始處理了?
- 消息在目標actor上已經處理完畢了?
上麵每一條都有不同的挑戰和成本。為什麼不需要那麼可靠?查看這篇文章
Akka擁抱分布式計算和分布式網絡,並通過消息傳遞來明確實現它,因此它不說謊,而是模擬一個有漏洞的抽象方式。這是在Erlang中取得了重大成功的模型,並要求用戶基於此為應用建模。你可以閱讀Erlang 文檔(10.9, 10.10)了解更多。Akka與它非常相似。
底線:你是一個開發者,知道你的應用中需要提供哪些保證,那麼你可以飛快又可靠地使用專門的ACK和RETRY來實現(如果你真的需要,大多數情況你並不需要)。使用Akka的Durable郵箱會有幫助。
消息次序
Actor A1 發送消息 M1, M2, M3 給 A2 Actor A3 發送消息 M4, M5, M6 給 A2
意味著:
- 如果 M1 被投遞了,那麼它一定在 M2 和 M3之前被投遞
- 如果 M2 被投遞了,那麼它一定在 M3之前被投遞
- 如果 M4 被投遞了,那麼它一定在 M5 and M6之前被投遞
- 如果 M5 被投遞了,那麼它一定在 M6之前被投遞
- A2 收到 A1 的消息會與收到的 A3的消息交織在一起
- 因為沒有投遞保證,所以可能會“沒有”,或有“一些”,或“全部”消息到達 A2
最後更新:2017-04-03 05:39:44