RabbitMQ 如何保证消息顺序 --- 2022-04-03

RabbitMQ 如何保证消息顺序 --- 2022-04-03,第1张

RabbitMQ使用过程中,有些业务场景需要我们保证顺序消费,例如:业务上产生三条消息,分别是对数据的增加、修改、删除 *** 作,如果没有保证顺序消费,执行顺序可能变成删除、修改、增加,这就乱了。

如下如:

RabbitMQ的消息顺序问题,需要分三个环节看待,发送消息的顺序、队列中消息的顺序、消费消息的顺序。

消息发送端的顺序,大部分业务不做要求,谁先发消息无所谓,如果遇到业务一定要发送消息也确保顺序,那意味着,只能全局加锁一个个的 *** 作,一个个的发消息,不能并发发送消息。

RabbitMQ中,消息最终会保存在队列中,在同一个队列中,消息是顺序的,先进先出原则,这个由Rabbitmq保证,通常也不需要开发关心。

我们说如何保证消息顺序性,通常说的就是消费者消费消息的顺序,在多个消费者消费同一个消息队列的场景,通常是无法保证消息顺序的,开篇的示意图已经说明,虽然消息队列的消息是顺序的,但是多个消费者并发消费消息,获取的消息的速度、执行业务逻辑的速度快慢、执行异常等等原因都会导致消息顺序不一致。

例如:消息A、B、C按顺序进入队列,消费者A1拿到消息A、消费者B1拿到消息B, 结果消费者B执行速度快,就跑完了,又或者消费者A1挂了,都会导致消息顺序不一致。

解决消费顺序的问题,通常就是一个队列只有一个消费者

这样就可以一个个消息按顺序处理,缺点就是并发能力下降了,无法并发消费消息,这是个取舍问题。

在介绍具体的实现思路之前,我们先来介绍一下RabbitMQ的两个特性,一个是Time-To-Live Extensions,另一个是Dead Letter Exchanges。

Time-To-Live Extensions

RabbitMQ允许我们为消息或者队列设置TTL(time to live),也就是过期时间。TTL表明了一条消息可在队列中存活的最大时间,单位为毫秒。也就是说,当某条消息被设置了TTL或者当某条消息进入了设置了TTL的队列时,这条消息会在经过TTL秒后“死亡”,成为Dead Letter。如果既配置了消息的TTL,又配置了队列的TTL,那么较小的那个值会被取用。更多资料请查阅官方文档。

Dead Letter Exchange

刚才提到了,被设置了TTL的消息在过期后会成为Dead Letter。其实在RabbitMQ中,一共有三种消息的“死亡”形式:

消息被拒绝。通过调用basicreject或者basicnack并且设置的requeue参数为false。

消息因为设置了TTL而过期。

消息进入了一条已经达到最大长度的队列。

1生产者:创建消息,发布消息到代理服务器(RabbitMQ)

(1)消息:有效荷载和标签

(2)有效荷载:消息的内容

(3)标签:用来描述消息(交换器的名称或者可选主题的标记),然后把消息交由RabbitMQ,由RabbitMQ进行后续处理

2消费者:连接到代理服务器(RabbitMQ),并订阅到队列(queue)上,接收代理服务器发布的消息并读取

(1)接收到的消息只包括有效荷载,即消息内容

1基本原理:首先创建一条TCP连接,TCP连接打开后(即通过认证),应用程序创建一条AMQP信道。

2信道:是建立在真实的TCP连接内的虚拟连接,AMQP命令是通过信道发送出去

3应用程序和RabbitMQ代理之间的连接用信道而不直接用TCP连接的原因

(1)一个信道处理一个线程,一个TCP连接可以承载多个信道,即多个线程可以使用同一个TCP连接,减少资源消耗,避免性能瓶颈

(2)一个TCP的创建和销毁对资源的消耗会很大,创建需要三次握手,销毁需要四次挥手。

4TCP协议的三次握手和四次分手

(1)建立连接的三次握手:

-第一次握手:客户端发送给服务端,请求连接

-第二次握手:服务端接收到客户端发送的请求连接的消息,回复给客户端请求连接

-第三次握手:上述两次握手本质上已经建立连接,但是此时客户端还会发送给服务端一个消息,确认连接,即表示连接成功

(2)销毁连接的四次挥手:

-第一次挥手:客户端发送给服务端,断开连接

-第二次挥手:服务端接收到请求断开连接的请求,发送确认消息

-第三次挥手:服务端发送给客户端,断开连接

-第四次挥手:客户端接收到服务端的消息,确认断开连接

注意:销毁连接需要四次挥手是因为TCP连接是双向连接,断开也需要双向断开和确认

消息队列之 RabbitMQ(推荐)

>

RabbitMQ死信队列堆积时间是按照消息入队列的时间来显示的,它是从消息进入队列的时间开始计算的,它将被排队的消息的堆积时间显示出来。RabbitMQ死信队列的堆积时间是一个重要的指标,它能够反映出消息处理的效率,如果堆积时间过长,那么就说明消息处理效率很低,需要进行优化。

以上就是关于RabbitMQ 如何保证消息顺序 --- 2022-04-03全部的内容,包括:RabbitMQ 如何保证消息顺序 --- 2022-04-03、rabbitmq+spring boot,我在配置中配置了重试间隔时间,但是不起作用是什么原因、RabbitMQ(一)--关于消息通信等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9590171.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存