上面一篇是說到了工作佇列,每次訊息都只會發送給其中一個接收端,如果需要將訊息廣播出去,讓每個接收端都能收到,那麼就要使用交換器。
交換機的工作原理:訊息發送端先將訊息傳送給交換機,交換機再將訊息傳送到綁定的訊息佇列,而後每個接收端都能從各自的訊息佇列接收訊息。
rabbitmq交換器工作原理
下面用send.py和receive.py來模擬實現交換器的功能。 send.py表示發送端,receive.py表示接收端。
receive.py代碼分析
和第一篇裡的receive.py相比,主要是做了兩個改動:
定義機
佇列,並綁定到交換器上
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #随机生成队列,并绑定到交换机上 result= channel.queue_declare(exclusive=True) queue_name= result.method.queue channel.queue_bind(exchange='messages', queue=queue_name) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
上例程式碼中,queue_declare的參數exclusive=True表示當接收端退出時,銷毀臨時產生的佇列,這樣就不會佔用資源。執行這個程序,然後使用rabbitmqctl list_exchanges指令來查看交換器資訊:
rabbitmq交換器資訊查看
其中紅色框就是上例定義的交換器了。再使用rabbitmqctl list_queues查看下訊息佇列情況:
rabbitmq佇列資訊查看
其中紅色框就是隨機產生的訊息佇列了。
send.py代碼分析
和第一篇的send.py相比,也只做了兩個改動:
定義交換機 不是將訊息發送到隊列到交換器
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #将消息发送到交换机 channel.basic_publish(exchange='messages', routing_key='', body='Hello World!') print " [x] Sent 'Hello World!'" connection.close()上例代碼中, basic_publish方法的參數exchange被設定為對應交換機,因為是要廣播出去,發送到所有佇列,所以routing_key就不需要設定了。