本书汇集了2023年关于阿里开源消息队列RocketMQ面试中常见的50个问题,旨在帮助读者深入理解RocketMQ的工作原理和技术细节。
RocketMQ 是一款高性能、高可用性及分布式的消息中间件,在微服务架构中的消息传递领域应用广泛。以下是基于面试题的关键知识点概述:
1. **消费负载均衡**:
当消费者(Consumer)与队列(Queue)数量不匹配时,RocketMQ 会尝试均匀分配任务,可能导致某些 Consumer 消费多个 Queue 或者闲置的情况出现。因此,在规划 Consumer 和 Queue 数量比例方面需要格外注意,以避免资源浪费和消费效率低下。
2. **处理消息重复消费**:
网络不稳定可能会导致 ACK(确认)信息丢失,进而引发消息的重复消费。
解决方案包括在数据库操作前检查消息主键、使用分布式锁或利用 ConcurrentHashMap 或 Guava Cache 防止数据被多次处理。值得注意的是,在 CLUSTERING 模式下,同一 Group 的 Consumer 只会收到并处理一次消息,但不同 Group 仍可能重复消费。
3. **确保消息顺序**:
要保证消息的有序性,则需确保同 Topic 同 Queue 内的消息按 FIFO(先进先出)原则排列。
发送和接收时应使用单线程模式,并且每个 Queue 应由单一 Consumer 处理,以维持顺序。
4. **指定队列发送消息**:
RocketMQ 提供了 `MessageQueueSelector` 接口允许开发者根据特定算法选择目标 Queue 进行信息传递。
示例代码展示了如何依据奇偶性将消息送入不同 Queue。
5. **保证消息不丢失的策略**:
确保消息完整性需要在 Producer、Broker 和 Consumer 三个层面采取措施。
- 生产者端:使用同步发送机制,设置重试次数,并采用集群部署增强容错能力。
- 中间件端:持久化存储信息以防止网络故障导致的数据丢失。
- 消费者端:确认消息的消费状态(Ack),确保其已被正确处理。
6. **Producer 端避免消息丢失**:
使用 `send()` 方法的同步版本,确保接收到发送结果反馈。此外设置重试次数如 `producer.setRetryTimesWhenSendFailed(10)`,默认为 3 次,并通过集群部署提升系统可用性以应对单点故障问题。
7. **消息可靠性保障**:
RocketMQ 提供了多种策略来保证消息的可靠传输,包括事务消息和死信队列(DLQ)等特性用于异常情况下的处理与恢复机制,确保信息最终被正确接收并执行。
8. **Consumer 端防止消息丢失**:
消费者应准确地完成 Ack 以通知 Broker 已成功消费该条目。
使用 `ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET` 配置可从上次断开的位置继续读取,避免重启后遗漏任何未处理的信息。
9. **RocketMQ 的其他重要特性**:
支持多种消息模型:点对点(P2P)和发布订阅(PubSub)。并且通过批量发送、压缩技术及优化的数据存储方式提高性能。此外还支持分布式事务以实现跨服务间的协调,以及主从复制与集群模式来保证系统的高可用性。
掌握这些知识对于深入讨论 RocketMQ 或者在项目中有效利用它来说是至关重要的。了解其工作原理和最佳实践有助于提升系统效率、减少错误,并确保消息传递的可靠性。