1.概念
Erlang 编写的一个开源的消息队列 ,实现了高级消息队列协议(AMQP)
2.核心
- 生产者
 - 消费者
 - 队列(存储消息的缓冲区,遵循先进先出(FIFO)原则。)
 - 交换机(接收生产者发送的消息,并根据规则(路由键、绑定等)将消息分发到队列。)
 - 绑定(定义交换机和队列之间的关系)
 - 消息
 
3.应用场景
- 异步任务处理
 - 解耦
 - 削峰
 - 延迟队列
 - 日志收集与分析
 
4.特点
- 可靠性:支持消息持久化,ACK确认机制,事务
 - 灵活的路由:由交换机实现
 - 多协议支持
 - 管理界面
 
5.对比
- rabbitMQ:适合轻量级业务解耦,灵活易用
 - rocketMQ: 适合强一致,低延迟的金融场景
 - Kafka:适合超高吞吐量,允许延迟的场景
 
6.交换机类型
- direct(默认):精确匹配
 - topic:通配符匹配
 - fanout:广播
 - headers:支持复杂的路由模式(性能差,不推荐)
 
6.有哪些工作模式
- 简单模式 (默认 Direct Exchange)
 - work工作模式(单队列 + 多消费者)
 - 路由模式 (Direct Exchange)
 - 主题模式 (Topic Exchange)
 - 发布订阅 (Fanout Exchange)
 
7.TTL 和 DLX
DLX 是死信交换器,消息在一个队列中变成死信之后,会重新发送到另一个死信交换器,绑定死信交换器的队列就叫死信队列
死信原因:
- 消息被拒
 - 消息TTL过期
 - 队列满了,无法再添加
 
8.rabbitmq如何实现延时队列?
死信交换机+TTL
插件rabbitmq-delayed-message-exchange
9.如何保证消息的可靠性?
- 生产者到MQ:事务机制 或 confirm确认机制(但是二者互斥,且事务性能差)
 - MQ自身:持久化机制(消息,交换机,队列),集群,镜像集群模式
 - MQ到消费者:ACK确认机制,死信队列,失败重试机制
 
10.如何避免重复消费?
业务幂等 + 手动ACK机制
11.如何防止消息堆积?
生产者限流 + 消费者扩容 + 配置TTL和死信队列