Akka原始碼分析 Remote 網路鏈結生命週期

2022-03-06 13:16:15 字數 1082 閱讀 6549

remote模式下,網路鏈結的生命週期往往影響著對應actor的生命週期,那麼網路鏈結的生命週期是怎麼樣的呢?

每乙個與遠端系統的鏈路都是四個狀態之一:空閒、活躍、被守護、被隔離。遠端系統的某個位址沒有任何通訊之前其關聯狀態就是idle(空閒)。當第一條訊息試圖傳送給遠端系統或入站鏈結被接受,鏈路的狀態就被轉化為active(活躍),這也意味著兩個系統有訊息的接收或者傳送,而且目前為止也沒有發生任何失敗。當乙個通訊失敗,或者兩個系統間的鏈結丟失,鏈路的狀態就會變成gated(被守護)。在被守護狀態,系統不會試圖去鏈結遠端系統主機,所有出站訊息都會被丟棄。鏈路處於gated狀態的時間是通過akka.remote.retry-gate-closed-for引數控制的,當超過這個時間,鏈路狀態會重新轉化成idle(空閒)。gate 是單邊的,這也就意味著這期間無論何時當遠端系統的入站鏈結被接受,都會被自動轉化成active(活躍)狀態,通訊被立即重用。當通訊失敗,且無法恢復時,由於參與系統的狀態不一致,遠端系統就會變成quarantined(被隔離)狀態。與gate不同,被隔離是永久的,它會一直持續到其中乙個系統被重啟。重啟之後,通訊可以被重新恢復,鏈路狀態重新變成active(活躍)。

其實remote的鏈路狀態也比較容易理解,當沒有建立連線時,就處於空閒狀態;有入站鏈結請求或訊息傳送時,如果連線建立成功,則變成活躍狀態;活躍狀態時,如果發生通訊失敗且不是致命錯誤,比如網路中斷,就會轉到被守護狀態;被守護狀態下,在指定時間內,如果網路正常,且收到了成功的入站鏈結請求,則重新恢復到活躍狀態,若超過指定守護時間則轉化到空閒狀態;在活躍狀態下,如果發生災難性、不可恢復的錯誤,比如系統訊息傳遞失敗或收到memberremoved事件,則該鏈路被隔離,直到遠端系統重啟後,收到成功的入站或出站鏈結,則重新轉換到活躍狀態。

被守護、被隔離都是應對網路故障的,但分別對應可恢復和不可恢復。被守護期間還有一定的時間閾值,該閾值內還有機會程式設計活躍狀態。

lifecycle-and-failure-recovery-model:

Akka原始碼分析 ask模式

在我之前的博文中,已經介紹過要慎用actor的ask。這裡我們要分析一下ask的原始碼,看看它究竟是怎麼實現的。開發時,如果要使用ask方法,必須要引入akka.pattern.這樣才能使用ask 或者?方法,那麼想必ask是在akka.pattern.對應的包裡面實現的。implementatio...

pomelo原始碼解析之元件Remote

首先提出問題 1.元件remote是什麼?2.remote的作用是什麼?remote模組是遠端通訊模組服務端監聽模組,作用是作為各個模組間通訊物件的存在。變數中儲存.return paths var paths var role master server should not come here ...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...