《JAVA八股真解》九、分布式
#JAVA##JAVA面经##JAVA内推#
1. RabbitMQ 工作模式
RabbitMQ 是一个开源的消息代理软件,支持多种工作模式,以下是其常见的几种工作模式及其应用场景:
(1)简单模式(Simple Mode)
- 特点:生产者将消息发送到单个消费者。
- 应用场景:适用于简单的任务分发,消息顺序不重要。
(2)工作队列模式(Work Queue Mode)
- 特点:多个生产者将消息发送到一个或多个消费者。
- 应用场景:适用于任务分发,提升系统的并发处理能力。
(3)广播模式(Fanout Mode)
- 特点:消息通过交换机发布到所有绑定的队列,实现广播式消息传递。
- 应用场景:适用于日志收集、通知推送等场景。
(4)路由模式(Routing Mode)
- 特点:消息根据路由键被发送到指定的队列,实现基于规则的消息分发。
- 应用场景:适用于不同业务类型的路由处理,如订单状态变更、用户行为分析等。
(5)主题模式(Topic Mode)
- 特点:消息通过通配符匹配主题,灵活地将消息分发到多个队列。
- 应用场景:适用于需要动态订阅的主题场景,如股票行情、新闻推送等。
总结:RabbitMQ 的五种工作模式分别对应不同的业务需求,选择合适的模式可以有效提升系统的灵活性和可靠性。
2. RabbitMQ 消息可靠性保证(防止消息丢失)
RabbitMQ 提供了多层机制来确保消息的可靠传输,防止消息丢失。
生产者可靠性
- 确认机制(Publisher Confirm):生产者发送消息后,RabbitMQ 会返回确认信息,确保消息已成功投递。
- 事务机制(Transaction):开启事务后,消息发送失败时可回滚,保证数据一致性。
服务端可靠性
- 持久化(Durability):将队列和消息设置为持久化,即使 RabbitMQ 重启也不会丢失数据。
- 镜像队列(Mirrored Queue):在多个节点上复制队列,提高可用性。
消费者可靠性
- 手动确认(Manual Message Acknowledgement):消费者处理完消息后,显式发送 ACK 确认,确保消息不会重复消费。
- 重试机制:对于失败的消息,可配置重试策略,避免因临时故障导致消息丢失。
建议:在高可靠性要求的场景中,应同时启用生产者确认、服务端持久化和消费者手动确认机制。
3. RabbitMQ 死信队列(Dead Letter Queue)
死信队列用于处理无法正常消费的消息,避免消息积压。
常见情况:
- 消息被拒绝(Rejected):消费者拒绝消息且未重新入队。
- 消息过期(Expired):消息在队列中超过 TTL 时间未被消费。
- 队列长度限制(Queue Length Limit):队列达到最大长度,新消息无法进入。
使用方式:
- 配置死信交换机(DLX)和死信队列(DLQ)。
- 设置消息 TTL 和队列长度限制。
- 消费者处理失败时,手动拒绝并设置
requeue=false。
优势:通过死信队列,可以对异常消息进行监控和重试,提升系统健壮性。
4. RabbitMQ 消息重复消费问题
消息重复消费是常见问题,主要由以下原因引起:
- 网络波动:消息发送过程中网络不稳定,导致重复发送。
- 消费者未及时确认:消费者处理消息后未及时发送 ACK,导致消息被重新投递。
- 消费者崩溃:消费者处理消息时崩溃,消息被重新投递。
解决方案:
- 幂等性设计:确保同一消息多次处理结果一致。
- 唯一标识:为每条消息生成全局唯一 ID,避免重复处理。
- 数据库去重:利用数据库唯一约束防止重复插入。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【八股真解】精炼最新高频面经 文章被收录于专栏
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