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实现,所以速度很快
下面是订阅发布的示例代码:
发布服务端:
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();
}
}
订阅客户端,可启动多个实例来模拟接收天气信息:
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);
}
}
NetMQ发布订阅C#示例的更多相关文章
- NetMQ 发布订阅模式 Publisher-Subscriber
第一部分引用于:点击打开 1:简单介绍 PUB-SUB模式一般处理的都不是系统的关键数据.发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息.你也不知道订阅者何时开 ...
- NetMQ(三): 发布订阅模式 Publisher-Subscriber
ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...
- javascript设计模式学习之八_发布订阅(观察者)模式
一.发布订阅模式定义 jQuery中的callbacks,defered,promise本质上就是发布订阅模式的实现.ES6的promise内部实现未开源,不了解具体机制 发布订阅模式又叫做观察者模式 ...
- 手把手教你学Dapr - 6. 发布订阅
上一篇:手把手教你学Dapr - 5. 状态管理 介绍 发布/订阅模式允许微服务使用消息相互通信.生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息.这涉及将它们写入输入通道.同样,消 ...
- java/rabbitmp发布订阅示例(转)
原文:http://www.cnblogs.com/tinmh/p/6134875.html 发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exc ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题
最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...
- RabbitMQ入门教程——发布/订阅
什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有的订阅者对象,使他们能够自动更新自己的状态. 为了描述这种 ...
- redis的发布订阅模式
概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道, ...
随机推荐
- 诡异的too manany connections报错
问题现象: 应用重启,日志里面报错too manany connections 问题分析: 昨天割接,线上该业务线应用全部重启,一个有38个应用,每个应用3台服务器,每台服务器启动5个链接: num= ...
- 新浪微博SDK的使用
花了两天时间研究了一下新浪微博SDK,遇到了不少问题,有必要整理一下 1.首先下载下weiboSdk,导入weiboSDKD和weiboSDKDemo两个项目,这时发现导入的weiboSDKDemo项 ...
- win7连接共享打印机 错误为
1. xp局域网共享打印机,本机运行 –> \\共享电脑ip –> 选择驱动目录 .INF 文件 –> 确认. 直接报错..... 2. 参考方法: 开始——设备和打印机——添 ...
- Android开发学习总结——Android开发的一些相关概念
一.什么是3G.4G 1995年问世的第一代模拟制式手机(1G)只能进行语音通话. 1996到1997年出现的第二代GSM.CDMA等数字制式手机(2G)便增加了接收数据的功能 3G指的是第三代移 ...
- spring mvc 配置对静态资源的访问
在spring mvc的配置文件中做如下配置: 1. <?xml version="1.0" encoding="UTF-8"?> <bean ...
- JSP JSTL EL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> Html代码 复制代 ...
- 将Eclipse代码导入到AndroidStudio的两种方式
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4183553.html 说到使用AndroidStudio,除 ...
- django with mysql (part-3)
step01: write second view-function vim views.py step02: configure your ( urls.py ) vim urls.py step0 ...
- SQL Server 添加链接服务器
背景 在SQL SERVER中,如果我们查询数据库需要关联另外一台数据库中表,在这种情况下我们可以通过添加服务器链接来实现. 案列 方式1.sql server 提供了图形化界面,如下: 右键> ...
- D. Book of Evil
D. Book of Evil time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...