NetMQ
是 ZeroMQ
的C#移植版本。html
NetMQ
(ZeroMQ to .Net),ZMQ
号称史上最快中间件。
它对socket
通讯进行了封装,使得咱们不须要写socket
函数调用就能完成复杂的网络通讯。
它跟Socket
的区别是:普通的socket
是端到端的(1:1
的关系),而ZMQ
倒是能够N:M
的关系,人们对BSD
套接字的了解较多的是点对点的链接,点对点链接须要显式地创建链接、销毁链接、选择协议(TCP/UDP)和处理错误等,而ZMQ
屏蔽了这些细节,让你的网络编程更为简单。
它是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。和通常意义上的消息队列产品不一样的是,它没有消息队列服务器,而更像是一个网络通讯库。从网络通讯的角度看,它处于会话层之上,应用层之下,属于传输层。算法
zeromq
将消息通讯分为4种模型,分别是一对一结对模型(Exclusive-Pair
)、请求回应模型(Request-Reply
)、发布订阅模型(Publish-Subscribe
)、推拉模型(Push-Pull
)。这4种模型总结出了通用的网络通讯模型,在实际中能够根据应用须要,组合其中的2种或多种模型来造成本身的解决方案。编程
最简单的1:1
消息通讯模型,用来支持传统的 TCP socket
模型,主要用于进程内部线程间通讯。能够认为是一个TCP Connection
,可是TCP Server
只能接受一个链接。采用了lock free实现,速度很快。数据能够双向流动,这点不一样于后面的请求响应模型。(不推荐使用,没有例子)服务器
由请求端发起请求,而后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟一对一结对模型的区别在于请求端能够是1~N
个。
请求端和回应端均可以是1:N
的模型。一般把1
认为是server
,N
认为是Client
。ZeroMQ
能够很好的支持路由功能(实现路由功能的组件叫做Device
),把1:N
扩展为N:M
(只须要加入若干路由节点)。从这个模型看,更底层的端点地址是对上层隐藏的。每一个请求都隐含有回应地址,而应用则不关心它。一般把该模型主要用于远程调用及任务分配等。
(NetMQ请求响应C#调用案例)网络
发布端单向分发数据,且不关心是否把所有信息发送给订阅端。若是发布端开始发布信息时,订阅端还没有链接上来,则这些信息会被直接丢弃。订阅端未链接致使信息丢失的问题,能够经过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的状况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝能够应用这种经典模型。 (NetMQ发布订阅模式C#调用案例)负载均衡
Server端做为Push端,而Client端做为Pull端,若是有多个Client端同时链接到Server端,则Server端会在内部作一个负载均衡,采用平均分配的算法,将全部消息均衡发布到Client端上。与发布订阅模型相比,推拉模型在没有消费者的状况下,发布的消息不会被消耗掉;在消费者能力不够的状况下,可以提供多消费者并行消费解决方案。该模型主要用于多任务并行。
(NetMQ推拉模式C#调用案例)异步