rabbitmq学习笔记-----exchange的广播类型(type=fanout)分发机制
- 回顾
前面一章中,我们把每个Message都是deliver到某个Consumer,并没有指定将message发给某个exchange,在没有指定要发送的exchange下,使用了amqp默认的exchange,下图所示:

这篇文章中,我们将会将同一个Message deliver到多个Consumer中。这个模式也被成为 "publish / subscribe"
本节内容要实现的数据流图如下:

这次最主要的区别就是publish通过了exchange而不是routing_key
注意:
我们声明了exchange,但是publish消息到一个不存在的exchange是被禁止的。如果没有queue bindings exchange的话,message是被丢弃的
整个流程大概分为这么几步:
send端:
创建类型为广播的exchange
将消息发送到创建的exchange中
from amqplib import client_0_8 as amqp import sys ##创建con和chanel con = amqp.Connection(host="192.168.1.188:32769", userid="guest", password="guest", virtual_host="/") chan = con.channel() ####创建名为log,type为fanout的exchange chan.exchange_declare(exchange='log', type='fanout') ####创建消息 massage = ' '.join(sys.argv[1:]) msg = amqp.Message(massage) ###发送消息到名为log的exchange,这次不指定routing_key chan.basic_publish(msg,exchange='log',routing_key="") ####关闭 chan.close() con.close()
receive端:
随机创建一个queue
创建一个名为log的exchange
绑定exchange和queue
from amqplib import client_0_8 as amqp import time ##创建con和chanel con = amqp.Connection(host="192.168.1.188:32769", userid="guest", password="guest", virtual_host="/") chan = con.channel() ####随机创建一个queue,并限制该queueu的消费者为独有的 result =chan.queue_declare(exclusive=True) #####创建名为log的typefanout的为exchange chan.exchange_declare(exchange='log',type='fanout') #####绑定queue和exchange chan.queue_bind(queue=result[0],exchange='log') ######定义回调函数 def recv_callback(msg): print('Received: ' + msg.body + ' from channel #' + str(msg.channel.channel_id)) ######开始消费、consume chan.basic_consume(queue=result[0],callback=recv_callback,no_ack=True) #####开始监听 while True: chan.wait() ######取消消费 chan.basic_cancle("testtag") ###关闭连接 chan.close() con.close()
实验:
1、编写两个py文件,内容都为receive的内容,一个为consume_cache,一个为consume_cosole,并且运行它们


2、运行send端内容


可以看到实现了广播效果实现了
文章来源转载于:http://blog.csdn.net/anzhsoft/article/details/19607841

浙公网安备 33010602011771号