技術文檔丨Cyber RT拓撲發現介紹

本文做者:Apollo開發者社區服務器

拓撲結構是指網絡中各個站點相互鏈接的形式,在局域網中明確一點講就是文件服務器、工做站和電纜等的鏈接形式。網絡的拓撲結構反映出網絡中各實體的結構關係,是建設計算機網絡的第一步,是實現各類網絡協議的基礎,它對網絡的性能,系統的可靠性與通訊費用都有重大影響。網絡

 

在P2P網絡通訊中,咱們須要解決的兩個首要問題就是——和誰進行通訊以及如何進行通訊。無論通訊方式是選擇TCP仍是UDP,咱們都須要獲取對端的一些標識,如IP和端口號等,從而創建鏈接。函數

 

本次將介紹第一點的解決方式:參與者的標識和參與者的互相發現。性能

 

  如下,ENJOY  學習

 

拓撲的概念

 

在Cyber RT中,咱們將主要通訊角色(Role)分爲:spa

 

  1. Node。計算機網絡

  2. Reader/Writer。設計

  3. Server/Client。指針

 

每一個角色使用RoleAttributes進行標識。其中,Reader/Writer以及Server/Client都是在Node中建立的,Reader和Writer能夠經過Channel進行三種方式的通訊,Server經過Service向Client提供服務。所以,Cyber RT中的拓撲就是指各通訊角色的位置、發佈/訂閱等信息。接口

 

咱們能夠經過使用有向圖來抽象整個系統中的角色和它們之間的關係。其中,Reader/Writer和Server/Client能夠用圖的頂點表示,Node則在邏輯上對這四種角色進行包含。圖的邊咱們用Channel表示,Channel從Writer流向Reader,表示Writer/Reader的發佈/訂閱關係。實際上,Server和Client也是經過Channel進行通訊的。這在Cyber RT中被稱爲系統的拓撲(Topology)結構。賦予各個角色以惟一標識,並使用Channel同其它系統中的角色進行通訊,這就是拓撲發現。

 

所以,拓撲發現主要用來獲取整個系統中各個角色的分佈:

 

  1. 整個系統建立的Node,以及這些Node建立的Writer/Reader/Server/Client。

  2. 使用某個Channel進行通訊的Writer/Reader。

  3. 和某個Service相關聯的Server/Client。

 

拓撲發現方式

 

拓撲發現主要有兩種方式:

 

  1. 靜態拓撲發現。在配置文件中事先指定各Writer/Reader和Channel等的對應關係。該方法的優勢是拓撲發現迅速,缺點則是配置缺乏靈活性。

  2. 動態拓撲發現。

 

動態拓撲發現又分爲如下兩種:

 

  1. 中心化的拓撲發現。啓動一個名字發現服務做爲中心點,當建立Node等角色時,向這個服務進行註冊,並獲取已有的全部角色信息,同時,Server須要向已有的註冊節點發送更新消息。這種方式容易出現單點問題,而且因爲長鏈接的創建,會致使系統資源的負載增大。

  2. 去中心化的拓撲發現。採用廣播或者組播的方式,向系統中的其它參與者報告本角色的加入/退出。這種方式解決了單點問題,同時減小了鏈接量,可是當節點同時加入時,容易產生廣播風暴。

 

綜合考慮,Cyber RT使用動態的去中心化拓撲發現,採用第三方eProsima Fast RTPS進行通訊管理。使用該庫的組播接口,經過設置CYBER_DOMAIN_ID(能夠轉換成整形的字符串)來創建一個DOMAIN,不一樣DOMAIN之間的通訊不會互相干擾。咱們能夠利用該特性,經過設置不一樣的Domain ID,來在同一臺機器中運行多套Cyber RT系統。

 

拓撲的管理和存儲

 

Cyber RT建立了如下幾個拓撲管理者:

 

  1. NodeManager:主要用來管理和查詢整個系統中的Node。

  2. ChannelManager:主要管理和查詢Channel相關的拓撲,涉及到Node/Writer/Reader。咱們能夠從中獲取到一個Channel的全部Writer/Reader,能夠根據一個Channel是否有相應的Reader來判斷對端是否已經初始化完成,以準備發送數據等。

  3. ServiceManager:主要用來管理和查詢整個系統中的Server和Client。

 

