NNG/NanoMsg进程线程间通讯库
NNG/nanomsg?是最近項(xiàng)目上使用到的一個(gè)通信庫(kù),用來(lái)實(shí)現(xiàn)進(jìn)程間過(guò)程調(diào)用和線程間通信,很是方便。
NNG 是 nanomsg 的繼任版本,而 nanomsg 則是流行的?ZMQ?的 C 重寫(xiě)版。
NNG 將通信使用的協(xié)議和傳輸分離,同一個(gè)協(xié)議可以工作在不同的傳輸層上,類(lèi)似與 TCP/IP 的應(yīng)用層和傳輸層的分層,同時(shí)接口上屏蔽了底層細(xì)節(jié),統(tǒng)一用字符串 URL 來(lái)描述傳輸模式。這樣當(dāng)使用場(chǎng)景修改時(shí),可以通過(guò)簡(jiǎn)單修改 URL 來(lái)實(shí)現(xiàn)適應(yīng),極具靈活性。
同時(shí)如 NNG 描述所言 “l(fā)ight-weight brokerless messaging”,NNG 中的通信各方是不需要第三方程序介入的,這與 MQTT/Redis 通信需要服務(wù)器不同。這樣很適合作為通信庫(kù)來(lái)使用而沒(méi)有其他依賴。
NNG 支持的通信協(xié)議主要有以下幾種:
- PAIR 一對(duì)一雙向通信。
- PIPELINE(PUSH/PULL) 單向通信,類(lèi)似與生產(chǎn)者消費(fèi)者模型的消息隊(duì)列。
- PUB/SUB 單向廣播。
- REQ/REP 請(qǐng)求-應(yīng)答模式,類(lèi)似與 RPC 模式。
- BUS 網(wǎng)狀連接通信,每個(gè)加入節(jié)點(diǎn)都可以發(fā)送/接受廣播消息。
- SURVEY 用于多節(jié)點(diǎn)表決或者服務(wù)發(fā)現(xiàn)。
NNG 支持的傳輸模式主要有以下三種常用,其他還有tcp附加tls 1.2加密的tls傳輸和基于WebSocket的ws傳輸:
- inproc 進(jìn)程內(nèi)線程間傳輸
- ipc 主機(jī)內(nèi)進(jìn)程間傳輸
- tcp 網(wǎng)絡(luò)內(nèi)主機(jī)間傳輸
通信協(xié)議里除了 PAIR 之外,基本都是一對(duì)多的通信模式,這點(diǎn)需要注意,以 PIPELINE 和 PUB/SUB 為例:
基于以上,多個(gè)程序是沒(méi)辦法共用一個(gè) PUB/SUB 通道來(lái)廣播數(shù)據(jù)的,這與 ROS 里的 topic 和 LCM 中的 channel 模式不同。如果要實(shí)現(xiàn)類(lèi)似功能,則可以使用 PIPELINE + PUB/SUB 來(lái)處理:
- 獨(dú)立一個(gè)話題發(fā)布的程序,擁有一個(gè) PULL 和 PUB。
- PULL 約定一個(gè) URL,所有需要發(fā)布該話題的程序都 PUSH 數(shù)據(jù)到該 URL 上。
- PUB 約定一個(gè) URL,所有需要獲取該話題的程序都 SUB 到該 URL 上。
- 程序內(nèi)部循環(huán)將 PULL 讀取的數(shù)據(jù)發(fā)送到 PUB 上。
以上則可以模擬出 ROS topic 數(shù)據(jù)合并 或者 LCM 中 channel 的類(lèi)似功能。
整體上看,NNG 的 API 很簡(jiǎn)約,主要是 4 個(gè),open/recv/send/close,open 根據(jù)協(xié)議不同使用的函數(shù)會(huì)不同。配置則是 setopt/getopt,與 UNIX API 類(lèi)似。API 中沒(méi)有上下文環(huán)境(context-less)依賴,只需要一個(gè) nng_socket,這種設(shè)計(jì)和實(shí)現(xiàn)方法值得去學(xué)習(xí)一下(初步揣測(cè)應(yīng)該是使用指針值作為handle,如果要強(qiáng)制編譯器做類(lèi)型檢測(cè),則會(huì)套上一層 struct,如?typedef struct { _nng_xxx_socket * p } nng_socket;)。
NNG 協(xié)議基本上囊括了常見(jiàn)的通信需求,一些特殊的需求,也可以通過(guò)組合協(xié)議來(lái)實(shí)現(xiàn),比如上面的模擬 ROS topic 或者 LCM channel 的方法。這樣一來(lái),如果在程序中使用 NNG,不管是多進(jìn)程,還是多線程,通過(guò)設(shè)計(jì),可以進(jìn)一步增強(qiáng)模塊化,同時(shí)不乏靈活性。如果環(huán)境變化,程序不管是由多進(jìn)程改成多線程,還是由多線程改成多主機(jī),都很容易實(shí)現(xiàn)。
常見(jiàn)模塊/進(jìn)程/線程間通信,可以依據(jù)具體需求來(lái)使用 PIPELINE(消息隊(duì)列) 還是 REQ/REP(過(guò)程調(diào)用),而不是鎖+全局變量,每個(gè)模塊單元只需要做單一相關(guān)的具體事務(wù),無(wú)需知曉全局狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的NNG/NanoMsg进程线程间通讯库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML学习---中文网页编码声明
- 下一篇: 零售数据分析方法学习笔记