面试题答案
一键面试生产者角度
- 生成唯一消息标识:生产者在发送消息时,需要为每条消息生成一个全局唯一的标识,例如使用UUID等方式。这个唯一标识将作为消息去重的关键依据。
- 幂等性发送:采用幂等性发送机制,如RocketMQ支持的事务消息(半消息 + 二阶段提交)。在事务消息机制下,即使生产者重复发送消息,Broker端也能通过唯一标识判断消息是否已存在,避免重复处理。
消费者角度
- 利用唯一标识去重:消费者在接收到消息后,从消息中提取生产者生成的唯一标识。然后,消费者维护一个已消费消息标识的存储结构(如内存中的Set、数据库表等),在处理消息前,先检查该标识是否已在存储结构中。如果已存在,则表明该消息是重复消息,直接丢弃;否则,处理消息并将标识存入存储结构。
- 消费幂等性:除了基于唯一标识去重,消费者还需保证自身处理消息的逻辑具有幂等性。即多次处理同一消息和处理一次消息的结果是相同的,避免因为重复消费导致业务数据不一致。例如,在更新数据库操作时,使用
UPDATE ... WHERE id =? AND version =?
这样的语句,通过版本号等条件确保多次更新操作不会产生不同结果。