消息队列的顺序性保证

文章讨论了消息队列在保证消息顺序性方面的作用,以RabbitMQ为例展示了多个消费者如何破坏消息顺序性。接着,通过Kafka的分区有序特性,说明如何在每个分区内部保证消息顺序。尽管全局有序性在多分区情况下难以实现,但通过特定分区策略,仍可确保有顺序性要求的消息在特定分区内的顺序。
摘要由CSDN通过智能技术生成

背景

消息队列应该是我们程序员平时打交道比较多的系统了,他可以把生成者和消费者进行隔离解耦,在各个场景中的应用都非常广泛,这其中最需要关注的话题除了吞吐量和性能之外,我们最关注的问题是如何保证消息的顺序性,那么消息系统提供给我们什么样的有序性保证呢?

技术实现

我们首先使用最为常见的RabbitMq的一个queue对应多个消费者消费消息的场景作为例子,我们来看下这种场景下消息的顺序性是如何被破坏的,我们先假设每个消费者消费消息的速度是一样的
在这里插入图片描述
通过上图我们可以知道如果一个队列被多个消费者同时消费时,是没法保证消息的有序性的,那么就回到一个问题上:消息队列可以保证什么样的顺序性呢?
使用kafka作为例子,kafka能提供的顺序性保证是分区有序,如下图所示:
在这里插入图片描述
也就是说kafka的主题能够保证对于每个分区的消息消费是有序的,只要是同一个分区的消息,他就能够保证顺序性,当然这种分区有序的顺序性保证是通过每个分区只能由一个消费者进行消费来实现的,当然这里不是说每个分区只能由某个特定的消费者消费,因为当某个分区的消费者挂掉之后,这个分区还是可以由另外的消费者进行消费的

小结

消息队列例如kafka等仅仅能提供分区有序的消息顺序性保证,只有在一个主题只有一个分区的情况下才能够提供全局有序的顺序性保证,不过这种只有单分区的情况下性能和吞吐量极低。所以兼顾性能起见,我们还是要以分区有序作为顺序性的基本要求,对于有顺序性要求的消息,要把这些消息发送到同一个分区内,这可以通过特定的分区函数的方式来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值