其中:

 

  1. NodeManager和ServiceManager中節點存儲比較簡單,使用Role-ID和RoleAttributes映射的map存儲便可。

  2. ChannelManger包含了Channel相關的Node/Writer/Reader的存儲。能夠用來查詢Node建立以及和Channel有關的全部Writer/Reader。

  3. 另外,咱們使用有向圖(Directed Graph)進行拓撲中Node相關角色的存儲。圖的邊(Edge)爲Channel名稱,圖的頂點(Vertice)爲Node

 

兩個Node間主要有如下三種關係:

 

  1. UPSTREAM:若是Node A中有Channel C的Writer,而Node B中有Channel C的Reader,那麼Node A被叫作Node B的上游。

  2. DOWNSTREAM:若是Node A中有Channel C的Reader,而Node B中有Channel C的Writer,那麼Node A被叫作Node B的下游,兩個Node能夠互爲上下游。

  3. UNREACHABLE:Node A和Node B沒有Channel相關聯。

 

你能夠經過TopologyManager的AddChangeListener來監聽整個系統中拓撲的變化。

 

拓撲發現流程

 

拓撲發現主要處理兩個動做:

 

  1. Join。一個角色加入拓撲。

  2. Leave。一個角色離開拓撲。

 

這兩個動做都須要被組播給相同Domain中的其它角色,而且,其它角色的歷史動做也須要被新加入角色所熟知。爲此創建以下的拓撲發現流程:

 

  1. 初始化TopologyManager,建立RTPS的Participant,這相似於Cyber RT的Node,能夠用來建立拓撲消息的Publisher和Subscriber。同時註冊一個對端Participant變更的回調——OnParticipantChange。

  2. 每一個進程建立上述三種Manager,該Manager會建立對應的Publisher和Subscriber(使用的Channel名稱爲*_change_broadcast)。設置Publisher的QOS策略爲HISTORY_KEEP_ALL,這樣,當有其它進程建立拓撲的Subscriber時,本進程發送過的拓撲Join或者Leave消息將會發送給新加 入的節點,保證整個拓撲的連續性和完整性。

  3. 當建立Node、Writer/Reader、Server/Client時,調用對應Manager的Join函數,請求加入拓撲。同時,因爲上述QOS的設置,咱們會收到其它進程的歷史拓撲消息。

  4. 當收到其它角色的拓撲加入請求時,更新本地拓撲結構。Cyber RT要求每一個Node擁有惟一的命名,若是在拓撲裏發現同名Node,則比較二者的時間戳,時間戳小的Node保留。

  5. 當一個Participant退出時(OnParticipantChange被調用),將該Participant相關的拓撲從本地移除。

 

拓撲發現的應用

 

根據拓撲中的主機IP和進程名稱,咱們能夠對一個Channel的Writer和Reader進行關係劃分,以採用恰當的通訊方式,提升通訊效率。

 

  1. NO_RELATION:這兩個Writer和Reader之間沒有直接關係,也就是它們不是共用的一個Channel。

  2. DIFF_HOST:不一樣主機,不一樣主機間的Writer和Reader只能使用RTPS進行通訊。

  3. DIFF_PROC:同一主機,不一樣進程。同一主機不一樣進程既可使用RTPS進行通訊,也可使用共享內存的方式。默認爲共享內存通訊方式,能夠經過配置進行更改。

  4. SAME_PROC:同一進程的Writer和Reader直接使用指針傳參的方式進行通訊。

 

同時,咱們能夠經過拓撲查詢某些節點的存活狀態、驗證整個DAG是否完整。

 

另外,拓撲消息中還會夾帶Channel的proto_type,proto_desc等用於消息序列化/反序列化。

 

本文從對「拓撲」概念開始,對「和誰進行通訊」問題進行了解答。阿波君向你們介紹了三種通訊角色,同時擴展了拓撲管理者的做用。最重要的是詳細地解釋了拓撲發現方式、發現流程及拓撲發現的應用。

 

閱讀完今天的文章,熱愛學習的你是否對Cyber RT拓撲發現有了進一步的瞭解呢?關於「如何進行通訊」你又有怎樣的疑惑和認識呢?

原文連接地址:https://developer.baidu.com/topic/show/290450

相關文章
相關標籤/搜索