螞蟻金服通信框架SOFABolt解析 | 連接管理剖析

簡介: Scalable Open Financial Architecture是螞蟻金服自主研發的金融級分佈式中間件,包含了構建金融級雲原生架構所需的各個組件,是在金融場景裏錘鍊出來的最佳實踐。

Scalable Open Financial Architecture

是螞蟻金服自主研發的金融級分佈式中間件,包含了構建金融級雲原生架構所需的各個組件,是在金融場景裏錘鍊出來的最佳實踐。

本文爲《螞蟻金服通信框架 SOFABolt 解析》系列第四篇,作者任展。

《螞蟻金服通信框架 SOFABolt 解析》系列由 SOFA 團隊和源碼愛好者們出品。


SOFARPC: https://github.com/alipay/sofa-rpc

SOFABolt: https://github.com/alipay/sofa-bolt

image.png

前言

SOFABolt 是一款基於 Netty 最佳實踐,通用、高效、穩定的通信框架。目前已經運用在了螞蟻中間件的微服務,消息中心,分佈式事務,分佈式開關,配置中心等衆多產品上。

本文將重點分析 SOFABolt 的連接管理功能。

我們知道,一次 tcp 請求大致分爲三個步驟:建立連接、通信、關閉連接。每次建立新連接都會經歷三次握手,中間包含三次網絡傳輸,對於高併發的系統,這是一筆不小的負擔;關閉連接同樣如此。爲了減少每次網絡調用請求的開銷,對連接進行管理、複用,可以極大的提高系統的性能。

下面我們將介紹 SOFABolt 在連接管理的實現,包括連接生命週期管理、定時斷連及自動重連等。

設計抽象

首先我們將會介紹 SOFABolt 對連接的封裝抽象。

1、連接封裝
SOFABolt 中定義了一個基礎的連接類 -- Connection:

image.png

省去 AtributeKey 類型定義以及 Log 配置,以上是Connection中所有的成員變量。包括幾個方面:

連接:Channel、Url

版本:protocolCode、version

調用:invokeFutureMap

附着:attributes

引用:referenceCount、id2PoolKey、poolKeys

這裏提一下 protocolCode 和 version,版本信息會被攜帶至對端,用於連接的協商。總的來說,通過對於 Channel 的包裝,Connection 提供了豐富的上下文及引用信息,是 SOFABolt 連接管理的直接對象。

2、連接事件
SOFABolt 定義了連接事件和事件監聽器用於處理連接對象。ConnectionEventType 定義了三種事件類型:CONNECT, CLOSE 和 EXCEPTION. 針對不同的連接事件類型,我們可以通過事件監聽器 -- ConnectionEventListener 來進行處理,下面來看一下 ConnectionEventListener 類:

image.png

監聽器定義了兩個方法 onEvent 和 addConnectionEventProcessor, 分別是觸發事件和添加事件處理器。整個監聽器採用一個 HashMap 來存儲事件類型及其對應的處理器集合。在觸發相關連接事件後,會遍歷處理器集合並調用處理器執行。

SOFABolt 的連接管理集中在 ConnectionEventHandler 中處理,他繼承了 ChannelDuplexHandler,是標準的用來處理Connection連接對象並進行日誌打印的一個處理器。先來看一下成員組成:

undefined | leftimage.png
其中連接事件監聽器上文已經提及,剩下的幾個成員從名稱上也通俗易懂,先簡單介紹一下,後續會詳細地展開:

連接管理器:管理連接對象,包括創建、添加、刪除、檢查是否可用等等

連接事件監聽器:監聽連接事件的觸發,然後執行對應的邏輯

連接事件執行器:包裝後的線程池,用於異步觸發連接事件監聽器來處理對應的連接事件,值得一提的是,這個線程池只有一個線程。

重連管理器:顧名思義,管理重連的Url對象以及執行重連任務

全局開關:全局的設置,比如是否需要管理連接對象、是否需要執行重連任務等等

代碼中方法都比較簡單,大部分的處理邏輯圍繞 Connection 對象展開,主要是維護有關本 Channel 對象的 Connection 對象的生命週期(包括connect、close等事件)。下面着重分析兩個方法:

image.png

hannelInactive 方法是在連接斷開前觸發的方法,在 SOFABolt 裏的處理邏輯中,會根據globalSwitch 中 CONN_RECONNECT_SWITCH 的開關狀態來判定是否開啓重連的任務。除此之外,會在最後觸發該 Connection 對象的 CLOSE 事件。這個觸發事件是在異步線程中執行的,也就是上文提到的連接事件執行器。

另一個是 userEventTriggered 方法, 用來觸發自定義的用戶事件,通過查看本方法的調用位置,可以得知,該方法是在連接建立的最初被觸發的,一個簡單的例子可以在RpcServer類中找到:

image.png

在連接建立觸發 fireUserEventTriggered 方法後,我們就開始執行對應此方法中的邏輯,也可以看到,在判定是 CONNECT 事件後,通過attr得到綁定在Channel的Connection對象,然後就同
channelInactive 方法一樣,觸發 CONNECT 事件異步執行對應的處理器邏輯。

連接管理

下面來介紹 ConnectionManager,SOFABolt 提供了默認的實現類 DefaultConnectionManager類。顧名思義,主要負責連接對象的管理:

通過工廠創建 Connection 連接對象

通過注入的選擇策略進行 Connection 連接的選擇

管理創建和添加的 Connection 對象和 ConnectionPool 連接池對象(包括檢查 Connection 對象、維護 ConnectionPool 的健壯性)

控制 Connection 對象的心跳打開與關閉

1、創建連接
ConnectionFactory 用於創建連接對象,SOFABolt 提供了兩個實現類: DefaultConnectionFactory 和 RpcConnectionFactory。這個工廠類執行了客戶端所有 Connection 對象的創建工作,代碼也比較簡單:

image.png

注意到了嗎,在創建完畢 Connection 對象後,執行了 fireUserEventTriggered 方法,這樣就保證了每一個 Connection 對象在創建之後都會去觸發 CONNECT 事件。

2、選擇連接
ConnectionSelectStrategy 選擇策略的默認實現是隨機策略 RandomSelectStrategy, 在執行選擇連接時大致分爲兩步:

在開啓CONN_MONITOR_SWITCH監控時,會從該連接池所有的連接中做一個簡單的filter操作,把CONN_SERVICE_STATUS爲ON的連接挑選出來,作爲選擇池。如果沒有開啓監控,那麼選擇池就是連接池。

執行挑選策略,獲取選擇池中的一個連接。

想看完整文章內容:點擊這裏

原文出處:阿里雲大學開發者社區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章