Exchange-fanout 广播模式
一、前言
我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生。实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路由到一个或多个Queue中(或者丢弃)。

RabbitMQ中的Exchange有四种类型,不同的类型有着不同的路由策略,RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种。Exchange是按照什么逻辑将消息路由到Queue的?RabbitMQ中通过Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。
- fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
- direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。
- topic类型中所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息
- headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
二、fanout广播模式
之前的例子都基本都是1对1的消息发送和接收,即消息只能发送到指定的queue里,但有些时候你想让你的消息被所有的Queue收到,类似广播的效果,这时候就要用到exchange模式中的fanout。
生产端:
# -*- coding: UTF-8 -*- import pika # 声明一个连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost')) # 声明一个管道
channel = connection.channel() # 声明一个exchange,并命名exchange 和定义它的类型
channel.exchange_declare(exchange='test-exchange',
exchange_type='fanout') # 消息内容
message = 'hello,world!' # 生成一个消息
channel.basic_publish(exchange='test-exchange',
routing_key='', # 设置为空
body=message,
)
print('[x] Sent %r' % message) # 关闭连接
connection.close()
消费端:
# -*- coding: UTF-8 -*- import pika # 创建一个连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
# 创建一个管道
channel = connection.channel() # 声明一个exchange,并命名exchange 和定义它的类型
# 和生产端一致
channel.exchange_declare(exchange='test-exchange',
exchange_type='fanout') # 在这里我们要声明队列
# 虽然在生产端我们没有声明队列,是因为消息是广播的,对所有队列发送
# 在此声明的队列也不用命名,rabbitmq会随机分配名称
# 也是就是说消费端还是要从队列中获取消息内容 result = channel.queue_declare(exclusive=True)
# exclusive=True会在使用此queue的消费者断开后,自动将queue删除 # 队列名
queue_name = result.method.queue # 绑定exchange
channel.queue_bind(exchange='test-exchange',
queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r" % body) channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
生产者产生的消息,每一个消费者都能取到。
注: 广播模式是实时的,也就是说,在生产端产生消息的时候,消费端必须是处于监听状态的,才能从队列中获取消息,否则就收不到本次消息,哪怕再次启动。就像广播电台和收音机一样,广播电台的内容一直播放,如果收音机不打开就收听不到,即使后面打开了,先前的内容也播放完了。
注:
exclusive=True # 消费端只有存在的时候,队列名才会存在,并且exchange会向这个队列中
# 发送消息,一旦消费端关闭,队列queue就会被删除
运行3个消费者,如果关闭一个,rabbitmq中的队列直接被删除了一个

Exchange-fanout 广播模式的更多相关文章
- demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理
//durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...
- Python Rabbit 广播模式
Exchange 在RabbitMQ下进行广播模式需要用到,exchange这个参数,它会把发送的消息推送到queues队列中,exchange必须要知道,它接下来收到的消息要分给谁,是要发给一个qu ...
- RabbitMQ广播模式
广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...
- RabbitMQ基本用法、消息分发模式、消息持久化、广播模式
RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...
- SpringBoot应用操作Rabbitmq(fanout广播高级操作)
一.广播模式fanout.不需要指定路由key. 注:与topic和direct区别是:fanout广播模式会两个队列同时发送相同的消息,并非由交换器转发到某一个队列 二.实战(广播模式) 1.引入m ...
- python---RabbitMQ(2)exchange中订阅者模式fanout<广播>,(一对多,发布一条消息,多人同时接收)
fanout:广播:所有bind到此exchange的queue都可以接受到消息 生产者: # coding:utf8 # __author: Administrator # date: // # / ...
- rabbitmq 交换机模式一 广播模式 fanout
<?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConnect ...
- RabbitMQ之Fanout交换器模式开发
Fanout模式,即广播模式,一个发送到交换机的消息会被转发到与该交换机绑定的所有队列上. 一.Provider 配置文件 spring.application.name=provider sprin ...
- 广播模式下的生产者与消费者fanout模式
生产者 #coding=utf-8 import pika import sys connection = pika.BlockingConnection(pika.ConnectionParamet ...
随机推荐
- Paper Reading - Show and Tell: A Neural Image Caption Generator ( CVPR 2015 )
Link of the Paper: https://arxiv.org/abs/1411.4555 Main Points: A generative model ( NIC, GoogLeNet ...
- 华为ensp使用
网络学习目录 AR是() Auto:自动线 copper:双绞线缆 serial:串行线 pos: 光纤 E1: ATM: CTL: STA: PC: MCS ...
- 7.hdfs工作流程及机制
1. hdfs基本工作流程 1. hdfs初始化目录结构 hdfs namenode -format 只是初始化了namenode的工作目录 而datanode的工作目录是在datanode启动后自己 ...
- springboot 集成 swagger
1. 首先配置swaggerConfigpackage com.lixcx.lismservice.config; import com.lixcx.lismservice.format.Custom ...
- MYSQL报警:Warning: Using a password on the command line interface can be insecure.
问题描述:执行下面的语句,sql是执行成功了,但是出现了一个报警,报警看上去始终不舒服 mysql -hip -Pport -uuser -ppassword -e "use db;dele ...
- UVALive 6912 Prime Switch 暴力枚举+贪心
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 2nd scrum站立会议
scrum站立会议 站立会议是让团队成员每日面对面站立互相交流他们所承担任务的进度.它的一个附带好处是让同组成员了解到工作的情况.本质上是为了团队交流,不是会议报告. 站立会议的目的: 1.让整个团队 ...
- windows下面安装python3遇到的没有添加到环境变量的问题
windows下面安装python3出现的问题 在官网上面下载最新版的安装包进行安装,并勾选Add Python 3.5 to PATH 安装的过程中可能会出现没有添加到PATH路径的情况 默认的安装 ...
- 【转载】mysql建表date类型不能设置默认值
如题,mysql建表date类型的不能设置一个默认值,比如我这样: CREATE TABLE `new_table` ( `biryhday` datetime NULL DEFAULT '1996- ...