NetMQ 是  ZeroMQ的C#移植版本。

一、ZeroMQ

ZeroMQ(Ø)是一个轻量级的消息内核,它是对标准socket接口的扩展。它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问。

ZeroMQ是基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。 

ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞。ZeroMQ会根据用户调用zmq_init函数时传入的接口参数,创建对应数量的I/O Thread。

ZeroMQ不是单独的服务或者程序,仅仅是一套组件,其封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信

NetMQ介绍

特点

如果说ZeroMQ最突出的三个特点是什么? 答案是 快,很快,非常快

不仅仅是速度,就连使用起来ZeroMQ和其他的MQ产品比起来差别太大,以至于有种疑问,ZeroMQ还算的上队列产品麽?

通常的MQ,你需要一台运行在服务器上的MQ服务端,它需要启动一个或多个进程来维护队列中的数据并做持久化以防止宕机后数据丢失,当然还必须要有个监控组件保证能尽快的发现队列的阻塞延迟处理速率等运行状况。然后你至少要有一个客户端通过订阅发布或者请求响应的方式与队列服务端交换数据。

ZeroMQ则完全不同,它不需要独立部署,反之它仅提供一个DLL,你可以将它Host到任何运行的进程中去,IIS、Windows Servers、Window Form都可以。你只需要告诉运行模式和通信端口,就能马上运行起来。 像不像WCF ?

另外一个不得不说的特点是ZeroMQ彻底放弃了持久化,虽然你可以设置一个磁盘Swarp区域用以临时存放队列数据,但一旦工作线程结束,所有数据都将丢失。

最后说一说ZeroMQ的多对多的优势,一般的MQ产品如果要实现多个队列服务和多个客户端的自由连接就不得不额外的做自己的实现。但ZeroMQ天生就具备这个能力,甚至在可以任何时候添加和取消服务端和客户端的任一个。

消息模型

ZeroMQ将消息通信分成4种模型,分别是

  • 一对一结对模型(Exclusive-Pair):一个TCP Connection,但是TCP Server只能接受一个连接,数据可以双向流动
  • 请求回应模型(Request-Reply):跟一对一结对模型的区别在于请求端可以是1~N个,该模型主要用于远程调用及任务分配等
  • 发布订阅模型(Publish-Subscribe):发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。 
  • 推拉模型(Push-Pull):Server端作为Push端,而Client端作为Pull端,如果有多个Client端同时连接到Server端,则Server端会在内部做一个负载均衡,采用平均分配的算法,将所有消息均衡发布到Client端上。与发布订阅模型相比,推拉模型在没有消费者的情况下,发布的消息不会被消耗掉;在消费者能力不够的情况下,能够提供多消费者并行消费解决方案。该模型主要用于多任务并行。

这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。

NetMQ介绍

请求回应模型

NetMQ介绍

发布订阅模型

NetMQ介绍

推拉模型

传输协议
ZeroMQ支持四类传输协议。每种传输协议由地址字符串来定义,该字符串由两部分组成:transport://endpoint。传输(transport) 部分指定了所使用的底层传输协议,端点(endpoint) 部分的格式则随着使用的协议而有所不同,具体如下:

  • TCP (tcp://hostname:port): 在主机之间进行通讯
  • INROC (inproc://name): 在同一进程的线程之间进行通讯(线程间)
  • IPC (ipc:///tmp/filename): 同一主机的进程之间进行通讯
  • PGM (pgm://interface;address:port 和 epgm://interface;address:port): 多播通讯

更多:ZeroMQ研究与应用分析

二、NetMQ

NetMQ 也是一个社区开源项目,网站在Github上 https://github.com/zeromq/netmq, 可以通过Nuget包获取。

下面以NetMQ的一对一模式为例,引入3.3.0.7 NetMQ

服务端:

NetMQ介绍
  class Program
    {
        static void Main(string[] args)
        {
            using (NetMQContext context = NetMQContext.Create())
            {
                Server(context);
            }
        }

        static void Server(NetMQContext context)
        {
            using (NetMQSocket serverSocket = context.CreateResponseSocket())
            {
                serverSocket.Bind("tcp://*:5555");
                Console.WriteLine("Waiting for connetion...");
                while (true)
                {
                    string message = serverSocket.ReceiveString();
                    Console.WriteLine("Receive message {0}", message);

                    string sendMessage = "Hello " + message;
                    serverSocket.Send(sendMessage);
                    Console.WriteLine("Send message {0}", sendMessage);

                    if (message == "exit")
                    {
                        break;
                    }
                }
            }
        }

    }
View Code

相关文章:

  • 2021-07-22
  • 2021-09-07
  • 2021-09-15
  • 2022-12-23
  • 2021-11-02
  • 2021-10-01
  • 2021-10-31
  • 2022-02-26
猜你喜欢
  • 2021-09-08
  • 2022-12-23
  • 2022-02-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-26
相关资源
相似解决方案