閱讀584 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Akka學習筆記(六):消息傳遞可靠性


Akka學習筆記(六):消息傳遞可靠性

一般規則

關於消息發送,有兩條基本規則:

  • 最多一次,即不保證消息傳遞可靠性
  • message ordering per sender–receiver pair

消息傳遞機製

  • 最多一次,意味消息有可能丟失
  • 最少一次,保證消息傳遞可靠,但可能冗餘
  • 保證隻成功一次,性能最差,消息成功傳遞,不冗餘

為什麼不保證傳遞可靠性

問題是,我們要保證消息傳遞在什麼環節可靠:

  1. 消息已經發到網絡上了?
  2. 消息被遠程主機接收到了?
  3. 消息已經在接收者actor的郵箱裏了?
  4. 目標actor是否能處理這個消息?
  5. 消息在目標actor上開始處理了?
  6. 消息在目標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

意味著:

  1. 如果 M1 被投遞了,那麼它一定在 M2 和 M3之前被投遞
  2. 如果 M2 被投遞了,那麼它一定在 M3之前被投遞
  3. 如果 M4 被投遞了,那麼它一定在 M5 and M6之前被投遞
  4. 如果 M5 被投遞了,那麼它一定在 M6之前被投遞
  5. A2 收到 A1 的消息會與收到的 A3的消息交織在一起
  6. 因為沒有投遞保證,所以可能會“沒有”,或有“一些”,或“全部”消息到達 A2

最後更新:2017-04-03 05:39:44

  上一篇:go Akka學習筆記(七):配置
  下一篇:go System.BadImageFormatException: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。