02_MQ常见问题
文章目录
- 消息队列(MQ)常见问题解析
- 1. 什么是消息队列?
- 2. 为什么使用消息队列?
- 3. 消息队列的使用场景
- 4. 常见消息队列系统
- 5. RabbitMQ核心概念
- 6. 如何保证消息可靠性
- 生产者保证消息不丢失
- 消息队列保证消息不丢失
- 消费者保证消息不丢失
- 7. 如何处理消息积压
- 8. 如何保证消息顺序性
- 9. 如何处理消息重复消费
- 10. 消息队列高可用实现
消息队列(MQ)常见问题解析
1. 什么是消息队列?
消息队列(MQ)是一种应用程序对应用程序的通信方法,允许独立的应用程序通过读写出入队列的消息来进行通信,而不需要彼此直接交互。它由生产者(Producer)、代理(Broker)、消费者(Consumer)三者组成,采用生产者-消费者模型。
2. 为什么使用消息队列?
主要优点包括:
- 解耦:生产者和消费者可以独立运行,无需直接相互依赖
- 异步通信:生产者可以立即发送消息,消费者可以在方便时处理
- 流量削峰:控制系统的流量,防止系统过载
- 消息持久化:防止系统崩溃时丢失数据
- 顺序保证:保证消息按照发送顺序被处理
3. 消息队列的使用场景
- 应用解耦:将相关但耦合度不高的系统联系起来
- 流量削峰:处理大流量入口的业务,如秒杀系统
- 异步处理:减少响应时间,如注册发送验证码、下单通知等
- 消息通讯:实现点对点消息队列、聊天室等
- 远程调用
4. 常见消息队列系统
- RabbitMQ:基于AMQP协议,适合中小型公司、低吞吐量场景
- Kafka:高吞吐量,适合大数据场景
- RocketMQ:阿里巴巴开源,适合大型公司
- ActiveMQ:较早期的消息队列系统
5. RabbitMQ核心概念
- Broker:一个或多个erlang node的逻辑分组
- Cluster:在broker基础上,增加node间共享元数据的约束
- Channel:实际进行路由工作的实体,负责按照routing_key投递消息
- Exchange:保存binding关系的查找表
- Queue:具有自己的erlang进程
- vhost:虚拟broker,拥有独立的权限系统
6. 如何保证消息可靠性
生产者保证消息不丢失
- 事务机制:吞吐量下降,不推荐
- Confirm模式:异步确认消息是否到达队列
消息队列保证消息不丢失
- 持久化存储:将queue的durable设置为true
- ACK机制:消息持久化至磁盘后再发送ack
消费者保证消息不丢失
- 手动ACK:消费者处理完消息后手动确认
- 重试机制:连接中断时重新分发消息
7. 如何处理消息积压
- 增加消费者数量
- 优化消费者处理逻辑
- 设置合理的队列长度,超过时抛弃请求或跳转错误页面
8. 如何保证消息顺序性
- 单队列单消费者模式
- 消息分组机制
- 在消费者端实现顺序处理逻辑
9. 如何处理消息重复消费
- 实现幂等性处理
- 使用唯一ID去重
- 业务逻辑上处理重复消息
10. 消息队列高可用实现
- 集群部署
- 镜像队列
- 多副本机制