使用redis提升消息幂等性能
一、 消息幂等
由于网络可靠性的原因不能保证消息必达,那么必须使用补偿机制重新发送消息。多次发送消息必须保证消费者只会消费一次,那么就需要保证实现接口的幂等性。
二 、架构思路
2.1 幂等实现思路
- 状态机:利用数据库业务表状态CAS操作保证幂等性
- 消息去重表:根据业务id生成唯一消息id和数据库唯一约束
- 唯一业务id:利用上游业务id结合数据库唯一约束
2.2 通用策略
从上述的方法中,通用策略且方便做无侵入操作的是消息去重表方案。
三、 落地方案
自定义注解 + AOP切面方案,步骤:
-
切面拦截到有@UnqMsg注解的消息监听类的方法
-
首先查看redis.exist是否存在消息id
-
存在信息则获取消息返回执行成功
-
不存在则预写入消息去重表中,不提交事务,待业务方操作数据写入后,统一提交。
应注意几个要点:
- 如果分库分表必须做好路由配置
- 消费方如果没有RMDB入库的提交操作怎么保证一致性,可以让业务方自己实现逻辑入库消息去重表
-
redis和RMDB数据数据同步操作,使用canal组件同步数据到redis中,提升消息去重表查询效率,value = 1,过期时间根据业务需求定,3D、5D、7D。
-
消息去重表的过期数据处理,可以定时清空。
来源:oschina
链接:https://my.oschina.net/teddyIH/blog/3156186