1.消息可靠性保障

在实际生产环境中,可能会由于网络问题导致消息接收异常产生某种影响,基于这种情况我们需要保障消息的可靠性。

RabbitMQ中的消息可靠性也称为消息补偿,如下图所示,可以保证消息的可靠性。

RabbitMQ常见的应用问题-LMLPHP

还有另外一种情况,如何延迟消息和正常消息都接收异常了,又该如何处理呢?

2.消息的幂等性保障

幂等性的概念:一次或者多次请求相同的资源,触发一样的业务逻辑,最终返回的结果应该是最初同样的结果,例如你9点吃早饭,那么而不管你吃了多少次早饭,都应该是9点去,不能出现不同的结果。

在MQ消息队列中,正常情况下,无论发送了多少次相同的消息,最终的结果都应该是一样的,就比如一个消息数据要扣款五百,发送了很多次,绝对不能出现多次扣款的情况。

如何保证消息的幂等性,方式有很多种,比如通过数据库的乐观锁来实现。

如下图所示,发送时就携带了一个version=1的消息数据,消费者读取数据进行处理时,也会在数据库中查询version=1的数据进行修改,如果第一次发送过来的消息被成功处理了,version的值就会被修改,那么库中就没有version=1的数据了,即使后面发送过来多条相同的数据,条件已经不满足了,也不会被数据库修改。

RabbitMQ常见的应用问题-LMLPHP

第一次执行时version为1
update account set memory=memory-500,version=version+1 where id =1 and version=1
修改的数据也是匹配的version=1的数据,将数据里面的钱扣五百元,然后再将version+1,从而将version变成了2

第二次执行时,version已经是2了,从而无法匹配数据无法进行操作,保证数据的幂等性
update account set memory=memory-500,version=version+1 where id =1 and version=1
06-27 05:21