一、它是什么
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的介紹: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