Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >20-RabbitMQ应用问题-消息幂等性保障

20-RabbitMQ应用问题-消息幂等性保障

作者头像
Devops海洋的渔夫
发布于 2023-02-10 05:59:42
发布于 2023-02-10 05:59:42
22700
代码可运行
举报
文章被收录于专栏:Devops专栏Devops专栏
运行总次数:0
代码可运行

20-RabbitMQ应用问题-消息幂等性保障

RabbitMQ应用问题

  1. 消息可靠性保障
  • 消息补偿机制
  1. 消息幂等性保障
  • 乐观锁解决方案

消息幂等性保障

幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果。

消息幂等性保障--乐观锁机制

消息发送还是之前的消息补偿流程图,而这里消息幂等性保障主要是依赖 DB 的乐观锁机制。

需求:

下面我们需要进行一个订单扣除金额的幂等性保障,例如我们发起扣除500元的消息,如果发出了多条扣除消息,到最后只允许扣除500元,不允许多次扣除。

实现思路:

当第一次发送消息,内容:id=1,money=500,version=1

当时此时 Consumer 发生了故障,要求 Producer 再次发送消息,此时 Consumer 将会收到两条消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id=1,money=500,version=1
id=1,money=500,version=1

Consumer此时收到两条相同的消息,为了避免重复执行,SQL更新需要设置 version 的变更:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 第一次执行:version=1,执行结果生效,扣除了500元
update account set money = money - 500 , version = version + 1
where id = 1 and version = 1

