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