消息队列
1. 什么是消息队列?
消息队列(Message Queue,简称MQ)是在消息的传输过程中保存消息的容器,本质是个队列。消息(Message)是指在应用之间传送的数据,可以是文本字符串、嵌入对象等。
-
Producer:消息生产者,负责产生和发送消息到 Broker。
-
Broker:消息处理中心,负责消息存储、确认、重试等,一般包含多个 queue。
-
Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理。
常见的MQ组件有ActiveMQ、RabbitMQ、RocketMQ、Kafka等。
2. 为什么用消息队列?
(1)异步处理
消息队列的主要特点是异步处理请求,减少请求响应时间,实现非核心流程异步化,提高系统响应性能。
(2)流量削峰
将短时间高并发产生的事务消息存储在消息队列中,削平高峰期的并发事务,缓解系统压力。
(3)应用解耦
上下游应用之间不使用接口调用,上游应用只负责生产消息,不需要考虑消息被哪个下游应用消费。
3. 使用消息队列带来什么问题?
(1)系统可用性降低
(2)系统复杂性提高
(3)一致性问题(分布式事务)
4. 消息队列的消息模式?
MQ基础的消息交互模式有两个,点对点和发布/订阅。
(1)点对点模式
消息生产者发送消息到queue,只会有一个消息消费者从queue中消费该消息。
(2)发布/订阅模式
消息生产者发布消息到topic,由订阅topic的多个消费者消费该消息。
5. 如何保证消息队列的高可用?
RabbitMQ 基于主从架构,使用镜像集群模式来实现高可用。每个 RabbitMQ 节点都有 queue 的完整镜像,包含 queue 的全部数据。每次写消息到 queue,都会自动把消息同步到其他节点。
6. 常见的几种MQ对比
ActiveMQ | RabbitMQ | RocketMQ | Kafka | |
开发语言 | Java | Erlang | Java | Scala |
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级 |
时效性 | ms级 | us级 | ms级 | ms级 |
可用性 | 高(主从架构) | 高(主从架构) | 非常高(分布式架构) | 非常高(分布式架构) |
功能特性 | Apache项目,更新速度慢,队列数较多时支持不好 | 高并发,性能很好,但不利于二次开发和维护 | 阿里项目,性能、稳定性很好 | Apache子项目,高性能分布式发布/订阅消息队列,日志领域成熟 |