ZeroMQ全面介绍
生活随笔
收集整理的這篇文章主要介紹了
ZeroMQ全面介绍
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
★ZMQ是啥玩意兒?
通俗地說(shuō),ZMQ是一個(gè)開源的、跨語(yǔ)言的、非常簡(jiǎn)潔的、非常高性能、非常靈活的網(wǎng)絡(luò)通訊庫(kù)。它的官方網(wǎng)站在"這里",維基百科的介紹在"這里"(暫時(shí)沒(méi)有中文的維基詞條)。
這玩意兒推出的時(shí)間不長(zhǎng),貌似09年下半年才推出1.0.1版本。俺去年開始接觸它,感覺(jué)實(shí)在不錯(cuò),今年就已經(jīng)用于公司的產(chǎn)品中。最近一段時(shí)間,對(duì) ZMQ 的好評(píng)日漸增多,所以俺也來(lái)趕趕潮流,在俺博客里忽悠一下。
接下來(lái),就針對(duì)ZMQ的幾大特點(diǎn),分別聊一聊。
★簡(jiǎn)單
ZMQ的首要特點(diǎn),就是簡(jiǎn)單(從它的名字也能感覺(jué)得到)。◇封裝導(dǎo)致的簡(jiǎn)單
相比原始的 socket API,ZMQ 封裝掉了很多東西,免去了開發(fā)人員的很多麻煩。
比如,傳統(tǒng)的 TCP 是基于字節(jié)流進(jìn)行收發(fā),因此程序猿常常要自己去處理數(shù)據(jù)塊與數(shù)據(jù)塊之間的邊界(斷界處理);與之相對(duì),ZMQ 是以消息為單位進(jìn)行收發(fā),它確保你每次發(fā)出/收到的,都是一個(gè)消息塊。這樣一來(lái),就省卻了不少代碼量。
比如,基于 socket API 進(jìn)行 TCP 通訊,你需要自己處理很多網(wǎng)絡(luò)異常(比如連接異常中斷以及重連),即使有經(jīng)驗(yàn)的程序員,也未必能寫得嚴(yán)密。而在 ZMQ 中,這些瑣事統(tǒng)統(tǒng)不用程序猿操心。
再比如,用傳統(tǒng)的 socket API,當(dāng)你想提高通訊性能,往往要搞些異步(非阻塞)、緩沖區(qū)、多線程之類的把戲。而這些東西,ZMQ 也幫你封裝掉了。
總而言之,ZMQ 對(duì)很多底層細(xì)節(jié)的封裝,讓你的網(wǎng)絡(luò)程序代碼變得簡(jiǎn)單,寫起來(lái)又快又輕松。
◇API的簡(jiǎn)單
ZMQ 的 API 接口很少,而且在風(fēng)格上非常類似于 BSD Socket。如果你曾經(jīng)用 socket API 寫過(guò)程序,那要上手 ZMQ 是非常容易的。如果你是 Java 程序猿,搞過(guò) JMS API(比如 ActiveMQ),那你會(huì)發(fā)覺(jué)兩者的 API 簡(jiǎn)直是天壤之別。順便抱怨一下:Java 的 JMS API,那可真是復(fù)雜啊!
◇具體的示例
為了增加說(shuō)服力,下面給出 Python 語(yǔ)言實(shí)現(xiàn)的 Echo Server 代碼(所謂的Echo Server,是一種最簡(jiǎn)單的服務(wù)端程序。它把收到的信息原樣回送給客戶端程序)。
#服務(wù)端程序
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:1234")
while True :
????msg = socket.recv()
????socket.send(msg)
#客戶端端程序
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:1234")
msg_send = "xxx"socket.send(msg_send)
print "Send:", msg_send
msg_recv = socket.recv()
print "Receive:", msg_recv
從上述示例代碼,大伙兒應(yīng)該能感覺(jué)到:ZMQ 的使用,是非常簡(jiǎn)單的。
★靈活
所謂的靈活性,主要指如下2方面。◇適用于多種通訊環(huán)境
ZMQ 可以靈活地支持多種通訊環(huán)境(進(jìn)程內(nèi),主機(jī)內(nèi)跨進(jìn)程、跨主機(jī))。ZMQ 的 API 設(shè)計(jì)得很好,以至于你的代碼只要做很小的改動(dòng)(甚至不改動(dòng)),就可以適用于不同的通訊環(huán)境。
在剛才的例子里,有這樣的語(yǔ)句 socket.connect("tcp://127.0.0.1:1234")。其中的 "tcp://127.0.0.1:1234" 是表示通訊對(duì)端的地址串。ZMQ 約定地址串使用如下格式:transport://endpoint?。地址串前面的 transport 表示通訊的類型,目前支持 inproc(進(jìn)程內(nèi)),ipc(主機(jī)內(nèi)跨進(jìn)程),tcp(跨主機(jī)),pgm(跨主機(jī),支持多播)共4種方式。
對(duì)程序猿來(lái)說(shuō),如果你把通訊的地址串保存到配置文件中,就完全可以用一套代碼來(lái)搞定多種通訊方式,非常爽!
◇支持多種通訊模式
ZMQ將常見的通訊場(chǎng)景進(jìn)行了歸納,總結(jié)了如下幾種不同的模式。
PUB and SUB
REQ and REP
REQ and ROUTER
DEALER and REP
DEALER and ROUTER
DEALER and DEALER
ROUTER and ROUTER
PUSH and PULL
PAIR and PAIR
限于篇幅,俺就不深入介紹每種模式了,有興趣的同學(xué)請(qǐng)看官方文檔(在"這里")。
★跨語(yǔ)言
為啥俺要強(qiáng)調(diào)跨語(yǔ)言的特色捏?通常來(lái)說(shuō),用得著網(wǎng)絡(luò)通訊庫(kù)的軟件系統(tǒng),某種程度上都算是分布式系統(tǒng)。如果開發(fā)的分布式系統(tǒng)比較復(fù)雜,要想用一種編程語(yǔ)言通吃,難度較大。因此,在稍微復(fù)雜的分布式系統(tǒng)中,采用多種編程語(yǔ)言是常有的事兒(至少俺的經(jīng)歷是如此)。所以,ZMQ 的這個(gè)跨語(yǔ)言特色就顯得非常重要了。在官方網(wǎng)站的文檔中,給出了如下許多編程語(yǔ)言的示例(鏈接在"這里")。為避免引發(fā)編程語(yǔ)言的名次之爭(zhēng),以下按照字母序排列。
Ada, Basic, C#, C, C++, Common Lisp, Erlang, Go, Haskell, Haxe, Java, JavaScript(Node.js), Lua, Objective-C, PHP, Perl, Python, Racket, Ruby, Scala
這個(gè)語(yǔ)言清單太全了,居然有2個(gè)語(yǔ)言,俺都沒(méi)聽說(shuō)過(guò)。可以不夸張地說(shuō)——常用的編程語(yǔ)言,都可以找到相應(yīng)的 ZMQ 封裝庫(kù)。
★高性能
說(shuō)到性能,這可是 ZMQ 吹噓的主要亮點(diǎn)。首先,ZMQ 是用 C/C++ 開發(fā)的(C/C++ 的性能,那可是公認(rèn)滴);其次,ZMQ 本身的協(xié)議格式定義得很簡(jiǎn)潔(相對(duì)來(lái)說(shuō),JMS 規(guī)范中的協(xié)議格式就復(fù)雜多了)。所以,它的性能遠(yuǎn)遠(yuǎn)高于其它的消息隊(duì)列軟件。甚至可以說(shuō),用 ZMQ 的性能,跟用傳統(tǒng) socket API 的性能,是不相上下滴。為了讓大伙兒有一個(gè)感性的認(rèn)識(shí),俺特地找來(lái)了消息隊(duì)列軟件的性能測(cè)評(píng)。這是某老外寫的一篇帖子(在"這里"),不懂洋文的同學(xué)可以看"這里"。連帖子都懶得看的同學(xué),可以直接看下圖。
從圖中可以明顯看出,ZMQ 相比其它幾款MQ,簡(jiǎn)直是鶴立雞群啊!性能根本不在一個(gè)檔次嘛。
★總結(jié)
總體而言,ZMQ 是非常值得大伙兒去嘗試的一個(gè)網(wǎng)絡(luò)通訊庫(kù)。即使工作中用不到,業(yè)余時(shí)間玩玩也是不錯(cuò)滴。本帖子發(fā)出后,如果感興趣的人較多,俺會(huì)根據(jù)反饋,再聊一些深入的話題。
轉(zhuǎn)載于:https://www.cnblogs.com/mtcnn/archive/2011/10/22/9410136.html
總結(jié)
以上是生活随笔為你收集整理的ZeroMQ全面介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。