RabbitMQ (五) 订阅者模式之分发模式 ( fanout )
前面讲到了简单队列和工作队列.
这两种队列有个非常明显的缺点 : 生产者发送的消息,只能进入到一个队列.
消息只能进入到一个队列就意味着消息只能被一个消费者消费.
尽管工作队列模式中,一个队列中的消息可以被多个消费者消费,但是,具体到每一条消息,却只能被一个消费者消费.
如果想要一个消息被多个消费者消费,那么生产者就必须把这条消息发送到多个队列中去.
RabbitMQ 在这个点的设计是 :
在生产者和队列两者之间加入了一个叫做"交换机"的东西.
生产者发送消息时,不直接发送到队列,而是发送到"交换机"(其实简单队列和工作队列也是这样的...前面的文章有提到,它们用的是默认的交换机).
"交换机"再根据声明的类型(fanout,direct,topic,headers),转发给符合要求的队列.

这里有个非常重要的知识点:
交换机只是一个"中转的机器",它不是一个消息队列,它没有存储消息的能力.这点很重要!
这意味着,当生产者把消息发送给某个交换机时,如果这时候,这个交换机没有被任何队列绑定,那么这些消息将会丢失!
这种利用交换机,将消息"发送"到多个队列的模式叫做 : 订阅者模式.
这篇文章主要介绍订阅者模式中的分发模式,
这种模式下,消息会被所有消费者消费.也就是说,只要是"绑定"到某个交换机的队列,都会收到生产者发送到该交换机的消息.
生产者
public class Producer
{
/// <summary>
/// 交换机名称
/// </summary>
private const string ExchangeName = "test_exchange_fanout"; public static void Send()
{
IConnection connection = ConnectionHelper.GetConnection();
IModel channel = connection.CreateModel(); //声明交换机,第2个参数为交换机类型
channel.ExchangeDeclare(ExchangeName, "fanout", false, false, null); for (int i = ; i < ; i++)
{
string msg = "hello world " + i;
//第2个参数为路由键,这种模式显然不需要路由键了,因为我们是把消息发送到所有绑定到该交换机的队列.
channel.BasicPublish(ExchangeName, "", null, Encoding.Default.GetBytes(msg));
Console.WriteLine($"send {msg}");
}
channel.Close();
connection.Close();
}
}
消费者1
public class Consumer1
{
private const string QueueName = "test_exchange1_queue";
private const string ExchangeName = "test_exchange_fanout"; public static void Receive()
{
IConnection connection = ConnectionHelper.GetConnection();
IModel channel = connection.CreateModel();
channel.QueueDeclare(QueueName, false, false, false, null); //将队列绑定到交换机上
channel.QueueBind(QueueName, ExchangeName, "", null); //添加消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string str = Encoding.Default.GetString(bytes);
Console.WriteLine("consumer1 : " + str);
}; channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
}
}
消费者2
只有这两句不一样
private const string QueueName = "test_exchange2_queue";
Console.WriteLine("consumer2 : " + str);
运行结果就不上图.
RabbitMQ (五) 订阅者模式之分发模式 ( fanout )的更多相关文章
- rabbitmq五种模式详解(含实现代码)
一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...
- 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式
前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...
- RabbitMQ (七) 订阅者模式之主题模式 ( topic )
主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...
- Java使用RabbitMQ之订阅分发(Topic)
使用RabbitMQ进行消息发布和订阅,生产者将消息发送给转发器(exchange),转发器根据路由键匹配已绑定的消息队列并转发消息,主题模式支持路由键的通配. 生产者代码: package org. ...
- Azure 负载平衡器新分发模式
Yves Pitsch Azure 网络首席项目经理 Azure负载平衡器是一种第四层(TCP.UDP)类型的负载平衡器,它可以将传入流量分发到云服务中正常运行的服务实例上,或者分发到负载平衡器集内所 ...
- 十五、命令(Command)模式--行为型模式(Behavioral Pattern)
命令模式又称为行动(Action)模 式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派 ...
- 【RabbitMQ】3、工作队列模式(work模式)
上一篇博客的作为rabbitMQ的入门程序,也是简单队列模式,一个生产者,一个消费者,今天这篇博客介绍work模式,一个生产者,多个消费者,下面的例子模拟两个消费者的情况. 图示: 一 ...
- 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...
- (五:NIO系列) Reactor模式
出处:Reactor模式 本文目录 1. 为什么是Reactor模式 2. Reactor模式简介 3. 多线程IO的致命缺陷 4. 单线程Reactor模型 4.1. 什么是单线程Reactor呢? ...
随机推荐
- 【2017.12.22.A】
A 题面: 给一个n个点m条边的无向图,你可以选择一个点作为起点,然后沿着图中的边开始走,走的过程中,同一条边不能经过两次(相反的方向也不行). ...
- [学习笔记]Tarjan&&欧拉回路
本篇并不适合初学者阅读. SCC: 1.Tarjan缩点:x回溯前,dfn[x]==low[x]则缩点. 注意: ①sta,in[]标记. ②缩点之后连边可能有重边. 2.应用: SCC应用范围还是很 ...
- Angular 遍历循环数组
var app = angular.module('Mywind',['ui.router']) app.controller('Myautumn',function($scope,$http,$fi ...
- Win10的WSL很好用呀
WSL全名是Windows Subsystem for Linux,是win10版本号16xx之后推出的开发者功能,提供了如原生linux版的体验. 最近最新的win10春季版1803出来了,安装了看 ...
- 如何用listview显示服务端数据
https://www.cnblogs.com/caobotao/p/5061627.html
- gitlab7.2安装
系统:centos6.4 1.安装依赖包 导入epel: useradd git wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-rel ...
- 在Ubuntu下编译WebKit源码--qt
转载自:http://www.cnblogs.com/panderen/archive/2011/10/18/2216154.html 在朋友的介绍下有幸認识了WebKit这个让人心动的开源浏览器内核 ...
- a标签的download属性简介
最近在工作中需要一个前端直接下载静态文件的需求,之前有粗略的了解过a标签的download属性,通过download和href属性可以实现文件的下载. 简介 HTML <a> 元素 (或锚 ...
- SpringMVC异常报406 (Not Acceptable)的解决办法
使用SpsringMVC,使用restEasy调试,controller请求设置如下: @RequestMapping(value="/list",method=RequestMe ...
- 我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。
把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 2016.7.18 refactor s ...