-- 第二次执行:version=2,由于where条件查询不到 version=1 的结果了,所以第二次执行将失败
update account set money = money - 500 , version = version + 1
where id = 1 and version = 1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ消息中间件技术精讲10 高级篇三 幂等性保障不重复消费
在网络超时等问题除外下,要求一次或多次请求同一个资源,对资源本身产生的影响和第一次执行的影响相同。
凯哥Java
2019/07/23
7870
RabbitMQ消息中间件技术精讲10 高级篇三 幂等性保障不重复消费
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?
我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。
java架构师
2019/05/15
5070
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?
我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。
Java高级攻城狮
2019/05/06
1.1K0
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?
理解幂等性
为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。
somenzz
2020/11/25
5700
19-RabbitMQ应用问题-消息补偿
19-RabbitMQ应用问题-消息补偿 RabbitMQ应用问题 消息可靠性保障 消息补偿机制 消息幂等性保障 乐观锁解决方案 消息可靠性保障 需求:100%确保消息发送成功 消息可靠性保障--消息补偿 Producer 1.业务数据入库DB,保证消息持久化 2.发送消息至消费队列Q1(中间有交换机就不写了) 3.延迟发送消息队列Q3(用于后续校验 2.发送的消息) Consumer 4.监听队列Q1:如果消费成功,则将消息执行结果写入DB 5.发送确认消息至队列Q2 回调检查服务 6.监听 Cons
Devops海洋的渔夫
2023/02/10
3680
19-RabbitMQ应用问题-消息补偿
接口幂等性
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...,这就没有保证接口的幂等性。
一个风轻云淡
2023/10/15
2610
如何保证分布式情况下的幂等性
关于这个分布式服务的幂等性,这是在使用分布式服务的时候会经常遇到的问题,比如,重复提交的问题。而幂等性,就是为了解决问题存在的一个概念了。
Java极客技术
2023/10/26
3530
如何保证分布式情况下的幂等性
幂等性
老婆问了个问题,什么是“幂等性”?这个问题,从现象上好解释,例如今儿是618大促,购物车添加了丰富的商品,满心欢喜地点击了支付按钮,支付成 功了,但是返回的时候网络异常,不知道是不是扣款成功了,实际上在服务端货款已经扣了,此时再点击支付按钮,如果第二次扣款成功,则就是多扣钱了,如果第 二次扣款不成功,符合我们的预期,说明这个支付的功能,满足“幂等性”。
bisal
2019/06/19
1.2K0
RabbitMQ消费端幂等性概念及解决方案
比如数据库的乐观锁,在执行更新操作前,先去数据库查询version,然后执行更新语句,以version作为条件,如果执行更新时有其他人先更新了这张表的数据,那么这个条件就不生效了,也就不会执行操作了,通过这种乐观锁的机制来保障幂等性.
JavaEdge
2021/02/22
9620
跟我学RocketMQ之消息幂等
链接:http://rocketmq.cloud/zh-cn/blog/tocloud-catalog.html
好好学java
2019/08/09
3.1K0
跟我学RocketMQ之消息幂等
RabbitMQ实战(三)-高级特性
在实际生产中,很难保障前三点的完全可靠,比如在极端的环境中,生产者发送消息失败了,发送端在接受确认应答时突然发生网络闪断等等情况,很难保障可靠性投递,所以就需要有第四点完善的消息补偿机制。
JavaEdge
2019/07/01
1.8K0
RabbitMQ实战(三)-高级特性
mysql 幂等(什么是幂等性)
幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
全栈程序员站长
2022/07/25
2.3K0
mysql 幂等(什么是幂等性)
接口服务中的幂等性设计和防重保证,详细分析幂等性的几种实现方法
由于ABA问题会导致乐观锁存在失效的情况,只要保证version值自增就不会出现ABA的问题
攻城狮Chova
2022/01/22
4990
接口服务中的幂等性设计和防重保证,详细分析幂等性的几种实现方法
RabbitMQ消息中间件从入门到高级(二)
流程的示意图如上所示,比如我下单成功了,这是进行step1,对我的业务数据进行入库,业务数据入库完毕(这里要特别注意一定要保证业务数据入库)再对要发送的消息进行入库,图中采用了两个数据库,可以根据实际业务场景来确定是否采用两个数据库,如果采用了两个数据库,有人可能就像到了采用分布式事务来保证数据的一致性,但是在大型互联网中,基本很少采用事务,都是采用补偿机制。
用户1212940
2022/04/13
5510
RabbitMQ消息中间件从入门到高级(二)
在IT领域,什么是幂等性(idempotence)?为什要实现幂等?如何解决幂等性?
幂等性(idempotence)是一个数学和计算机学概念,指的是对于同一操作,无论是一次还是多次执行,产生的结果是一致的,不会因为多次执行而产生副作用。在编程中,幂等操作是指可以使用相同参数重复执行,对系统产生的影响是一样的,即对资源的作用是一样的,不会发生副作用。
崔认知
2024/03/22
1.5K0
在IT领域,什么是幂等性(idempotence)?为什要实现幂等?如何解决幂等性?
rabbitmq系列(三)消息幂等性处理
我们启动生产者,然后请求send接口,然后打开rabbitmq控制台发现多了一个名为”byte-zb“的交换机和队列,并且队列中出现了一个未消费的消息,然后启动消费者,我们会在控制台上发现打印了一条消息,同时rabbitmq控制台中”byte-zb“的队列中消息没有了。
Java旅途
2020/06/25
1.1K0
接口幂等性的解决方案
在编程中,幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数指的是那些使用相同参数重复执行也能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。比如说getIdCard()函数和setTrue()函数就是幂等函数。
崔笑颜
2020/07/25
6530
RabbitMQ 怎么保证可靠性、幂等性、消费顺序?
◆ RabbitMQ如何保证消息的可靠性# RabbitMQ消息丢失的三种情况 ◆生产者弄丢消息时的解决方法# 方法一:生产者在发送数据之前开启RabbitMQ的事务(采用该种方法由于事务机制,会导致吞吐量下降,太消耗性能。) 方法二:开启confirm模式(使用springboot时在application.yml配置文件中做如下配置,实现confirm回调接口,生产者发送消息时设置confirm回调) 小结:事务机制和 confirm机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿
IT大咖说
2022/04/01
1.5K0
RabbitMQ 怎么保证可靠性、幂等性、消费顺序?
浅谈网络中接口幂等性设计问题
所谓幂等性设计,就是说,一次和多次请求某一个资源应该具有同样的副作用。用数学的语言来表达就是:f(x) = f(f(x))。
栗筝i
2023/03/08
6100
RabbitMQ之其他特性(幂等性、优先级队列、惰性队列)
用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
别团等shy哥发育
2023/02/25
4070
RabbitMQ之其他特性(幂等性、优先级队列、惰性队列)
相关推荐
RabbitMQ消息中间件技术精讲10 高级篇三 幂等性保障不重复消费
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档