一个网络传输框架——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."

二、使用场景

http://zeromq.org/intro:read-the-manual
有人用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的必要性(主要是说在多核场景下的程序设计,程序设计者需要把工作拆分成各个可以并发执行的任务,各个隔离的节点在各自独立的完成任务,它们通过消息队列协作):
http://120.52.72.49/zeromq.wdfiles.com/c3pr90ntcsf0/local--files/whitepapers%3Amultithreading-magic/imatix-multithreaded-magic.pdf
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

你可能感兴趣的:(一个网络传输框架——zeroMQ 调研笔记)