RocketMQ-幂等性

本文涉及的产品
云原生网关 MSE Higress,422元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 幂等性的具体方案需要以具体使用场景而定。

好久没更新文章了,有半个月了,最近工作确实比较忙,忙得热火朝天的。


当然也不是瞎忙,做了一个非常有意义的需求,后续也会分享出来,敬请关注哈!


今天,我们继续RocketMQ专题文章。


目录:
  • 业务场景
  • 问题原因
  • 解决方案
  • 幂等性
  • 总结


1、业务场景


在电商系统中,一般付款成功后,会给用户发放优惠券,一来给用户优惠,二来激励用户继续消费。但最近运营反馈,优惠券有时候会重复发放。


架构图


基于优惠券重复发放问题的前提下,我们来看一下流程图:image.gif


1、.png


  • 1、支付订单
  • 2、发送支付消息
  • 3、消费支付消息
  • 4、发放优惠券


上面这个是发放优惠券的流程图。


现在,我们首先来思考一下,绘制一下关于这个问题的蓝图:


1、目的:解决优惠券重复方法的问题

2、解决方案:待定

3、原因:未知


方法论: 想要解决这个问题-->得设计解决方案-->找到问题原因


2、问题原因


抽象原因


  • 原因1:生产者多次发送同一条消息,导致消费者多次消息同一条消息,因此重复发放优惠券
  • 原因2:生产者发送一次消息,但消费者多次消费同一条消息,因此重复发送优惠券


具象原因


  • 比如原因1,用户支付订单后,订单系统处理有点慢,这会让支付系统以为请求超时,这时支付系统会再次调用订单系统。这就会导致订单系统多次发送同一条支付消息。
  • 原因1,消息重试,网络异常,都会导致生产者多次发送同一条消息,这里不细说,想要细究,欢迎留言。
  • 比如原因2,用户支付成功,订单系统和支付系统交互也没超时,顺利发送一条支付消息,这个时候优惠券系统也成功消费支付消息,这时发放了一张优惠券。但意外来了,这个时候优惠券系统崩了,但还没来得及提交消费进度offset到RocketMQ。因而重启优惠券系统后,又会重新消费一次支付消息,从而重复发放优惠券。


3、解决方案


我们知道问题原因后,就可以开始设计解决方案了


  • 针对原因1:生产者多次发送同一条消息,导致消费者多次消息同一条消息,因此重复发放优惠券
  • 确保那就是要确保生产者能成功发送有且只有一次消息,但需要确保消费者只消费一次。
  • 对阵原因2:生产者发送一次消息,但消费者多次消费同一条消息,因此重复发送优惠券
  • 那就是要确保消费者只消费一次。但奈何这个不太现实,为什么呢?因为服务器重启,上线升级版本,这是非常常见的现象。因此,只消费一次,不太现实。


上面这2种方案,都涉及到消费者,都不能完美解决重复消费消息的问题


其实我们想想,我们可以用事务消息的方法,来确保消息一定能发送成功到RocketMQ,这个时候我们只需要解决消费者的消费问题即可。

image.gif

4、幂等性


想要解决重复消息问题,我们需要引入幂等性机制。


什么是幂等性


就是无论别人对你的接口请求多少次,你都需要保证接口调用一次和多次的结果是相同的。


天上飞的理论,得有落地实现。


幂等性,就是理论。那具体的落地实现一般有:


业务判断法


举个例子,在电商系统中,有订单id,这个时候在优惠券系统每消费一条支付消息,同步插入一条订单数据,能插入成功,证明之前这个订单没被消费过,发送优惠券。插入失败,则证明这个订单之前已经被消费过了。不做任何操作即可。


3.png


Redis缓存法


在并发量特别高的订单系统中,支付消息会特别多,这个时候,如果用业务判断法,插入数据库,容易存在瓶颈。这个时候如果想要提高并发量,可以考虑使用Redis。


Redis缓存订单id,如果这个订单id已经被消费过后,会存在Redis中。当这个订单id再次被消费时,就会被过滤,不操作。


