NetMQ发布订阅C#示例

NetMQ (ZeroMQ to .Net),ØMQ号称史上最快中间件。它对socket通信进行了封装,使得我们不需要写socket函数调用就能完成复杂的网络通信。和一般意义上的消息队列产品不同的是,它没有消息队列服务器,而更像是一个网络通信库。从网络通信的角度看,它处于会话层之上,应用层之下。【ZeroMQ 官网】:http://zeromq.org

ØMQ有4个基本通信模型:分别是一对一结对模型(Exclusive-Pair)、请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)。

Request-reply pattern 请求-回复模型

  • 这种模型主要用于从客户端向一个或多个服务实例发送请求,然后等待紧接着对于每个请求的回复
  • 里面又具体分了ZMQ_REQ ZMQ_REP ZMQ_DEALER ZMQ_ROUTER
  • REQ 发送完消息后,必须接收一个回应消息后,才能发送新的消息
  • REP当接收消息时,都会返回一个消息

Publish-subscribe pattern 发布-订阅模式

  • 这种模式主要用于1对多的数据发布(一个发布者,多个订阅者)
  • 里面又具体分了ZMQ_PUB ZMQ_SUB
  • PUB发送消息给所有的SUB。如果此时SUB没有启动,下次启动时会漏掉该消息

Pipeline pattern 管道模式

  • 这种模式主要用于发布数据到由管道排列的节点上面,数据总是沿着管道流动。每个管道阶段连接了至少一个节点
  • 里面又具体分了ZMQ_PUSH ZMQ_PULL
  • 一个1对N队列的实现,PUSH将数据放入队列,PULL从队列中不取出数据。数据会负载均衡的发送给每一个PULL

Exclusive pair pattern 独立对模式

  • peer to peer 模式。主要用于进程内部线程间通信
  • 里面又具体分了ZMQ_PAIR
  • 线程间1-to-1队列的实现,采用了lock free实现,所以速度很快

下面是订阅发布的示例代码:

发布服务端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public static class NetMQPub
  {
      readonly static ManualResetEvent _terminateEvent = new ManualResetEvent(false);
      /// <summary>
      /// NetMQ 发布模式
      /// </summary>
      public static void Start()
      {
          string[] wethers = new string[5] {"晴朗","多云","阴天","小雨","暴雪" };
 
          //CTRL+C 退出程序
          Console.CancelKeyPress += Console_CancelKeyPress;
          Console.WriteLine("发布多个地区天气预报:");
 
          using (var context = NetMQContext.Create())
          {
              using (var publisher = context.CreatePublisherSocket())
              {
                  publisher.Bind("tcp://127.0.0.1:5556");
 
                  var rng = new Random();
                  string msg;
                  int sleeptime = 10;
 
                  while (_terminateEvent.WaitOne(0) == false)
                  {
                      //随机生成天气数据
                      int zipcode = rng.Next(0, 99);
                      int temperature = rng.Next(-50, 50);
                      int wetherId = rng.Next(0, 4);
 
                      msg = string.Format("{0} {1} {2}", zipcode, temperature, wethers[wetherId]);
                      publisher.Send(msg,Encoding.UTF8, zmq.SendReceiveOptions.DontWait);
 
                      Console.WriteLine(msg);
                      Thread.Sleep(sleeptime);
                  }
              }
          }
      }
 
      static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
      {
          Console.WriteLine("exit...");
          _terminateEvent.Set();
      }
  }

  订阅客户端,可启动多个实例来模拟接收天气信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static class NetMQSub
  {
      public delegate void GetDataHandler(string message);
      public static event GetDataHandler OnGetData;
 
      /// <summary>
      /// NetMQ 订阅模式
      /// </summary>
      public static void Start()
      {           
          var rng = new Random();
          int zipcode = rng.Next(0, 99);
          Console.WriteLine("接收本地天气预报 {0}...", zipcode);
 
          OnGetData += new GetDataHandler(ProcessData);
   
          using (var context = NetMQContext.Create())
          using (var subscriber = context.CreateSubscriberSocket())
          {
              subscriber.Connect("tcp://127.0.0.1:5556");
              subscriber.Subscribe(zipcode.ToString(CultureInfo.InvariantCulture));
 
              while(true)
              {
                  string results = subscriber.ReceiveString(Encoding.UTF8);
                  Console.Write(".");
 
                  string[] split = results.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
 
                  int zip = int.Parse(split[0]);
                  if (zip == zipcode)
                  {
                      OnGetData(results);
                  }                 
              }
          }
      }
 
      public static void ProcessData(string msg)
      {
          Console.WriteLine("天气情况:" + msg);
      }
  }

  

 
