上面一篇是說到了工做隊列,每次消息都只會發送給其中一個接收端,若是須要將消息廣播出去,讓每一個接收端都能收到,那麼就要使用交換機。python
交換機的工做原理:消息發送端先將消息發送給交換機,交換機再將消息發送到綁定的消息隊列,然後每一個接收端都能從各自的消息隊列裏接收到信息。app
rabbitmq交換機工做原理spa
下面用send.py和receive.py來模擬實現交換機的功能。send.py表示發送端,receive.py表示接收端。code
receive.py代碼分析cdn
和第一篇裏的receive.py相比,主要是作了兩個改動:blog
1rabbitmq 2隊列 3圖片 4ci 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
上例代碼中,queue_declare的參數exclusive=True表示當接收端退出時,銷燬臨時產生的隊列,這樣就不會佔用資源。運行這個程序,而後使用rabbitmqctl list_exchanges命令來查看交換機信息:
rabbitmq交換機信息查看
其中紅色框就是上例定義的交換機了。再使用rabbitmqctl list_queues查看下消息隊列狀況:
rabbitmq隊列信息查看
其中紅色框就是隨機產生的消息隊列了。
send.py代碼分析
和第一篇的send.py相比,也只作了兩個改動:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
上例代碼中, basic_publish方法的參數exchange被設定爲相應交換機,由於是要廣播出去,發送到全部隊列,因此routing_key就不須要設定了。
exchange若是爲空,表示是使用匿名的交換機,在上面交換機信息的圖片中能夠看到有amq.*這樣的交換機,就是系統默認的交換機了。routing_key在使用匿名交換機的時候才須要指定,表示發送到哪一個隊列的意思。第一篇的例子演示了這個功能。
打開另一個終端,執行send.py,能夠觀察到receive.py接收到了消息。若是有多個終端執行receive.py,那麼每一個receive.py都會接收到消息。