上面一篇是說到了工作佇列,每次訊息都只會傳送給其中乙個接收端,如果需要將訊息廣播出去,讓每個接收端都能收到,那麼就要使用交換機。
交換機的工作原理:訊息傳送端先將訊息傳送給交換機,交換機再將訊息傳送到繫結的訊息佇列,而後每個接收端都能從各自的訊息佇列裡接收到資訊。
rabbitmq交換機工作原理
下面用send.py和receive.py來模擬實現交換機的功能。send.py表示傳送端,receive.py表示接收端。
receive.py**分析
和第一篇裡的receive.py相比,主要是做了兩個改動:
#!/usr/bin/env python
#coding=utf8
importpika
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)
defcallback(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
importpika
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就不需要設定了。
exchange如果為空,表示是使用匿名的交換機,在上面交換機資訊的中可以看到有amq.*這樣的交換機,就是系統預設的交換機了。routing_key在使用匿名交換機的時候才需要指定,表示傳送到哪個佇列的意思。第一篇的例子演示了這個功能。
開啟另外乙個終端,執行send.py,可以觀察到receive.py接收到了訊息。如果有多個終端執行receive.py,那麼每個receive.py都會接收到訊息。
參考文章:
mac 使用docker 安裝 rabbitmq
專案要用到rabbitmq 官網說brew install 但是brew update就半天都不成功,突然想起了docker,以前用過一點點,就試著來了一下 docker search rabbitmq management docker pull rabbitmq management docke...
CentOS 使用yum安裝rabbitmq
rabbitmq erlang版本要求 rabbitmq erlang name rabbitmq erlang baseurl gpgcheck 1 gpgkey repo gpgcheck 0 enabled 1 然後執行 sudo yum install erlang 即可安裝 執行 erl ...
erlang jcl遠端除錯 rabbitmq
job control mode jcl in which jobs can be started,stopped,detached or connected.only the current job can communicate with the shell.通過jcl,我們可以遠端接入乙個er...