面试题答案
一键面试应用方式
- 事务发起阶段:生产者发送半消息(Prepare Message),RocketMQ会响应消息是否发送成功。此半消息对消费者不可见。
- 本地事务执行:生产者执行本地事务。若本地事务成功,向RocketMQ发送Commit消息,若失败则发送Rollback消息。
- 消息投递与消费:RocketMQ根据收到的Commit或Rollback消息决定是否投递消息给消费者。若为Commit,且是顺序消息,RocketMQ会按照消息发送顺序投递到特定队列,消费者按顺序消费以保证事务顺序性。
挑战
- 消息顺序性保障:在分布式环境下,网络延迟、节点故障等可能导致消息乱序。比如不同分区的消息可能由于处理速度不同,先处理后发送的消息,后处理先发送的消息。
- 事务一致性:本地事务执行状态与消息状态可能不一致。例如本地事务成功但Commit消息发送失败,或本地事务失败但Rollback消息发送失败。
- 高并发处理:顺序消息按顺序消费,在高并发场景下,可能会导致消费端处理速度跟不上,造成消息堆积。
解决方法
- 消息顺序性保障:
- 合理分区:将相关业务数据发送到同一队列,确保同一业务流程的消息在一个队列中顺序处理。
- 生产者端保证:发送消息时按照业务逻辑顺序发送,避免并行发送导致乱序。
- 事务一致性:
- 回查机制:RocketMQ提供事务状态回查功能,当RocketMQ长时间未收到Commit或Rollback消息时,会主动回查生产者本地事务状态,生产者根据本地事务记录返回正确状态。
- 日志记录:生产者和消费者都记录事务日志,便于排查和恢复不一致状态。
- 高并发处理:
- 优化消费逻辑:减少消费端业务逻辑复杂度,提高单个消息处理速度。
- 并行消费优化:在不影响业务逻辑的前提下,对消息进行分组并行消费,比如将不同业务模块的消息分不同队列并行处理。