分类: .net
标签: NetMQZeroMQ

NetMQ的更多相关文章

  1. NetMQ(四): 推拉模式 Push-Pull

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  2. NetMQ(三): 发布订阅模式 Publisher-Subscriber

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  3. NetMQ(二): 请求响应模式 Request-Reply

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  4. NetMQ(一):zeromq简介

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  5. 开源消息队列:NetMQ

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

  6. 记一次Redis和NetMQ的测试

    Redis是一个高速缓存K-V数据库,而NetMQ是ZeroMQ的C#实现版本,两者是完全不同的东西. 最近做游戏服务器的时候想到,如果选择一个组件来做服务器间通信的话,ZeroMQ绝对是一个不错的选 ...

  7. NetMQ发布订阅C#示例

    NetMQ (ZeroMQ to .Net),ØMQ号称史上最快中间件.它对socket通信进行了封装,使得我们不需要写socket函数调用就能完成复杂的网络通信.和一般意义上的消息队列产品不同的是, ...

  8. 消息中间件NetMQ结合Protobuf简介

    概述 对于稍微熟悉这两个优秀的项目来说,每个内容单独介绍都不为过,本文只是简介并探讨如何将两部分内容合并起来,使其在某些场景下更适合.更高效. NetMQ:ZeroMQ的.Net版本,ZeroMQ简单 ...

  9. NetMQ(ZeroMQ)Client => Server => Client 模式的实现

    ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库.它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(m ...

随机推荐

  1. 【Espruino】NO.03 从点灯开始

    http://blog.csdn.net/qwert1213131/article/details/26819773 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] 点灯程序应该 ...

  2. A*寻路算法lua实现

    前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...

  3. flipsnap.js 源码阅读备份

    这是官网:http://hokaccha.github.io/js-flipsnap/ 1.引入全局命名空间 类似jQuery插件写法   传入window, document,提高内部访问速度: ; ...

  4. 一、ExtJS下载使用

    ExtJS下载 4.1 版本号: http://www.sencha.com/products/extjs/download/ext-js-4.1.1/1683 3.4 版本号:http://www. ...

  5. [Visual Studio]透过Visual Studio 2012的选择性贴上将XML与JSON直接转成对应的类别

    原文:[Visual Studio]透过Visual Studio 2012的选择性贴上将XML与JSON直接转成对应的类别 在开发专案时若碰到要串接服务或是他人的API,常常避免不了都要面对XML或 ...

  6. Android开发系列(十九个):至SimpleAdapter设置样式

    Adapter任务:在数据adapter处理后做.展会上的观点 对于一般ArrayAdapter供.传递给ArrayAdapter之后就能够在视图上用一个列表显示出这个字符串数组. 比例如以下边的代码 ...

  7. Java内存模型-jsr133规范介绍(转)

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  8. 使用C++实现功能下载文件

    今天问一个同学C++实现的下载链接下载并保存给定的文件,互联网搜索.看到这样的事情在网上.因此,改变下直接带来,因为他的代码是在VC++,我导入到VS2010中出现点小问题.所以改了下贴了个VS中亲測 ...

  9. Centos7系统配置上的变化(一)

    原文 Centos7系统配置上的变化(一) 安装后,一开始有点儿无力吐槽的感觉,变化这么大? 一.Runlevel 首先一条,原来一直用的CentOS-6.5-x86_64-minimal.iso光盘 ...

  10. jQuery形式可以计算,它包含了无线电的变化价格,select价格变化,删除行动态计算加盟

    jQuery能够计算的表单,包含单选改变价格,select改变价格,动态加入删除行计算 各种表单情况的计算 演示 JavaScript Code <script type="text/ ...