消息顺序的重要性
在诸多业务场景中,消息的顺序至关重要。
例如:
- 金融交易系统中的交易指令;
- 电商系统中的订单状态变更;
- 日志处理系统中的操作审计;
- 物联网设备的状态更新;
这些场景下,消息乱序可能导致业务逻辑错误、数据不一致等严重问题。
因此,理解 Kafka 如何以及在何种程度上,保证消息的消费顺序至关重要。
Kafka顺序保证的核心机制
理解 Kafka 的顺序性保证,首先需要理解Kafka核心设计。
如下图所示:
- Producer:消息生产者;
- Broker:消息服务器节点;
- Topic:逻辑消息分类;
- Partition:Topic的物理分片;
- Consumer:消息消费者;
- Consumer Group:消费者组。
这里最总要的有两个关键点:主题(Topics)、和分区(Partitions)。
主题(Topic)
主题是 Kafka 中消息的逻辑分类,可以将具有相同业务含义的消息组织在一个主题下。
例如,可以创建名为 “orders” 的主题来存储:所有订单相关的消息。
分区(Partition)
分区,是主题的物理分片。
每个主题可以被划分为一个或多个分区。
每个分区都是一个有序的、不可变的记录序列,消息以追加(append-only)的方式写入到分区的末尾。
Kafka 为分区中的每条消息分配一个唯一的、递增的偏移量(Offset),用于标识消息在分区内的位置。
Kafka最基本的顺序保证机制是基于Partition设计的:
单个Partition内的顺序性:
将所有需要保证顺序的消息,都发送到同一个主题的单个分区中,并且只使用一个消费者实例来消费这个分区。
这是保证严格顺序性的最简单方法,由于只有一个分区和一个消费者,消息会按照生产的顺序被存储和消费。
同一Partition内的消息保证FIFO(先进先出)顺序。
但是,这种方式无法利用 Kafka 的并行处理能力,消费吞吐量会受到单个消费者实例的处理能力的限制,不适用于高吞吐量的场景。
多分区,但具有相同 Key:
生产者在发送需要保证顺序的相关消息时,始终使用相同的 Key。
Kafka 会对这个 Key 进行哈希运算,确保具有相同 Key 的消息被发送到同一个分区。
在同一个消费者组内,同一个分区只会被一个消费者实例消费。
因此,所有具有相同 Key 的消息都会被同一个消费者实例按照生产的顺序进行消费。
种策略保证了所有具有相同 Key 的消息的消费顺序与生产顺序一致。不同 Key 的消息可以并行处理,提高了整体吞吐量。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

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