一個網絡傳輸框架——zeroMQ 調研筆記


一、它是什么

zeroMQ,一個處理消息傳輸的庫,重點在傳輸上,看起來它像是在socket上面封裝了一層,讓我們可以很容易的利用它來做N對M的數據傳輸,在分布式系統中很方便,在接收端它有round-robin負載均衡。

官方介紹:http://zguide.zeromq.org/page:all

"ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source."

二、使用場景

有人用zeroMQ替換Kafka,穩定性的到了提升:
‘While improved stability and reliability was the key motivation for this transition, the added performance and reduced system complexity were a nice side effects. In the few days since we replaced Kafka with ZeroMQ the quality of my sleep has improved substantially. — Tomasz Janczuk, Auth0’
從利用多核的角度介紹zeroMQ的必要性(主要是說在多核場景下的程序設計,程序設計者需要把工作拆分成各個可以並發執行的任務,各個隔離的節點在各自獨立的完成任務,它們通過消息隊列協作):
The key is to pass information as messages rather than shared state.
使用消息來解決並發時的數據通信,比使用共享狀態要強得多。
 

雲風對zeroMQ的介紹:http://blog.codingnow.com/2011/02/zeromq_message_patterns.html
“在需要並行化處理數據的時候,采用消息隊列通訊的方式來協作,比采用共享狀態的方式要好的多。”
所以zeroMQ的主要用途是:分布式系統的消息通信工具。

官方詳細介紹:http://zguide.zeromq.org/page:all
zeroMQ中的zero,表示的是極簡。
“其實ZMQ可以做的還不止這些,它會顛覆人們編寫網絡應用程序的模式。雖然從表面上看,它不過是提供了一套處理套接字的API,能夠用zmq_recv()和zmq_send()進行消息的收發,但是,消息處理將成為應用程序的核心部分,很快你的程序就會變成一個個消息處理模塊,這既美觀又自然。它的擴展性還很強,每項任務由一個節點(節點是一個線程)、同一台機器上的兩個節點(節點是一個進程)、同一網絡上的兩台機器(節點是一台機器)來處理,而不需要改動應用程序。”

這點說的很好,但這種設計思路,其實早就有了,chromium里的多線程設計,便是把后台程序拆分成一個個task,post到工作線程中完成,然后再post回來,單機的多線程利用思路跟zeroMQ為並行計算而設計的思路有相似的地方,chromium對多線程使用的這種設計也不是首創的。“一個個的消息處理模塊”,在我當前工作的團隊中,整個服務過億網民的框架也是這么設計的,不過,消息的傳遞沒有使用zeroMQ,而是自己公司的rpc框架。

三、代碼

注意:基於Node.js框架

zmq的socket模式: req、rep、push、pull、pub、sub、router、dealer

1、請求和應答
req和rep也就是請求回應模型,req和rep都可以請求和回答,不同的只是req是先send再rec,rep是先rec再send。支持N個請求端一個接收端,也支持N個接收端一個請求端。N個接收端采用rr負載均衡。 哪個是“一”端,哪個就bind端口,“N”端就只能connect,所以,req+rep無論誰bind端口,肯定要有一個是“一”。
router和dealer就是隨時可以發送和接收的req和rep,看起來router+dealer跟 req+rep屬於同類功能。
因為router和dealer可以隨時發送接收,所以它們可以用來做路由。
一個router用來響應N個req,然后它在響應處理的時候,再通過另一個socket把請求扔出去,接收者是另外的M個rep,這就做到N:M。
2、訂閱和推送
pub和sub就是發布者和訂閱者。
3、推和拉
push和pull就是管道,一個只推數據,一個只拉數據。
 
看起來比較輕松的demo代碼,所有的socket模式都有: https://github.com/JustinTulloss/zeromq.node/tree/master/examples
req-->router1+router2-->rep 模式的示例代碼: https://github.com/imatix/zguide/blob/master/examples/Node.js/lbbroker.js
 
本文所在:http://www.cnblogs.com/cswuyg/p/5196587.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM