當前位置:網站首頁>cyberRT 發現機制總結
cyberRT 發現機制總結
2022-05-15 08:31:54【shenkaibo】
cyberRT 發現機制總結
代碼目錄
cyber 發現機制的代碼都在cyber/service_discovery中,後面我們直接從topology_manager中去分析整個發現機制流程。
以下代碼流程中非重要代碼都用…替換。
發現機制初始化
bool TopologyManager::Init() {
if (init_.exchange(true)) {
return true;
}
//創建三個類型節點的manager
node_manager_ = std::make_shared<NodeManager>();
channel_manager_ = std::make_shared<ChannelManager>();
service_manager_ = std::make_shared<ServiceManager>();
CreateParticipant();
//主要是這步處理,對所有類型的manager做初始化
bool result =
InitNodeManager() && InitChannelManager() && InitServiceManager();
if (!result) {
...
}
return true;
}
TopologyManager::Init中主要幹三件事,對node、channel、service這三個manager的初始化。init中創建了三個manager,node_manager_ 、channel_manager_ 、service_manager_ ,這三個manager都是繼承自Manager。並且三個manager的init函數中做的東西很簡單,都是調用了基類的StartDiscovery。我們看下StartDiscovery中的處理:
bool Manager::StartDiscovery(RtpsParticipant* participant) {
if (participant == nullptr) {
return false;
}
if (is_discovery_started_.exchange(true)) {
return true;
}
//這裏創建的是fastRtps的pub和sub
if (!CreatePublisher(participant) || !CreateSubscriber(participant)) {
AERROR << "create publisher or subscriber failed.";
StopDiscovery();
return false;
}
return true;
}
可以看到StartDiscovery中做的處理就是創建出fastRtps的pub和sub,這裏我們也可以總結出cyber內部的發現機制通信都是通過fastRtps。這裏我理解直接使用fastRtps通信是為了避免自己再去實現trans local的機制。不管是同一機器內的通信,還是不同機器間的通信都使用了fastRtps方式。當然為了性能的極致化,也可以考慮同一機器內發現消息使用共享內存,但是這種的話你就要自己去實現trans local機制。確保晚加入的節點,能收到先加入節點的發現消息。
Topology的join和leave
這裏只舉例Join。
所有的節點join都是調用的基類方法Manager::Join,可以看下這個函數
bool Manager::Join(const RoleAttributes& attr, RoleType role,
bool need_publish) {
if (is_shutdown_.load()) {
ADEBUG << "the manager has been shut down.";
return false;
}
RETURN_VAL_IF(!((1 << role) & allowed_role_), false);
RETURN_VAL_IF(!Check(attr), false);
ChangeMsg msg;
Convert(attr, role, OperateType::OPT_JOIN, &msg);
Dispose(msg);
if (need_publish) {
return Publish(msg);
}
return true;
}
這裏主要看Dispose和Publish這兩個。Dispose調用的是各個子類的方法,比如channel拓撲節點變化了,就會調用ChannelManager::Dispose來通過channelManager的節點變化,看下面:
void ChannelManager::Dispose(const ChangeMsg& msg) {
if (msg.operate_type() == OperateType::OPT_JOIN) {
DisposeJoin(msg);
} else {
DisposeLeave(msg);
}
Notify(msg);
}
Dispose會根據這個節點是join還是leave來調用子類的DisposeJoin或者DisposeLeave方法,目的就是更新各個子類manager中保存的節點關系。另外這裏還會調用Notify,裏面用了QT信號和槽的機制,其實就是觸發了一個callback。這個callback是使用方調用TopologyManager中的AddChangeListener設置的一個callback。
再看Publish函數,這函數就是將join或者leave消息通過fastRtps消息發給所有subscribe,讓所有sub都去更新拓撲節點關系。可以看下sub收到消息後的處理,收到消息的處理是Manager::OnRemoteChange:
void Manager::OnRemoteChange(const std::string& msg_str) {
if (is_shutdown_.load()) {
ADEBUG << "the manager has been shut down.";
return;
}
ChangeMsg msg;
RETURN_IF(!message::ParseFromString(msg_str, &msg));
if (IsFromSameProcess(msg)) {
return;
}
RETURN_IF(!Check(msg.role_attr()));
Dispose(msg);
}
這裏的處理也很簡單,主要是收到sub拓撲節點變更消息後,觸發OnRemoteChange再調用Dispose 來更新自己保存的拓撲關系。
leave這裏就不細說了,和join流程差不多。
版權聲明
本文為[shenkaibo]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/135/202205150000357169.html
邊欄推薦
猜你喜歡
關於創建模態窗口和非模態窗口的研究
An End-to-End Steel Surface Defect Detection Approach via Fusing Multiple Hierarchical Features-閱讀筆記
【性能測試】第五篇 | Jmeter環境安裝
Matplotlib使用指南,100個案例從入門到進階!(附源代碼)
Dots + interval stats and geoms
SIGIR2022 | 基於用戶價格偏好及興趣偏好的會話推薦
Cloudreve自建雲盤實站:容量和速度自己來决定
利用騰訊雲函數搭建免費代理池
Redis的安裝及基本數據類型
js輪播圖效果,透明度漸變實現
隨機推薦
- 【棧+深度優先搜索】括號問題大匯總
- 筆記 第1章 流與文件(6) 文件隨機比特置讀取與Zip文件讀取
- 你的數據庫真的穿“防彈衣”了嗎
- 實驗四 進程同步與通信
- LeetCode騰訊精選練習50題-557.反轉字符串中的單詞III
- 軟考系統集成項目管理工程師全真模擬題(含答案、解析)
- 這款阿裏騰訊人都在用的API管理神器,解决你發愁的文檔問題
- 微服務最强理論基礎,堪稱絕妙心法
- OCTO作為美團的高性能服務通信框架,究竟能不能稱得上是殺手鐧呢?
- 沉浸式面試:MySQL連環炮,你能抗到第幾個?
- 阿裏四面一問:說說之前公司系統都用過的哪些限流模式?
- 速達軟件、金蝶軟件、用友軟件、管家婆軟件、鼎捷軟件等ERP軟件與進銷存軟件的區別
- P1439 【模板】最長公共子序列
- MySQL數據庫(8):數據類型-小數
- 38歲獨居男去世。
- 【FreeRtos任務恢複與掛起】
- UDS-如何在CAPL中實現診斷服務的請求和響應
- UDS-如何在CAPL中實現讀取DTC和它的狀態
- 智能複制多個文件夾裏全部文件到指定比特置
- 剪輯視頻,在視頻某時間段添加srt字幕
- 【SQL UNION 操作符】
- 爬蟲基本原理講解
- 華為設備配置基於用戶VLAN的組播VLAN多對多功能
- 複制帶隨機指針的鏈錶<難度系數>
- 免征個人所得稅的項目有哪些
- npm WARN read-shrinkwrap This version of npm is compatible with [email protected], but package-lock.
- 源代碼保密該如何管理
- JVM(十七) -- 字節碼與類的加載(二) -- 字節碼指令集
- 英語六級高頻詞匯速記 + 2018-12-2聽力 Day04
- 電腦優化配置-win10
- 創新工場李開複:最看好的十年趨勢是醫療科技
- 白話快速理解CDN
- 小樣本學習只是一場學術界自嗨嗎?
- 數據庫常用語句
- LearnOpenGL學習筆記——高級數據
- 數據庫函數查詢 MySQL數據庫是時間正確問題
- Win10下如何在右鍵新建菜單使用Typora新建.md文件
- 力扣刷題771.寶石與石頭
- mysql split 字符串
- CSV文件中的list形式字符串轉為list