消息队列的顺序性保证

背景

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

技术实现

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

小结

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

你可能感兴趣的:(kafka,java,java-rabbitmq,rabbitmq,kafka)