面试题答案
一键面试- 消息发送
- 半消息机制:
- 生产者首先向RocketMQ发送半消息(Half Message)。此时消息对消费者不可见。这种机制确保了在事务未提交前,消息不会被消费者消费,从而避免因事务未完成而导致的数据不一致。例如,在电商下单场景中,下单事务未完成时,库存扣减等相关消息不会被处理。
- 消息回查:
- RocketMQ提供消息回查功能。如果RocketMQ长时间未收到事务状态,会主动向生产者回查事务状态。生产者需要实现事务状态回查接口,根据本地事务执行结果返回相应状态(提交、回滚或未知)。例如,在银行转账场景中,若转账事务处理时间较长,RocketMQ回查时,生产者可查询本地数据库确认转账事务是否成功,进而告知RocketMQ相应状态。
- 半消息机制:
- 消息处理
- 幂等性处理:
- 消费者在处理消息时要实现幂等性。即对于重复消费的消息,处理结果应与首次消费一致。常见的实现方式有:
- 数据库唯一键:在插入数据时,利用数据库的唯一键约束。例如在订单表中,订单编号设为唯一键,多次插入相同订单编号的数据时,数据库会报错,消费者捕获异常并认为消息已处理成功。
- 状态机控制:维护业务状态,根据状态判断是否重复处理。比如订单状态有“未支付”“支付中”“已支付”等,若消息处理是将订单从“未支付”变为“已支付”,当重复收到该消息且订单状态为“已支付”时,直接返回成功,不再重复处理。
- 消费者在处理消息时要实现幂等性。即对于重复消费的消息,处理结果应与首次消费一致。常见的实现方式有:
- 幂等性处理:
- 网络异常处理
- 重试机制:
- 生产者在发送消息遇到网络异常(如网络超时等)时,会进行重试。RocketMQ支持自定义重试次数和重试间隔。例如,默认情况下生产者发送消息失败会重试2次,每次重试间隔逐渐增大,以避免短时间内大量重试对系统造成压力。
- 最终一致性保障:
- 通过消息回查和事务状态持久化等手段,即使出现网络异常导致状态不确定,最终也能确保事务状态的确认。如生产者在本地事务执行完成后,将事务状态持久化到数据库,当RocketMQ回查时,可从数据库获取准确的事务状态,从而完成消息状态确认,保障分布式系统的数据一致性。
- 重试机制: