是什么?
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。
优点:
稳定,支持高可用的队列
基于中央节点,在路由,均衡负载,消息持久化的应用都很方便
支持多种协议的消息传送
支持多种语言的客户端
安装 启动
sudo apt install rabbitmq-server
sudo apt update
sudo service rabbitmq-server start
sudo service rabbitmq-server stop
使用步骤:
send:
- 创建到rabbitmq的connection
- 创建通道channel
- 创建队列
- 发送信息(声明发送到的exchange和queue)
- 关闭连接
receive:
- 创建到rabbitmq的connection
- 创建通道channel
- 创建队列(防止send没有启动而导致失败)
- 创建consumer,声明回调函数、queue等参数
- 接收消息
备注:
ack标示为true时,代表发送一次就删除,当receive故障时可能会造成消息丢失,而false时会等待发送结果,如果失败会重新发送)
basic.qos:代表调度规则,每次发送n条消息到消费端
交换机规则:
"发布者(producer)只需把消息发送给一个交换机(exchange )。交换机非常简单,它一边从发布者接收消息,一边把消息消息推送到队列。交换机必须知道如何处理它接收的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的。"
发布订阅:所有交换机绑定的队列都可以接收到发布者发布给交换机的信息(广播)
重点:channel.exchange_declare(exchange='exchange_name', type='exchange_type' // 交换机定义
channel.queue_bind(exchange='exchange_name', queue=queue_name) //队列与交换机绑定
路由:在绑定交换机与队列时,通过routing_key的不同将消息路由到不同的消费方
重点:channel.exchange_declare(exchange='logs', type='direct') // 交换机定义,type是直连
channel.basic_publish(exchange='logs',routing_key='info',body=message) //消息发布 channel.queue_bind(exchange=exchange_name,queue=queue_name,routing_key='info') //消费绑定
主题:类似于模糊路由,可以设置多个topic,不同组合由不同的消费方处理
* :可以替代一个单词
#:可以替代0或者更多的单词
当一个队列的绑定键为 "#" ,这个队列将会无视消息的路由键,接收所有的消息。
当 * 和 # 这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为。
重点:channel.exchange_declare(exchange='logs', type='topic') //交换机定义,type为topic
routing_key = 'aa.error' // 路由key定义
channel.basic_publish(exchange='logs',routing_key=routing_key, body=message) //消息发布
binding_key='*.error' //绑定key定义(模糊匹配)
channel.queue_bind(exchange=exchange_name,queue=queue_name,routing_key=binding_key) //消费绑定