面试题答案
一键面试消息丢失处理策略
- 生产者确认机制:
- 在Redis中,生产者向队列发送消息后,利用Redis的响应来确认消息是否成功入队。例如,在使用Redis的
RPUSH
命令发送消息时,检查返回值。如果返回值表示消息成功入队(如RPUSH
返回添加元素后的列表长度),则认为消息发送成功;否则,进行重试。 - 可以设置重试次数和重试间隔,防止无效的重试占用过多资源。例如,初始重试间隔为1秒,每次重试间隔翻倍,最多重试5次。
- 在Redis中,生产者向队列发送消息后,利用Redis的响应来确认消息是否成功入队。例如,在使用Redis的
- 持久化队列:
- 配置Redis的持久化策略,如使用AOF(Append - Only File)模式。AOF会将写命令追加到文件末尾,即使Redis重启,也能通过重放AOF文件恢复数据。
- 定期对AOF文件进行重写,以减少文件体积,提高恢复效率。
- 消费者确认机制:
- 消费者从Redis队列获取消息并处理完成后,向Redis发送一个确认消息,比如将处理成功的消息ID存储到另一个Redis集合中。
- 生产者或监控程序可以定期检查队列中的消息是否在确认集合中,如果长时间未确认,则重新发送该消息。
重复消费处理策略
- 消息唯一标识:
- 为每条消息生成唯一的ID,例如使用UUID。在MySQL中,可以创建一个带有唯一索引的表字段来存储消息ID。
- 消费者在处理消息前,先检查MySQL中该消息ID是否已处理。如果已处理,则跳过该消息;否则,进行处理并插入消息ID到MySQL表中。
- 幂等性处理:
- 设计MySQL的处理逻辑为幂等性。例如,对于插入操作,可以使用
INSERT INTO... ON DUPLICATE KEY UPDATE
语句。这样,如果消息重复消费,数据不会重复插入,而是进行更新操作,不会破坏数据一致性。 - 对于更新操作,确保每次更新的逻辑是相同的,多次执行不会产生不同结果。比如,更新某个计数器字段时,使用
UPDATE table SET counter = counter + 1 WHERE id = xxx
,无论执行多少次,结果都是正确的。
- 设计MySQL的处理逻辑为幂等性。例如,对于插入操作,可以使用