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. Nuget的使用

    前言 最近看到园子上有关于NuGet (读音:new get)的使用,所以心血来潮也跟着学习做了一下,觉得很流b哦.于是也就记一下自己的学习心得(并非一味的重复轮子,只是觉得他人做的写的就是对的,自己 ...

  2. 使用JavaScript检测浏览器

    假设你真的需要检测浏览器的类型,使用JavaScript非常easy达到. View Demo Download Source from GitHub JavaScript有一个navigator的标 ...

  3. 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最近的互联网招聘平台拉勾网在五月推出了"最艰难的采访IT公司"码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspac ...

  4. leetcode第一刷_Spiral Matrix II

    跟上一题的策略全然一样,这个题是要求保存当前增加的是第几个数,由于矩阵里面存的就是这个东西. 我有尝试想过是不是有一种方法能够直接推算出每一行的数据是哪些.但没过多久就放弃了.这样的方法尽管能够避免在 ...

  5. 使用hql当异常查询:Xxx is not mapped[from Xxx where ...]

    采用当今项目hql询问.出现    QingAoCenterInfo is not mapped[from QingAoCenterInfo where...] 显然地Hibernate映射关系出现了 ...

  6. div+js 弹出层

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  7. 简单实现Android平台多语言

    这里,我们认识到两种语言.中国简体和繁体中国. 在res文件建议两个文件夹 values-zh-rCN values-zh-rTW 两个目录下都有一个strings.xml文件. 两个同名文件的字符串 ...

  8. Java 多线程编程两个简单的例子

    /** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...

  9. datatable1.9 与datatable1.10以数据差异

    我还探讨datatable1.10新用途,如果在下面的代码中的错误,欢迎.. 1.10与1.9解释官方网站之间的差异:http://www.datatables.net/upgrade/1.10 看代 ...

  10. cocos2dx 子弹飞作为一个例子来解释解酒效果类CCMotionStreak

    感谢点评与关注,欢迎转载与分享. 勤奋努力,持之以恒! 在游戏开发中,有时会须要在某个游戏对象上的运动轨迹上实现渐隐效果.比方子弹的运动轨迹,假设不借助引擎的帮助.这样的效果则须要通过大量的图片来实现 ...