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

  

posted @ 2016-06-03 17:42  rcj_飞翔  阅读(487)  评论(0)    收藏  举报