RabbitMQ消息模型的核心理念是:发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不知道消息是否已经被投递到队列。
发布者(producer)只需要把消息发送给一个交换机(exchange)。交换机非常简单,它一边从发布者方接收消息,一边把消息推送到队列。交换机必须知道如何处理它接收到的消息,是应该推送到指定的队列还是是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的。
有几个可供选择的交换机类型:直连交换机(direct), 主题交换机(topic), (头交换机)headers和 扇型交换机(fanout)。我们在这里主要说明最后一个 —— 扇型交换机(fanout)。先创建一个fanout类型的交换机,命名为logs:
扇型交换机(fanout)很简单,你可能从名字上就能猜测出来,它把消息发送给它所知道的所有队列。
'''
消息发布者
利用fanout扇型交换机,实现网络多播功能
只要订阅者订阅了目前交换机,都能收到发布的消息
'''
import pika
exchangename = "test01"
if __name__ == '__main__':
connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.1.116"))
channel = connection.channel()
#定义一个交换机
channel.exchange_declare(exchange=exchangename, #交换机名字
exchange_type = "fanout", #交换机类型
)
channel.basic_publish(exchange=exchangename,
routing_key="", #不指定队列名字,意思就是发布到所有绑定在该台交换机队列
body="begin test")
connection.close()
'''
消息订阅者
利用fanout扇型交换机,实现网络多播功能
只要订阅者订阅了目前交换机,都能收到发布的消息
队列名字已经没有多少用处
'''
import pika
exchangename = "test01"
if __name__ == '__main__':
connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.1.116"))
channel = connection.channel()
#定义交换机
channel.exchange_declare(exchange=exchangename,
type="fanout")
#定义一个随机名字队列
result = channel.queue_declare(exclusive=True) #系统随机生成队列名字,并返回
queue_name = result.method.queue
#绑定队列到交换器上
channel.queue_bind(exchange=exchangename,
queue=queue_name)
def callback(ch,method,properties,body):
print(body)
channel.basic_consume(callback,
queue=queue_name,
no_ack=False)
channel.start_consuming()