ZeroMQ系列 之NetMQ

一:zeromq简介

二:NetMQ 请求响应模式 Request-Reply

三:NetMQ 发布订阅模式 Publisher-Subscriber

四:NetMQ 推拉模式 Push-Pull

NetMQ 发布订阅模式 Publisher-Subscriber

1:简单介绍

PUB-SUB模式一般处理的都不是系统的关键数据。发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息。你也不知道订阅者何时开始收到消息。类似于广播,收音机。因此逻辑上,它都不是可靠的。这个可以通过与请求响应模型组合来解决。


图1:简单的发布订阅模式


图2:与请求响应模式组合的发布订阅模式

2:案例

接下来,我们通过写一个天气预报的例子,来说明发布订阅模式。发布端一直在发布大量的天气信息,订阅端通过过滤字段,接收到想要的数据。

使用的NetMQ版本是3.3.2.2

发布端代码:

主程序:

class Program
{
    static void Main(string[] args)
    {
        NetMQPub.Start();
    }
}  

发布类:

public class NetMQPub
{
    readonly static ManualResetEvent _terminateEvent = new ManualResetEvent(false);
    /// <summary>
    /// NetMQ 发布端
    /// </summary>
    public static void Start()
    {
        string[] weathers = new string[6] { "晴朗", "多云", "阴天", "霾", "雨", "雪" };

        Console.WriteLine("发布多个地区天气预报:");

        using (NetMQContext context = NetMQContext.Create())
        {
            using (var publisher = context.CreatePublisherSocket())
            {
                publisher.Bind("tcp://127.0.0.1:5556");

                var rng = new Random();
                string msg;
                int sleeptime = 1000;//1秒

                ///指定发布的时间间隔,1秒
                while (_terminateEvent.WaitOne(1000) == false)
                {
                    //随机生成天气数据
                    int zipcode = rng.Next(0, 99);
                    int temperature = rng.Next(-50, 50);
                    int weatherId = rng.Next(0, 5);

                    msg = string.Format("{0} {1} {2}", zipcode, temperature, weathers[weatherId]);
                    publisher.SendFrame(msg);

                    Console.WriteLine(msg);
                    Thread.Sleep(sleeptime);
                }
            }
        }
    }

    private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        Console.WriteLine("exit……");
        _terminateEvent.Set();
    }
}
   

订阅端代码

主程序:

class Program
{
    static void Main(string[] args)
    {
        NetMQSub.Start();
    }
}

订阅类:

public 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));
                //订阅所有的发布端内容
                //subscriber.Subscribe("");
                while (true)
                {
                    string results = subscriber.ReceiveFrameString(Encoding.UTF8);
                    Console.WriteLine(".");

                    string[] split = results.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    int zip = int.Parse(split[0]);
                    if (zip == zipcode)
                    {
                        OnGetData(results);
                    }
                }
            }
        }
    }

    private static void ProcessData(string message)
    {
        Console.WriteLine("天气情况:" + message);
    }
}

3:总结

  1. 一个发布端可以有多个订阅端
  2. 如果只想要接收指定的数据,订阅端必须要设置过滤字符
  3. 订阅端设置空字符串,订阅所有的发布内容。【You can set topic an empty string to subscribe to everything】
  4. 发布端和订阅端的套接字绑定的地址必须一样的。比如:tcp://127.0.0.1:5556,使用tcp协议,监听端口5556

4:下载

NetMQ3.3.3.1例子
NetMQ3.3.2.2例子

NetMQ(三): 发布订阅模式 Publisher-Subscriber的更多相关文章

  1. 第三节: List类型的介绍、生产者消费者模式、发布订阅模式

    一. List类型基础 1.介绍 它是一个双向链表,支持左进.左出.右进.右出,所以它即可以充当队列使用,也可以充当栈使用. (1). 队列:先进先出, 可以利用List左进右出,或者右进左出(Lis ...

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

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

  3. java 多线程 发布订阅模式:发布者java.util.concurrent.SubmissionPublisher;订阅者java.util.concurrent.Flow.Subscriber

    1,什么是发布订阅模式? 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话 ...

  4. python使用rabbitMQ介绍三(发布订阅模式)

    一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收 ...

  5. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  6. Go RabbitMQ(三)发布订阅模式

    RabbitMQ 在上一节中我们创建了工作队列,并且假设每一个任务都能够准确的到达对应的worker.在本节中我们将介绍如何将一个消息传递到多个消费者,这也就是所说的发布订阅模式 为了验证该模式我们使 ...

  7. RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)

    工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...

  8. redis的发布订阅模式pubsub

    前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...

  9. js设计模式之发布/订阅模式模式

    一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...

随机推荐

  1. sublime 安装插件GitGutter报错,git binary cannot be found等等

    今天给sublime text安装插件GitGutter的时候,居然报错了,网上查找了下解决方法,在此记录下.因为本博主的电脑是windows的,所以这里只能提供windows的方法啦. 解决方法很简 ...

  2. 使用powershell批量添加Keil和IAR的头文件路径

    在Keil和IAR的工程中,为了使文件结构清晰,通常会设置很多的子文件夹,然后将头文件和源文件放在不同的子文件夹中,这样就需要手动添加这些头文件夹的路径.当工程结构非常复杂时,文件夹的数量就非常多,特 ...

  3. 纯css3制作写轮眼开眼及进化过程

    今天是火影忍者(漫画)宣告完结的日子,也是我首发的第一个随笔.看过火影的朋友都知道,写轮眼是什么,这里就不多说了.下面就直接展示整个效果,上张图,先睹为快: 目前已经测试 IE10.Firefox浏览 ...

  4. CentOs 6.5 安装Ganglia步骤

    一 . 说明 Ganglia由gmond.gmetad和gweb三部分组成 gmond(Ganglia Monitoring Daemon)是一种轻量级服务,安装在每台需要收集指标数据的节点主机上.g ...

  5. eclipse建立springMVC 简单项目

    http://jinnianshilongnian.iteye.com/blog/1594806 如何通过eclipse建立springMVC的简单项目,现在简单介绍一下. 工具/原料   eclip ...

  6. HTTP协议 请求篇

    http请求有三部分组成,分别是:请求行.消息报头.请求正文. 1.请求行是以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本,格式如下 : Method Request-URL HTT ...

  7. JavaScript基础(一)之语法、变量、数据类型

    1.JavaScript语法 ①区分大小写 ②弱类型变量 ③每行结尾分号可有可无 ④括号用于代码块 ⑤注释有两种方式(单行和多行注释) 2.JavaScrip变量 ①用Var声明,不要初始化 ②可以在 ...

  8. check用户协议

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目

    博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...

  10. 【备忘】Conky配置

    贴配置: background yes use_xft yes xftfont Sans:size= xftalpha 0.8 update_interval own_window yes own_w ...