Kafka如何保证消费顺序(4大关键设计)

消息顺序的重要性

在诸多业务场景中,消息的顺序至关重要。

Kafka如何保证消费顺序(4大关键设计)-mikechen

例如:

  • 金融交易系统中的交易指令;
  • 电商系统中的订单状态变更;
  • 日志处理系统中的操作审计;
  • 物联网设备的状态更新;

这些场景下,消息乱序可能导致业务逻辑错误、数据不一致等严重问题。

因此,理解 Kafka 如何以及在何种程度上,保证消息的消费顺序至关重要。

 

Kafka顺序保证的核心机制

理解 Kafka 的顺序性保证,首先需要理解Kafka核心设计。

如下图所示:

Kafka如何保证消费顺序(4大关键设计)-mikechen

  • Producer:消息生产者;
  • Broker:消息服务器节点;
  • Topic:逻辑消息分类;
  • Partition:Topic的物理分片;
  • Consumer:消息消费者;
  • Consumer Group:消费者组。

这里最总要的有两个关键点:主题(Topics)、和分区(Partitions)。

主题(Topic)

主题是 Kafka 中消息的逻辑分类,可以将具有相同业务含义的消息组织在一个主题下。

例如,可以创建名为 “orders” 的主题来存储:所有订单相关的消息。

分区(Partition)

分区,是主题的物理分片。

每个主题可以被划分为一个或多个分区。

每个分区都是一个有序的、不可变的记录序列,消息以追加(append-only)的方式写入到分区的末尾。

Kafka 为分区中的每条消息分配一个唯一的、递增的偏移量(Offset),用于标识消息在分区内的位置。

Kafka最基本的顺序保证机制是基于Partition设计的:

Kafka如何保证消费顺序(4大关键设计)-mikechen

单个Partition内的顺序性

将所有需要保证顺序的消息,都发送到同一个主题的单个分区中,并且只使用一个消费者实例来消费这个分区。

这是保证严格顺序性的最简单方法,由于只有一个分区和一个消费者,消息会按照生产的顺序被存储和消费。

同一Partition内的消息保证FIFO(先进先出)顺序。

但是,这种方式无法利用 Kafka 的并行处理能力,消费吞吐量会受到单个消费者实例的处理能力的限制,不适用于高吞吐量的场景。

多分区,但具有相同 Key:

生产者在发送需要保证顺序的相关消息时,始终使用相同的 Key。

Kafka 会对这个 Key 进行哈希运算,确保具有相同 Key 的消息被发送到同一个分区。

在同一个消费者组内,同一个分区只会被一个消费者实例消费。

因此,所有具有相同 Key 的消息都会被同一个消费者实例按照生产的顺序进行消费。

种策略保证了所有具有相同 Key 的消息的消费顺序与生产顺序一致。不同 Key 的消息可以并行处理,提高了整体吞吐量。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法