这也是一种幂等性的实现方法。但Redis容易丢数据,这也是需要考虑的。image.gif


5、总结


用什么幂等性的具体方案,得看你的使用场景。


  • 如果你的并发量不高,直接用数据库即可解决。
  • 如果你允许有误差,允许重复发放优惠券,只追求高并发量,直接用Redis即可。
  • 如果你既要并发量,也要准确性,可以结合数据库+Redis的方案,但这种方案实现复杂度比较高。


所以,选择什么方案,真的得看你的使用场景。


你也看看你公司的幂等性方案是如何做的?学以致用啊!!!


好了,今天的分享,就到这结束了。


bye bye


有问题,欢迎留言。。。


也欢迎技术交流。。。


6、后续文章


  • RocketMQ-入门(已更新)
  • RocketMQ-架构和角色(已更新)
  • RocketMQ-消息发送(已更新)
  • RocketMQ-消费信息
  • RocketMQ-消费者的广播模式和集群模式(已更新)
  • RocketMQ-顺序消息(已更新)
  • RocketMQ-延迟消息(已更新)
  • RocketMQ-批量消息(已更新)
  • RocketMQ-过滤消息(已更新)
  • RocketMQ-事务消息(已更新)
  • RocketMQ-消息存储(已更新)
  • RocketMQ-高可用
  • RocketMQ-高性能
  • RocketMQ-主从复制
  • RocketMQ-刷盘机制(已更新)
  • RocketMQ-幂等性(已更新)
  • RocketMQ-消息重试
  • RocketMQ-死信队列

...


欢迎各位入(guan)股(zhu),后续文章干货多多。


—本文转载自「大头菜技术」公众号

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
安全 中间件 网络安全
中间件数据传输加密模式
中间件数据传输加密模式包括SSL/TLS用于网络通信安全,消息级加密(如AES、RSA)确保消息内容安全,端到端加密保证全程加密,数字签名验证数据完整性和真实来源,以及身份验证和授权控制访问。使用安全中间件,正确配置及管理安全设置也是关键。选择加密技术需依据应用场景、安全需求和性能考虑。
345 4
|
缓存 Java 程序员
Spring中异步注解@Async的使用、原理及使用时可能导致的问题
本文主要介绍了Spring中异步注解的使用、原理及可能碰到的问题,针对每个问题文中也给出了方案。希望通过这篇文章能帮助你彻底掌握`@Async`注解的使用,知其然并知其所以然!
14234 4
|
jenkins Java Shell
使用 Docker 安装 Jenkins 并实现项目自动化部署
Jenkins 是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目。
35264 3
使用 Docker 安装 Jenkins 并实现项目自动化部署
|
存储 网络协议 Python
Python如何用PyModbus库进行Modbus TCP通信
使用python解决工业通信问题是一个非常好的选择,python具有丰富的生态,可以轻松解决工业通信的各种问题。 本篇主要介绍使用pymodbus库进行modbus tcp仿真,实现pc端读取plc或工业设备modbus变量。
|
消息中间件 监控 负载均衡
深度剖析Kafka中Coordinator的奥秘
深度剖析Kafka中Coordinator的奥秘
630 1
|
7月前
|
关系型数据库 数据库 PostgreSQL
【赵渝强老师】PostgreSQL的模板数据库
在PostgreSQL中,创建新数据库时,默认通过拷贝`template1`实现。`template1`包含标准系统对象,可自定义以影响新数据库内容;而`template0`是纯净模板,仅含预定义对象且不应修改。视频讲解和代码示例展示了如何查看现有数据库信息及标识字段的作用。 ![图示](https://ucc.alicdn.com/pic/developer-ecology/yub6x2mlkqwck_398ed06397a44c2d9bfbb5ae5c90bbc0.png) [视频链接](https://www.bilibili.com/video/BV1szyfY4EQn)
119 0
【赵渝强老师】PostgreSQL的模板数据库
|
8月前
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
401 2
|
11月前
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!