rabbitMQ 基本概念
参考官网教程 https://www.rabbitmq.com/getstarted.html
1 exchange
发送方的接口:寄信邮筒 寄信方的接口。
定义:
channel.exchange_declare(exchange='logs', exchange_type='fanout')
使用:
发信方把消息发到exchange就完事了:
channel.basic_publish(exchange='direct_logs', routing_key=severity, body=message)
routing_key 类似邮编/地址/类型。用于邮局内部发送到不同的queue
2 queue
收信方的接口。家门口的收信箱。 通常1个queue 被1个消费者process订阅处理。
可以不指定队列名字,此时可以得到临时名字。用于后面的binding
result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue
使用时:
每个queue的订阅者,消费这个queque的消息。
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
这样,寄信者只需要知道exchange和提供routing_key, 收信者只定义特定1个queue,实现了发布和订阅的接偶。
3 exchange和queue 之间的关系
类似邮局内部架构,描述 寄信邮桶和收件信箱 建立“多 对 多”的关系
用queue_bind描述
一个queue可以给定exchange和routing_key,投递到exchange_name的,含有这个routing_key的消息会被“”最终投递到这个queue_name的
channel.queue_bind(exchange=exchange_name, queue=queue_name, routing_key='black')
3.1 exchange type
描述对routing_key的处理方式不同:
3.1.1 fanout :
无视routing_key, 发送到exchange_name的消息,简单广播给全部bind的队列
3.1.2 direct
exchange直接根据routing_key把消息发到给定的queue。 又分2种情况:
一个queue可以多次binding不同的routing_key
而同样1个key,也可以绑定到多个key 此时 routing_key=black的消息效果和 fanout一样
3.1.3 topic
多维routing_key,比如同时包含严重性等级和类型的日志 both severity (info/warn/crit...) and facility (auth/cron/kern...
形如stock.usd.nyse 用 .区分
然后,queue用似正则表达式,进行匹配
* 任意1两个.之间的字符
# 0或任意字符(多个.)
如果全都不匹配的,就被丢弃了,具体看 https://www.rabbitmq.com/tutorials/tutorial-five-python.html