Exchange-fanout 广播模式
2018-06-18 00:21:24来源:未知 阅读 ()
一、前言
我们看到生产者将消息投递到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中的队列直接被删除了一个
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:python-时间模块
- 单例模式 2019-07-24
- python学习-36 文件处理b模式 2019-07-24
- python 之 面向对象(元类、__call__、单例模式) 2019-07-24
- python 单例模式 2019-07-24
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash