ZMQ 三种模型
FROM: http://blog.csdn.net/lfsf802/article/details/38238007
一、ZeroMQ的背景介紹
官方: “ZMQ(以下ZeroMQ簡(jiǎn)稱ZMQ)是一個(gè)簡(jiǎn)單好用的傳輸層,像框架一樣的一個(gè)socket library,他使得Socket編程更加簡(jiǎn)單、簡(jiǎn)潔和性能更高。是一個(gè)消息處理隊(duì)列庫,可在多個(gè)線程、內(nèi)核和主機(jī)盒之間彈性伸縮。ZMQ的明確目標(biāo)是“成為標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議棧的一部分,之后進(jìn)入Linux內(nèi)核”。現(xiàn)在還未看到它們的成功。但是,它無疑是極具前景的、并且是人們更加需要的“傳統(tǒng)”BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網(wǎng)絡(luò)應(yīng)用程序極為簡(jiǎn)單和有趣。”
與其他消息中間件相比,ZMQ并不像是一個(gè)傳統(tǒng)意義上的消息隊(duì)列服務(wù)器,事實(shí)上,它也根本不是一個(gè)服務(wù)器,它更像是一個(gè)底層的網(wǎng)絡(luò)通訊庫,在Socket API之上做了一層封裝,將網(wǎng)絡(luò)通訊、進(jìn)程通訊和線程通訊抽象為統(tǒng)一的API接口。
二、ZMQ是什么
閱讀了ZMQ的Guide文檔后,我的理解是,這是個(gè)類似于Socket的一系列接口,他跟Socket的區(qū)別是:普通的socket是端到端的(1:1的關(guān)系),而ZMQ卻是可以N:M 的關(guān)系,人們對(duì)BSD套接字的了解較多的是點(diǎn)對(duì)點(diǎn)的連接,點(diǎn)對(duì)點(diǎn)連接需要顯式地建立連接、銷毀連接、選擇協(xié)議(TCP/UDP)和處理錯(cuò)誤等,而ZMQ屏蔽了這些細(xì)節(jié),讓你的網(wǎng)絡(luò)編程更為簡(jiǎn)單。ZMQ用于node與node間的通信,node可以是主機(jī)或者是進(jìn)程。
三、三種模型
a)????應(yīng)答模式:
使用REQ-REP套接字發(fā)送和接受消息是需要遵循一定規(guī)律的。客戶端首先使用zmq_send()發(fā)送消息,再用zmq_recv()接收,如此循環(huán)。如果打亂了這個(gè)順序(如連續(xù)發(fā)送兩次)則會(huì)報(bào)錯(cuò)。類似地,服務(wù)端必須先進(jìn)行接收,后進(jìn)行發(fā)送。
b)????訂閱發(fā)布模式
PUB-SUB套接字組合是異步的。客戶端在一個(gè)循環(huán)體中使用recv ()接收消息,如果向SUB套接字發(fā)送消息則會(huì)報(bào)錯(cuò);類似地,服務(wù)端可以不斷地使用send ()發(fā)送消息,但不能再PUB套接字上使用recv ()。
關(guān)于PUB-SUB套接字,還有一點(diǎn)需要注意:你無法得知SUB是何時(shí)開始接收消息的。就算你先打開了SUB套接字,后打開PUB發(fā)送消息,這時(shí)SUB還是會(huì)丟失一些消息的,因?yàn)榻⑦B接是需要一些時(shí)間的。很少,但并不是零。解決此問題需要在PUB端加入sleep。
?
c)?????基于分布式處理(管道模式)
?
這篇博客對(duì)ZMQ有一個(gè)初步的介紹,下篇博客介紹如何通過JAVA來調(diào)用ZMQ實(shí)現(xiàn)消息處理。
總結(jié)
- 上一篇: Caffe + Ubuntu 14.04
- 下一篇: ZMQ研究