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

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

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

  

NetMQ发布订阅C#示例的更多相关文章

  1. NetMQ 发布订阅模式 Publisher-Subscriber

    第一部分引用于:点击打开 1:简单介绍 PUB-SUB模式一般处理的都不是系统的关键数据.发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息.你也不知道订阅者何时开 ...

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

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

  3. javascript设计模式学习之八_发布订阅(观察者)模式

    一.发布订阅模式定义 jQuery中的callbacks,defered,promise本质上就是发布订阅模式的实现.ES6的promise内部实现未开源,不了解具体机制 发布订阅模式又叫做观察者模式 ...

  4. 手把手教你学Dapr - 6. 发布订阅

    上一篇:手把手教你学Dapr - 5. 状态管理 介绍 发布/订阅模式允许微服务使用消息相互通信.生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息.这涉及将它们写入输入通道.同样,消 ...

  5. java/rabbitmp发布订阅示例(转)

    原文:http://www.cnblogs.com/tinmh/p/6134875.html 发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exc ...

  6. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  7. 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

    最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...

  8. RabbitMQ入门教程——发布/订阅

    什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有的订阅者对象,使他们能够自动更新自己的状态. 为了描述这种 ...

  9. redis的发布订阅模式

    概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer {     /* Pubsub */     // 字典,键为频道, ...

随机推荐

  1. 借助Process Explorer定位断电未保存的录音文件

    话说某大神(大婶)开会常偷懒,用Windows自带的录音机进行录音并用记事本记录会议精要却没有点击Ctrl+S的习惯,结果就给我找了今天的难题.(之前都是Office的自动保存在哪里……) 还是一样, ...

  2. Python成长笔记 - 基础篇 (五)

    1.装饰器: 装饰器:器代表函数的意思,装饰器就是一个函数,作用是用来装饰其他的函数 原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 实现装饰器所需要的知识: 1.函数即变量 ...

  3. UILabel和UIButton

    一.UILabel 1.UILabel:标签,主要用来显示文字. 创建步骤: (1)开辟空间并初始化(如果本类有初始化方法,使用自己的,否则,使用负父类的).   UILabel *textLabel ...

  4. Orleans 高级特性-目录

    这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...

  5. 体验应用程序在Mac/iPhone/iPad之间的Handoff

    对于苹果新推出的Handoff功能,之前只体验了接电话的Handoff.一个电话打过来,iPhone/iPad/Mac同时响起,这时如果手上拿着东西在吃,就可以直接在Mac上接电话. 除此之外,还可以 ...

  6. iPhone中修改iMessage关联手机号码的终极方法

    同事换iPhone时,也换了手机号码,从联通的换成移动的.但iPhone激活后,iMessage始终关联的是以前的手机号码,试了很多方法都没解决. 后来在网上找到一段视频-Fix most iMess ...

  7. MySql执行多条语句

    http://www.cppblog.com/fwxjj/archive/2010/08/05/122258.html说是在连接上设置: //链接时设定 mysql_real_connect( ... ...

  8. ueditor样式过滤问题

    1.4.3版本样式过滤处理如下: if (domUtils.isEmptyNode(me.body)) {    //alert("xx");    //me.body.inner ...

  9. paip.获取地理位置根据Ip

    paip.获取地理位置根据Ip html转换txt 正则表达式截取mid 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  10. Leetcode 125 Valid Palindrome 字符串处理

    题意:判断字符串是否是回文字符串 先将所有的字母和数字字符保留,并将大写字母转化成小写字母,然后将字符串倒置,比较前后两个字符串是否相同. 该题最好的解法可以模仿 Leetcode 345 Rever ...