RabbitMQ---Publish/Subscribe

官网地址:https://www.rabbitmq.com/tutorials/tutorial-three-python.html

RabbitMQ---Publish/Subscribe_第1张图片
work queues 中的一条消息只能发送给一个消费者。
publish/subscribe 中的一条消息可同时发送给多个消费者。

emit_log.py

#!/usr/bin/env python
import pika
import sys

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

# fanout 类型的 exchange 会向所有的 queue 广播消息
channel.exchange_declare(exchange='logs', exchange_type='fanout')

message = ' '.join(sys.argv[1:]) or "info: Hello World!"

# 向名为 logs 的 exchange 发送消息
channel.basic_publish(exchange='logs', routing_key='', body=message)

print(" [x] Sent %r" % message)
connection.close()

receive_logs.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='logs', exchange_type='fanout')

# 不指定 queue 名称,这样的话,每当连上 Rabbit 时,都会创建一个 queue
# exclusive = True	当消费者退出时,queue 会被删除
result = channel.queue_declare(queue='', exclusive=True)

queue_name = result.method.queue

# 将 exchange 与 queue 绑定
# 名为 logs 的 exchange 会将消息添加到 queue
channel.queue_bind(exchange='logs', queue=queue_name)

print(' [*] Waiting for logs. To exit press CTRL+C')

def callback(ch, method, properties, body):
    print(" [x] %r" % body)

channel.basic_consume(
    queue=queue_name, on_message_callback=callback, auto_ack=True)

channel.start_consuming()

运行结果

$ python3 receive_logs.py
 [*] Waiting for logs. To exit press CTRL+C
 [x] b'info: Hello World!'
$ python3 receive_logs.py
 [*] Waiting for logs. To exit press CTRL+C
 [x] b'info: Hello World!'
$ python3 emit_log.py
 [x] Sent 'info: Hello World!'
 
$ sudo rabbitmqctl list_bindings
Listing bindings ...
logs    exchange        amq.gen-R1P8GifoaSIZS6nFFusapQ  queue   amq.gen-R1P8GifoaSIZS6nFFusapQ  []
logs    exchange        amq.gen-mpKNfVX9X7vsHXMzcWx7HA  queue   amq.gen-mpKNfVX9X7vsHXMzcWx7HA  []
...done.

你可能感兴趣的:(RabbitMQ)