一、介绍
消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列(FIFO,先进先出)。消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息可以很简单,如只包含文本字符串,也可以很复杂,可能包含嵌入对象。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。
二、消息队列架构
队列架构涉及三类角色:
Producer 消息生产者:负责产生和发送消息到 Broker;
Broker 消息处理中心:负责消息存储、确认、重试等,一般其中会包含多个 queue
Consumer 消息消费者:负责从 Broker 中获取消息,并进行相应处理;
生产者发送消息流程:
生产者和 Broker 建立TCP链接;
生产者和 Broker 建立通道;
生产者通过通道消息发送给 Broker,由Broker的Exchange模块将消息进行转发;
Exchange 将消息转发到指定的Queue(队列);
消费者接收消息流程:
消费者和 Broker 建立TCP链接;
消费者和 Broker 建立通道;
消费者监听指定的Queue(队列);
当有消息到达Queue时,Broker默认将消息推送给消费者;
消费者接收到消息;
ack 回复;
三、应用场景
消息队列主要用来暂存生产者生产的消息,供后续其他消费者来消费。主要有两个功能:暂存(存储)、队列(有序:先进先出)。其他大部分场景对数据的消费没有顺序要求,主要用它的暂存能力 。应用场景主要有以下三个:异步处理数据、系统应用解耦、业务流量削峰。
异步处理:目的是减少请求响应时间,实现非核心流程异步化,提高系统响应性能。如生活中送快递的例子;同步:就是快递员把快递送到目的地后,需要联系收货人来签收快递,如果收货人此时有空,那一切都很顺利。但如果收货人此时不方便就白跑一趟或等着;异步:消息队列就充当快递柜,快递员需要送快递时,将快递投到快递柜,然后短信或者电话通知收货人,他就可以继续去派送下一单。而对于收货人而言,也可以根据具体方便的时间来取件。这样一来,二者完全异步了。
应用解耦:使用了消息队列后,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦。
流量削峰:系统的峰值流量大多集中于一小段时间内,为了防止系统在短时间内的峰值流量冲垮,往往采用消息队列来削弱峰值流量,相当于消息队列做了一次缓冲。
四、消费模型
消息到达Broker后,最终还是需要Consumer去消费消息,有两种主要消费模型:单播和广播。单播,就是点到点;而广播,是一点对多点。如果Consumer端把消息消费了,除了需要消息确认,还涉及到比如:重复消息、顺序消息、消息延迟、事务消息等需要考虑的高级特性。
点对点模式:点对点模用于 消息生产者 和 消息消费者 之间 点到点 的通信,包含三个角色:
消息队列(Queue)
发送者(Sender)
接收者(Receiver)
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在 内存 中也可以 持久化,直到他们被消费或超时;消息被消费以后,queue中不再有存储。
发布/订阅模式:消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
消息分类的标签称为topic(主题),一个topic中存放的是同一类消息。