MST

星途 面试题库

面试题:消息队列中RocketMQ与Spring Cloud Stream集成的消息幂等性处理

当RocketMQ与Spring Cloud Stream集成时,由于网络等原因可能会出现消息重复消费问题,阐述如何在这种集成架构下实现消息的幂等性消费,说明实现思路及可能用到的关键技术点。
23.3万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 数据库层面:在消费消息处理业务时,利用数据库的唯一性约束来确保幂等。例如,对关键业务数据(如订单号等)设置唯一索引。每次消费消息进行业务操作前,先尝试插入这条数据(包含唯一标识),若插入成功则继续业务处理;若因唯一性冲突插入失败,说明该消息已处理过,直接返回成功。
  2. 缓存层面:使用分布式缓存(如Redis)。在消息消费前,先根据消息的唯一标识(如消息ID)查询缓存。若缓存中存在该标识,说明消息已处理,直接返回;若不存在,则将该标识存入缓存,再进行业务处理。
  3. 应用层记录:在应用程序中维护一个已处理消息的记录列表(可以是内存中的集合,也可以是持久化存储,如文件、数据库表等)。每次消费消息前,检查消息ID是否在该列表中。若存在,跳过处理;若不存在,将消息ID添加到列表并处理业务。

关键技术点

  1. 消息唯一标识:RocketMQ 消息本身具有 MessageId 等标识,可利用这些标识作为幂等处理的关键依据。在 Spring Cloud Stream 中可以通过配置和代码获取消息的这些标识。
  2. 数据库操作:熟练使用数据库事务,确保插入操作与业务处理的原子性。例如在Spring框架中,使用@Transactional注解来管理事务。
  3. 缓存操作:掌握分布式缓存(如Redis)的使用,包括SETNX(SET if Not eXists)等命令,用于实现基于缓存的幂等控制。
  4. 应用层记录管理:若采用内存集合记录,需考虑多实例情况下的一致性问题;若采用持久化存储,要保证存储的可靠性和读写性能。在Spring Cloud Stream中可通过自定义组件来实现应用层记录的管理。