基本原理
SOFARegistry 即服務注冊中心。下面詳細介紹 SOFARegistry 的原理。
SOFARegistry 組成
SOFARegistry 即服務注冊中心。其包含的 4 個組件及其職責為:
客戶端(Client):提供應用接入服務注冊中心的基本 API 能力,可以是訂閱方,也可以是發(fā)布方。
會話服務器(SessionServer):主要是跟客戶端建立連接,并作為一個中間層將發(fā)布數(shù)據(jù)轉(zhuǎn)發(fā)至 DataServer 存儲。
數(shù)據(jù)服務器(DataServer):負責存儲客戶端發(fā)布的數(shù)據(jù)。支持多副本存儲,保證高可用,并支持海量客戶端。
元數(shù)據(jù)服務器(MetaServer):主要維護集群的一致列表,保證高可用和一致性。
說明引入這三個角色的目的為:
SessionServer 與 DataServer 的分離是為了同時突破連接數(shù)和存儲的瓶頸。
引入 MetaServer 是為了運維簡單化。因為角色的多樣化讓服務注冊中心有狀態(tài),使用 MetaServer 管理這些元數(shù)據(jù),就無需引入第三方組件管理這些元數(shù)據(jù),MetaServer 能夠感知到 session 和 data 的狀態(tài),而無需 session 內(nèi)部或者 data 內(nèi)部自感知,讓架構(gòu)更加清晰。
SOFARegistry 架構(gòu)圖
SOFARegistry 交互圖
單次服務注冊過程
單次服務注冊的主要步驟為:
Client 發(fā)布端向 SessionServer 發(fā)送待發(fā)布數(shù)據(jù) dataPub。
SessionServer 接收到 dataPub 數(shù)據(jù)后,進行下述操作:
首先寫入內(nèi)存:用于后續(xù)可以跟 DataServer 做定期檢查。
然后將數(shù)據(jù) dataPub 發(fā)送給 DataServer。
DataServer 接收到 dataPub 數(shù)據(jù)后,進行下述操作:
將數(shù)據(jù)寫入內(nèi)存:DataServer 將從 SessionServer 收到的所有待發(fā)布數(shù)據(jù)匯總為 dataInfoId。
將數(shù)據(jù)同步給副本:DataServer 在一致性 hash 分片的基礎上,對每個分片保存了多個副本(默認是 3 個副本)。
將數(shù)據(jù)變更事件通知給所有 SessionServer,事件內(nèi)容是:
id:
<dataInfoId>
版本號信息:
<version>
SessionServer 接收到變更事件通知后,對比 SessionServer 內(nèi)存中存儲的 dataInfoId 的 version,發(fā)現(xiàn)比 DataServer 發(fā)過來的小,所以主動向 DataServer 獲取 dataInfoId 中待發(fā)布的數(shù)據(jù),即獲取具體的 dataPub 列表。
SessionServer 獲取到 dataInfoId 中待發(fā)布的數(shù)據(jù)后,將數(shù)據(jù)推送給相應的 Client 訂閱端,Client 訂閱端就接收到這一次服務注冊之后的最新待發(fā)布的 dataPub 列表數(shù)據(jù)。
單次服務訂閱過程
單次服務訂閱的主要步驟為:
Client 訂閱端向 SessionServer 發(fā)起訂閱請求 subReq。subReq 主要包含 dataInfoId,表示需要訂閱哪個 dataInfoId 的數(shù)據(jù)。
SessionServer 接收到訂閱請求 subReq 后,進行下述操作:
首先將訂閱請求 subReq 寫入內(nèi)存:發(fā)送過來的 subReq 數(shù)據(jù),SessionServer 都會存儲到內(nèi)存,用于實現(xiàn)數(shù)據(jù)變更推送的功能。
然后嘗試從緩存里獲取相應 dataInfoId 中的待發(fā)布數(shù)據(jù)。根據(jù)緩存中是否有此數(shù)據(jù),做出下一步行動:
若無,則向 DataServer 發(fā)起請求,獲取相應數(shù)據(jù)。
若有,則直接返回相應數(shù)據(jù)。
SessionServer 從 DataServer 中獲取到 dataInfoId 中的待發(fā)布數(shù)據(jù)。
SessionServer 將獲取到的數(shù)據(jù)發(fā)送給 Client 訂閱端。