全部开发者教程

RabbitMQ 入门教程

RabbitMQ 简介
RabbitMQ 简介

RabbitMQ 中的幂等性介绍

1. 前言

Hello,大家好。本小节为大家介绍幂等性的相关概念,以及在 RabbitMQ 中,幂等性是如何体现的。对 RabbitMQ 中的幂等性进行简单了解之后,有利于我们更好地掌握 RabbitMQ 中消息的工作理念和工作思路,话不多说,让我们直入正题吧。

本节主要内容:

  • 什么是幂等性;

  • RabbitMQ 中的幂等性概念;

2. 什么是幂等性 ?

幂等性这一名词,诞生在数学领域,其目的就是为了描述一种函数与数值变量间的统一对等关系。数学领域中的幂等性比较抽象,这里就不给各位同学介绍了,感兴趣的同学可以课下了解一下。随着时代的发展,幂等性这一概念又被应用到了诸多除数学领域外的领域之中,并且发挥着重要作用,针对计算机行业来说,幂等性又是如何描述的呢?

幂等性这一概念,关键就在幂等这两个字上,即保持一种等价关系,在计算机中,幂等主要是对系统做一个约束,即,对于同一个系统,在相同条件下,一次对系统的请求和重复多次对系统的请求,对系统所造成的影响都是一样的。

我们来看一下这句话所描述的含义:在同一个系统中,表示的是我们所开发的应用程序系统;在相同条件下,表示的是我们所开发的应用程序都位于同一个运行环境中;对系统的请求,表示的是在相同条件下用户对我们的应用程序所发起的服务请求;对系统所造成的影响都是一样的,表示的是,无论是一个请求还是多个相同的请求,该请求对系统所造成的影响都是一样的。

我们重点需要理解的是,在相同条件下,一个或者多个相同的请求,在重复对系统进行请求之后,对系统所造成的影响都是一样的。这里我来举个例子:比如我们在网上进行购物,挑选好要买的商品之后进行下单,并进行了付款,不巧的是,当我们点击了确认支付后,收到了银行发来的扣款短信,但是没有收到网购平台支付成功的提示,于是我们又重新对该订单进行了支付,这最终造成了我们对于同一个订单确支付了两笔的现象。

然而这种现象是不应该出现的,如果网购平台对支付这块的功能做了幂等性的限制,那么我们在支付完第一笔后,再次进行支付时,网购平台会提示我们该笔订单已经支付过了,不能重复支付,而支付成功的提示会在等待一定的时间之后发给我们,这才是合理的处理结果。

计算机中的幂等性就是专门针对此种现象而衍变出来的,类似的场景还有很多,比如我们要对文章进行点赞,我们就会约束同一用户同一时刻只记录一次点赞结果等等。我们只需要知道,计算机中的幂等性就是为了保证,在相同条件下,同一个请求的一次或多次请求,对系统所造成的影响都是一样的就行了。

计算机中幂等性我们知道了,那么在 RabbitMQ 中幂等性又是如何体现的呢,接下来让我们一探究竟。

3. RabbitMQ 中的幂等性概念

我们知道,在 RabbitMQ 中,充当主角的也就是消息了,而这里所称的消息指的就是我们应用程序中的数据。我们还知道,RabbitMQ 实际就是处理消息的一款中间件,主要处理消息的发送、消息的接收两大模块,消息作为 RabbitMQ 中的主角,想必一定会对消息的发送和接收做综合方面的处理,即要保障消息准备被发送出去,也要保障消息准确被接收了。

生产端的幂等性体现:

在 RabbitMQ 中,保障消息准确被发送,以及保障消息准确被接收的这些保障措施,就用到了计算机中的幂等性。

对于保障消息准确被发送而言,我们应用程序中的数据,一旦被发送到 RabbitMQ Server 中后,无论 RabbitMQ Server 有没有接收到这一消息,都会返回给客户端一个接收消息的应答,来告诉客户端消息在 RabbitMQ Server 中的一个状态。

如果消息没有被 RabbitMQ Server 接收到,那么客户端也无需进行消息重复发送的操作,RabbitMQ Server 本身会自动将该消息进行重复发送,直到消息被 RabbitMQ Server 所接收,并返回消息已经发送的确认应答。

相反,如果消息被 RabbitMQ Server 接收到了,那么客户端无须进行消息的重复发送,如果此时我们向 RabbitMQ Server 中再次发送一条同样的消息,那么 RabbitMQ Server 会抛出消息已存在异常,这是幂等性的一种体现。

消费端的幂等性体现:

对于保障消息准备被接收而言,存在于 RabbitMQ Server 中的消息,一旦被消费者所获取,那么这个消费者就不能将消息再次发送出去,同时该消息只能被当前的消费者消费,其他的消费者均不能获取到该消息并消费。和消息发送一样,无论消费者有没有将该消息进行消费,都会给客户端返回一个确认应答。

如果消息没有被当前的消费者所消费,那么 RabbitMQ Server 会将该消息置于另一个消息队列当中,等待此时刻的所有消息都已经被消费之后,再回过头来对该消息进行消费,直到消费者正常消费掉了该消息。

相反,如果消息被当前的消费者所消费,那么,当生产者生产出了一个相同的消息之后,消费者也不会再对该消息进行消费了,因为同样的消息,消费者已经进行了消费,并返回了信息消费的确认性应答,这是幂等性的另一种体现。

而无论是生产端还是消费端,RabbitMQ 都将幂等性这一概念应用到了实际的消息处理中,正式由于幂等性的应用,RabbitMQ 在消息处理上才会保证消息可以 100% 的投递到 Server 端,以及消费者可以不重复的对消息进行正确的消费,并且都会返回消息发送和消费的确认性应答。

4. 小结

本小节对幂等性的概念,以及幂等性如何在 RabbitMQ 中体现的,做了详细的阐述。从统一角度上的幂等性概念开始,到计算机领域中幂等性概念的规定,最后到 RabbitMQ 中幂等性的不同种体现结束,详细阐述了幂等的概念,以及 RabbitMQ 对消息处理进行幂等操作的相关措施,旨在帮助各位同学可以清楚的理解什么是幂等性、幂等性中的重点是什么,以及 RabbitMQ 是如何应用幂等的概念来处理消息的发送和消费的。

幂等性这一概念贯穿 RabbitMQ 消息处理的始终,所以,了解什么是幂等性,以及幂等性在 RabbitMQ 中的应用是理解 RabbitMQ 中处理消息的基础,希望同学们都可以对幂等性有自己的见解,这是最重要的。