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

 

posted @ 2022-03-06 08:14  永远的幻想  阅读(44)  评论(0编辑  收藏  举报