日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZeroMQ全面介绍

發布時間:2024/7/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZeroMQ全面介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

★ZMQ是啥玩意兒?

  通俗地說,ZMQ是一個開源的、跨語言的、非常簡潔的、非常高性能、非常靈活的網絡通訊庫。
  它的官方網站在"這里",維基百科的介紹在"這里"(暫時沒有中文的維基詞條)。
  這玩意兒推出的時間不長,貌似09年下半年才推出1.0.1版本。俺去年開始接觸它,感覺實在不錯,今年就已經用于公司的產品中。最近一段時間,對 ZMQ 的好評日漸增多,所以俺也來趕趕潮流,在俺博客里忽悠一下。
  接下來,就針對ZMQ的幾大特點,分別聊一聊。

★簡單

  ZMQ的首要特點,就是簡單(從它的名字也能感覺得到)。

◇封裝導致的簡單
  相比原始的 socket API,ZMQ 封裝掉了很多東西,免去了開發人員的很多麻煩。
  比如,傳統的 TCP 是基于字節流進行收發,因此程序猿常常要自己去處理數據塊與數據塊之間的邊界(斷界處理);與之相對,ZMQ 是以消息為單位進行收發,它確保你每次發出/收到的,都是一個消息塊。這樣一來,就省卻了不少代碼量。
  比如,基于 socket API 進行 TCP 通訊,你需要自己處理很多網絡異常(比如連接異常中斷以及重連),即使有經驗的程序員,也未必能寫得嚴密。而在 ZMQ 中,這些瑣事統統不用程序猿操心。
  再比如,用傳統的 socket API,當你想提高通訊性能,往往要搞些異步(非阻塞)、緩沖區、多線程之類的把戲。而這些東西,ZMQ 也幫你封裝掉了。
  總而言之,ZMQ 對很多底層細節的封裝,讓你的網絡程序代碼變得簡單,寫起來又快又輕松。

◇API的簡單
  ZMQ 的 API 接口很少,而且在風格上非常類似于 BSD Socket。如果你曾經用 socket API 寫過程序,那要上手 ZMQ 是非常容易的。如果你是 Java 程序猿,搞過 JMS API(比如 ActiveMQ),那你會發覺兩者的 API 簡直是天壤之別。順便抱怨一下:Java 的 JMS API,那可真是復雜啊!

◇具體的示例
  為了增加說服力,下面給出 Python 語言實現的 Echo Server 代碼(所謂的Echo Server,是一種最簡單的服務端程序。它把收到的信息原樣回送給客戶端程序)。

#服務端程序
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

  從上述示例代碼,大伙兒應該能感覺到:ZMQ 的使用,是非常簡單的。

★靈活

  所謂的靈活性,主要指如下2方面。

◇適用于多種通訊環境
  ZMQ 可以靈活地支持多種通訊環境(進程內,主機內跨進程、跨主機)。ZMQ 的 API 設計得很好,以至于你的代碼只要做很小的改動(甚至不改動),就可以適用于不同的通訊環境。
  在剛才的例子里,有這樣的語句 socket.connect("tcp://127.0.0.1:1234")。其中的 "tcp://127.0.0.1:1234" 是表示通訊對端的地址串。ZMQ 約定地址串使用如下格式:transport://endpoint?。地址串前面的 transport 表示通訊的類型,目前支持 inproc(進程內),ipc(主機內跨進程),tcp(跨主機),pgm(跨主機,支持多播)共4種方式。
  對程序猿來說,如果你把通訊的地址串保存到配置文件中,就完全可以用一套代碼來搞定多種通訊方式,非常爽!

◇支持多種通訊模式
  ZMQ將常見的通訊場景進行了歸納,總結了如下幾種不同的模式。
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
  限于篇幅,俺就不深入介紹每種模式了,有興趣的同學請看官方文檔(在"這里")。

★跨語言

  為啥俺要強調跨語言的特色捏?通常來說,用得著網絡通訊庫的軟件系統,某種程度上都算是分布式系統。如果開發的分布式系統比較復雜,要想用一種編程語言通吃,難度較大。因此,在稍微復雜的分布式系統中,采用多種編程語言是常有的事兒(至少俺的經歷是如此)。所以,ZMQ 的這個跨語言特色就顯得非常重要了。
  在官方網站的文檔中,給出了如下許多編程語言的示例(鏈接在"這里")。為避免引發編程語言的名次之爭,以下按照字母序排列。
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個語言,俺都沒聽說過。可以不夸張地說——常用的編程語言,都可以找到相應的 ZMQ 封裝庫。

★高性能

  說到性能,這可是 ZMQ 吹噓的主要亮點。首先,ZMQ 是用 C/C++ 開發的(C/C++ 的性能,那可是公認滴);其次,ZMQ 本身的協議格式定義得很簡潔(相對來說,JMS 規范中的協議格式就復雜多了)。所以,它的性能遠遠高于其它的消息隊列軟件。甚至可以說,用 ZMQ 的性能,跟用傳統 socket API 的性能,是不相上下滴。
  為了讓大伙兒有一個感性的認識,俺特地找來了消息隊列軟件的性能測評。這是某老外寫的一篇帖子(在"這里"),不懂洋文的同學可以看"這里"。連帖子都懶得看的同學,可以直接看下圖。

  從圖中可以明顯看出,ZMQ 相比其它幾款MQ,簡直是鶴立雞群啊!性能根本不在一個檔次嘛。

★總結

  總體而言,ZMQ 是非常值得大伙兒去嘗試的一個網絡通訊庫。即使工作中用不到,業余時間玩玩也是不錯滴。
  本帖子發出后,如果感興趣的人較多,俺會根據反饋,再聊一些深入的話題。

轉載于:https://www.cnblogs.com/mtcnn/archive/2011/10/22/9410136.html

總結

以上是生活随笔為你收集整理的ZeroMQ全面介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。