使用redis提升消息幂等性能

荒凉一梦 提交于 2020-02-28 08:19:27

使用redis提升消息幂等性能

一、 消息幂等

由于网络可靠性的原因不能保证消息必达,那么必须使用补偿机制重新发送消息。多次发送消息必须保证消费者只会消费一次,那么就需要保证实现接口的幂等性。

二 、架构思路

2.1 幂等实现思路

  • 状态机:利用数据库业务表状态CAS操作保证幂等性
  • 消息去重表:根据业务id生成唯一消息id和数据库唯一约束
  • 唯一业务id:利用上游业务id结合数据库唯一约束

2.2 通用策略

从上述的方法中,通用策略且方便做无侵入操作的是消息去重表方案。

三、 落地方案

自定义注解 + AOP切面方案,步骤:

  1. 切面拦截到有@UnqMsg注解的消息监听类的方法

  2. 首先查看redis.exist是否存在消息id

  3. 存在信息则获取消息返回执行成功

  4. 不存在则预写入消息去重表中,不提交事务,待业务方操作数据写入后,统一提交。

    应注意几个要点:

    • 如果分库分表必须做好路由配置
    • 消费方如果没有RMDB入库的提交操作怎么保证一致性,可以让业务方自己实现逻辑入库消息去重表
  5. redis和RMDB数据数据同步操作,使用canal组件同步数据到redis中,提升消息去重表查询效率,value = 1,过期时间根据业务需求定,3D、5D、7D。

  6. 消息去重表的过期数据处理,可以定时清空。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!