【RabbitMQ】消息的可靠性保障和幂等性保障

news/2024/11/10 12:03:56 标签: rabbitmq, 可靠性, 消息补偿, 幂等性, 乐观锁

可靠性保障——消息补偿机制

如何保障消息的可靠性
如何保证消息不会丢失?
如何保证生产者发送的消息消费者一定能够正常消费掉?


这都是一个问题。之前的文章中已经介绍了几种解决方式:

(1)生产者的confirm模式。 包括Producer与Exchange之间的确认模式(ConfirmCallBack),以及Exchange与Queue之间的回退模式(ReturnCallBack)。

(2)消费者的ack机制。 包括自动签收(none)、手动签收(manual)、根据异常情况签收(auto)。

(3)消息持久化。 值得注意的是,交换机和队列的持久化(durable)和消息的持久化(persistent)并不是一回事。另外,持久化显然会影响MQ的性能,是具体情况取舍使用。


这里,再介绍一个极其重要的另一种可靠性保障机制——消息补偿

在这里插入图片描述

延迟检查(1~7)

生产端成功操作数据库后,发送给消费端一个消息,那么,如何保证这个消息会被消费端消费呢?

首先,Producer发送消息给Consumer,Consumer如果正常消费了消息,则会发送一个确认消息,这个确认消息通过一个队列进入消息数据库(MDB);

然后,延迟一段时间后,Producer会再次发送一个消息,这个消息和刚刚发送的消息完全一样(也可以仅仅具有相同的标识),但它会进入另一个队列,并与消息数据库(MDB)中的消息进行比对,从而知道刚刚的消息是否被消费。

定时检查(8)

但是,上面的检查过程中,可能再次出现信息丢失。为了再上一个保险,每隔一段时间,还会对生产端DB与消息MDB进行比对检查。

消息补偿(RPC)

在某次检查中如果发现比对失败,便会通过一次远程过程调用(RPC)让生产者重新发一次消息。这就是消息补偿

 
 
 

幂等性保障——乐观锁的版本控制机制

首先要搞明白,什么是幂等性(Idempotence)?

幂等性是指一次执行与多次执行对资源本身造成的影响是相同的。在MQ中,就是指Consumer消费一次数据,与消费多次数据,效果是一样的。

举个通俗的例子,Producer向Consumer发送了一个“账户金额-8000人民币”的消息,如果在MQ中出现故障,该消息出现了多个复制,或者该消息被消费者消费多次,那么用户金额可能会-100000000000。


乐观锁的数据版本机制

表中多加一个version版本号字段,它的含义通常设置为该数据被修改的次数,每次修改version加1。比如下面这个消息,它只会在version=12345时执行一次修改,之后version变为12346,与它相同的消息都不会生效,它也不会重复生效。

update account_table set money=money-8000, version=version+1 where id=2334 and version=12345

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🐰 Rabbit~


http://www.niftyadmin.cn/n/1329949.html

相关文章

【LeetCode】Sama的个人记录_59

这道题目的关键点在于: 如果我拿了一个数 n ,那么我必须拿走所有的 n ,放弃所有的 n-1 和 n1 。这和“打家劫舍”系列问题有着异曲同工之妙,只不过打家劫舍是位置上的关系(偷了位置n,位置n-1和n1就会发出警…

【LeetCode】Sama的个人记录_60

差分法。 差分法就是不记录当前具体的值,而是记录值的变化量。出生/死亡人数、上/下公交车,都是这类题目。class Solution {public int maximumPopulation(int[][] logs) {// 差分法:arr记录人口变化量int[] arr new int[101];for (int[] lo…

【RabbitMQ】集群搭建(镜像队列+负载均衡)

图解集群 一个好消息是,RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持集群。这使得RabbitMQ本身不需要…

redis哨兵、cluster

主机“宕机” master slave slave slave master  关闭master和所有slave  找一个slave作为master  修改其他slave的配置,连接新的主  启动新的master与slave  全量复制*N部分复制*N  关闭期间的数据服务谁来承接?  找一个主?怎…

【经典专题】强大的性质与惊艳的解法——异或运算

异或运算简介 符号 异或运算即exclusive OR,通常写作XOR,数学符号⊕,程序符号^。 运算 相同为0(1^10, 0^00),不同为1(1^01, 0^11) 性质 ① 自反性:a ^ b ^ b a ②…

【LeetCode】Sama的个人记录_61

简单题目,但想要写的优雅并不简单。本题的核心思路是"在DFS时将父结点作为参数暂存"。class Solution {private TreeNode xParent;private TreeNode yParent;private int xDepth;private int yDepth;private void DFS(TreeNode node, TreeNode parent, in…

【经典专题】数字与罗马数字的转换——罗马数字的计数本质

问题引入 你了解罗马数字吗? 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 举几个栗子: LVIII L V III 50 5 3 58 MXLIV M XL IV 1000 40 4 1044 问题1:数字转…

【数据结构】B树

B树的定义 B树也叫B-树,是一棵多路平衡查找树。B即Balance。 下面,我们看着图,先搞清楚它的定义: 一个结点的最大孩子个数称为树的阶,通常用m表示。一棵m阶B树要么是空树,要么满足以下定义: …