1. 程式人生 > >[從原始碼學設計]螞蟻金服SOFARegistry網路操作之連線管理

[從原始碼學設計]螞蟻金服SOFARegistry網路操作之連線管理

# [從原始碼學設計]螞蟻金服SOFARegistry網路操作之連線管理 [toc] ## 0x00 摘要 SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。 本系列文章重點在於分析設計和架構,即利用多篇文章,從多個角度反推總結 DataServer 或者 SOFARegistry 的實現機制和架構思路,讓大家藉以學習阿里如何設計。 本文為第三篇,介紹SOFARegistry網路操作之連線管理。 ## 0x01 業務領域 上文我們講解了SOFARegistry的網路封裝和操作,本文繼續網路相關部分。 雖然SOFABolt底層已經做了連線管理,比如有Manager,pool,但是SOFARegistry在上層結合業務也做了連線管理,很有特色,所以我們專文講解。 ### 1.1 應用場景 這裡我們集中從DataServer角度出發講解,此處和業務緊密結合。 讓我們大致想想DataServer需要管理哪些連線或者類似概念。 - MetaServer Connection:本DataServer與Meta Server的連線,用來和Meta Server互動; - DataServer Connection:本DataServer與其他dataServer的連線,用來資料同步; - 擴充套件開來,其他Data Server節點也需要管理; - SessionServer Connection,本DataServer與Session server的連線,這個非常複雜,這裡會重點講解; - 在SessionServer方面,又需要區分具體每個Publisher; 這就讓我們來思考幾個問題: - 究竟什麼可以唯一標示一個SessionServer? - 什麼可以唯一標示一個Publisher?ip : port?或者其他? - 業務上有沒有特殊考慮的需要? 具體我們在後文會詳述阿里的思路。 ## 0x02 管理內容 ### 2.1 連線管理 首先講講普遍意義的連線管理。 連線管理是網路操作中的核心。我們知道,一次 tcp 請求大致分為三個步驟:建立連線、通訊、關閉連線。每次建立新連線都會經歷三次握手,中間包含三次網路傳輸,對於高併發的系統,這是一筆不小的負擔;關閉連線同樣如此。為了減少每次網路呼叫請求的開銷,對連線進行管理、複用,可以極大的提高系統的效能。 為了提高通訊效率,我們需要考慮複用連線,減少 TCP 三次握手的次數,因此需要有連線管理的機制。 關於連線管理,SOFARegistry有兩維度層次的連線管理,分別是 Connection 和 Node。 ### 2.2 管理內容 普遍意義的連線管理,通常需要處理: - 連線建立與銷燬 - 心跳管理 - 空閒連線管理 - 斷線重連 - 慢連線處理 - 作為一個框架,當然還需要把各種連線事件分派給使用者進行定製 因為SOFABolt底層已經做了底層連線管理,所以SOFARegistry只要做頂層部分連線管理即可,就是從業務角度區分儲存連線。 ## 0x03 Connection管理 ### 3.1 Connection物件 這裡說的Connection我們特指**sofa-bolt的Connection物件**
`com.alipay.remoting.Connection`。前文提到,SOFARegistry把sofa-bolt的Connection物件直接暴露出來。 面向連線的TCP協議要求每次peer間通訊前建立一條TCP連線,該連線可抽象為一個4元組(four-tuple,有時也稱socket pair):`socket(localIp, localPort, remoteIp, remotePort )`,這4個元素唯一地代表一條TCP連線。 在Netty中用Channel來表示一條TCP連線,在sofa-bolt使用Connection物件來抽象一個連線,一個連線在client跟server端各用一個connection物件表示
。 有了Connection這個抽象之後,自然的需要提供介面來管理Connection, 這個介面就是ConnectionFactory。 那麼Connection是如何跟Netty進行聯動呢。我們知道在Netty中,client連線到server後,server會回撥`initChannel`方法,在這個方法我們會初始化各種事件handler,sofa-bolt就在這裡建立Connection,並在Netty的Channel物件上打上Connection標,後續通過Channel就可以直接找到這個Connection。 ### 3.2 Connection類定義 Connection其刪減版定義如下,可以看到其主要成員就是 Netty channel 例項
: ```java public class Connection { private Channel channel; private final Concurren