NetMQ(三): 发布订阅模式 Publisher-Subscriber
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:总结
- 一个发布端可以有多个订阅端
- 如果只想要接收指定的数据,订阅端必须要设置过滤字符
- 订阅端设置空字符串,订阅所有的发布内容。【You can set topic an empty string to subscribe to everything】
- 发布端和订阅端的套接字绑定的地址必须一样的。比如:tcp://127.0.0.1:5556,使用tcp协议,监听端口5556
4:下载
NetMQ(三): 发布订阅模式 Publisher-Subscriber的更多相关文章
- 第三节: List类型的介绍、生产者消费者模式、发布订阅模式
一. List类型基础 1.介绍 它是一个双向链表,支持左进.左出.右进.右出,所以它即可以充当队列使用,也可以充当栈使用. (1). 队列:先进先出, 可以利用List左进右出,或者右进左出(Lis ...
- NetMQ 发布订阅模式 Publisher-Subscriber
第一部分引用于:点击打开 1:简单介绍 PUB-SUB模式一般处理的都不是系统的关键数据.发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息.你也不知道订阅者何时开 ...
- java 多线程 发布订阅模式:发布者java.util.concurrent.SubmissionPublisher;订阅者java.util.concurrent.Flow.Subscriber
1,什么是发布订阅模式? 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话 ...
- python使用rabbitMQ介绍三(发布订阅模式)
一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收 ...
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- Go RabbitMQ(三)发布订阅模式
RabbitMQ 在上一节中我们创建了工作队列,并且假设每一个任务都能够准确的到达对应的worker.在本节中我们将介绍如何将一个消息传递到多个消费者,这也就是所说的发布订阅模式 为了验证该模式我们使 ...
- RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)
工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...
- redis的发布订阅模式pubsub
前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...
- js设计模式之发布/订阅模式模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
随机推荐
- api签名
当你提交以上信息时,办公逸将发送GET请求到填写的URL,GET请求将携带四个参数, 参数 描述 是否必带 signature 办公逸签名,signature结合了企业填写的token,请求中的tim ...
- 代码质量管理工具——SonarQube
写在前面 SonarQube(简称Sonar)是管理代码质量的开放平台,它可以快速地对代码质量进行分析,并给出合理的解决方案,提高管理效率,保证代码质量. SonarQube的流行,在于以下几点: 开 ...
- iOS面试题
一个区分度很大的面试题 考察一个面试者基础咋样,基本上问一个 @property 就够了: @property 后面可以有哪些修饰符? 线程安全的: atomic,nonatomic 访问权限的 re ...
- centos7 使用updatedb和locate命令
centos7默认是没有安装mlocate的,所以无法使用这两个命令 yum install mlocate 就可以了 参考:https://fedorahosted.org/mlocate/
- 使用Docker Mysql 5.7
Mysql已经提供了Docker image,可以很方便开启一个mysql服务器.官方介绍了两种连接方式, 在其他App Docker 容器中通过--link访问Mysql服务端容器 启动另外一个My ...
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- php中计算二维数组中某一元素之和
[0] => array(5) { ["id"] => string(2) "11" ["name"] => string ...
- setprecision **fixed
#include <iostream> #include <iomanip> using namespace std; int main( void ) { const dou ...
- 9个基于Java的搜索引擎框架
在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广 ...
- Design Tiny URL
Part 1: 前言: 最近看了一些关于短址(short URL)方面的一些博客,有些博客说到一些好的东西,但是,也不是很全,所以,这篇博客算是对其它博客的一个总结吧. 介绍: 短址,顾名思义,就是把 ...