面试题答案
一键面试实现思路
- 数据库层面:在消费消息处理业务时,利用数据库的唯一性约束来确保幂等。例如,对关键业务数据(如订单号等)设置唯一索引。每次消费消息进行业务操作前,先尝试插入这条数据(包含唯一标识),若插入成功则继续业务处理;若因唯一性冲突插入失败,说明该消息已处理过,直接返回成功。
- 缓存层面:使用分布式缓存(如Redis)。在消息消费前,先根据消息的唯一标识(如消息ID)查询缓存。若缓存中存在该标识,说明消息已处理,直接返回;若不存在,则将该标识存入缓存,再进行业务处理。
- 应用层记录:在应用程序中维护一个已处理消息的记录列表(可以是内存中的集合,也可以是持久化存储,如文件、数据库表等)。每次消费消息前,检查消息ID是否在该列表中。若存在,跳过处理;若不存在,将消息ID添加到列表并处理业务。
关键技术点
- 消息唯一标识:RocketMQ 消息本身具有 MessageId 等标识,可利用这些标识作为幂等处理的关键依据。在 Spring Cloud Stream 中可以通过配置和代码获取消息的这些标识。
- 数据库操作:熟练使用数据库事务,确保插入操作与业务处理的原子性。例如在Spring框架中,使用@Transactional注解来管理事务。
- 缓存操作:掌握分布式缓存(如Redis)的使用,包括SETNX(SET if Not eXists)等命令,用于实现基于缓存的幂等控制。
- 应用层记录管理:若采用内存集合记录,需考虑多实例情况下的一致性问题;若采用持久化存储,要保证存储的可靠性和读写性能。在Spring Cloud Stream中可通过自定义组件来实现应用层记录的管理。