目录
01理解Topic和Partition
Topic(主题)
Partition(分区)
02理解消息分发
消息发送到分区
消费者订阅和消费指定分区
总结
03再均衡(rebalance)
再均衡的触发
分区分配策略
RangeAssignor(范围分区)
RoundRobinAssignor(轮询分区)
StickyAssignor(粘性分区)
Rebalance执行者Coordinator
再均衡的过程
再均衡的目的
04消费者读取消息Offset
消费者 Offset 的作用
重平衡和 Offset
01理解Topic和Partition
Topic 是消息的逻辑分类,而 Partition 是物理存储单元。在 Apache Kafka 中,Topic 和 Partition 是两个核心概念,它们用于管理消息的发布、存储和消费。不同的topic消息是分开存储的,同一topic下的不同分区包含的消息是不同的。
以下是对 Topic 和 Partition 的详细解释:
Topic(主题)
-
Topic 是消息的逻辑容器:Topic 是 Kafka 中的消息分类或主题,它是消息的逻辑容器,类似于消息的类别或主题。生产者将消息发布到特定的 Topic,而消费者则订阅 Topic 来接收消息。
-
消息发布到 Topic:生产者将消息发布到一个或多个 Topic,可以根据业务需求创建不同的 Topic,每个 Topic 用于存储特定类型或主题的消息。
Partition(分区)
-
分区是消息的物理存储单元:分区是 Topic 的物理存储单元,它实际上是一个独立的消息日志文件。每个分区都包含一定范围的消息,消息以消息偏移量进行标识。
-
分区提供水平扩展:Kafka 允许为每个 Topic 配置多个分区,这些分区可以分布在不同的 Kafka 代理节点上,以提供水平扩展和分布负载的能力。
-
消息的顺序性:每个分区中的消息保持顺序性,即消息按照它们写入的顺序存储。这有助于维护消息的顺序性,特别对于需要处理有序数据的应用程序很重要。
-
多个消费者可以并行读取:多个消费者可以并行读取同一 Topic 的不同分区,以提高读取性能。这允许 Kafka 处理大规模的数据流和事件。
02理解消息分发
消息时Kafka中最基本的数据单元,在Kafka中,一条消息由key、value两部分组成。消息的发送由生产者负责。Kafka 的消息分发机制涉及生产者将消息发送到分区和消费者如何订阅和消费指定分区的消息。
消息发送到分区
-
消息键(Message Key):Kafka 生产者可以为每条消息指定一个消息键。消息键是一个字符串,它被用于确定消息应该发送到哪个分区。如果消息键为空,Kafka 生产者会使用分区分配策略来选择目标分区。
-
分区分配策略:Kafka 提供多种分区分配策略,例如轮询、随机、按键等策略。这些策略用于决定将消息发送到哪个分区。
-
生产者发送消息:生产者将消息与消息键一起发送到 Kafka 主题。如果指定了消息键,分区分配策略将使用消息键来选择目标分区。如果没有指定消息键,分区分配策略将使用轮询或其他默认策略。
消费者订阅和消费指定分区
-
消费者组:消费者通常以消费者组(Consumer Group)的形式消费消息。每个消费者组可以有多个消费者,它们一起消费主题中的消息。
-
订阅主题:消费者组通过订阅主题来指定要消费的消息来源。消费者组可以订阅一个或多个主题。
-
分区分配策略:Kafka 提供了分区分配策略,这些策略用于将分区分配给消费者组中的不同消费者。分区分配策略可以是轮询、最少分区、按键等策略。分区分配策略确保分区在消费者组中均匀分布。
-
消费指定分区:消费者可以通过分区分配策略订阅特定的分区,这样它们只会消费来自这些分区的消息。这是一种高度灵活的方式,允许消费者精确控制它们所消费的消息。
关于消费者消费消息:
-
消费者组里的3个消费者会分别消费3个分区的消息,如果组里只有2个消费者,还是3个分区的情况下,那么有一个消费者会消费两个分区的消息,由策略决定。
-
Kafka的设计上,分区是不允许并发的,所以消费者数量大于分区数量是浪费
-
当消费者少于分区的时候,需要尽可能保证读取均匀
-
消费者从多个分区读数据不能保证总体的顺序性,只能保证单个分区数据的顺序性
-
增减分区(partition)、消费者(consumer)以及节点(broker)都会导致再均衡(rebalance)
总结
-
生产者发送消息时,可以选择是否指定消息键,以及采用哪种分区分配策略。
-
消费者通常以消费者组的形式订阅主题,分区分配策略确保消息分布均匀。
-
消费者可以选择消费特定的分区,从而控制它们所消费的消息。
03再均衡(rebalance)
Kafka 中的再均衡(Rebalance)是指在消费者组中发生变化(如有新消费者加入或旧消费者离开)时,Kafka 会重新分配分区以确保消息的均匀分发。再均衡是 Kafka 消费者组的核心机制,它确保消息的负载均衡和高可用性。
再均衡的触发
-
新消费者加入:当一个新消费者加入消费者组时,会触发再均衡。新消费者会参与到消费者组的分区分配中。
-
消费者离开:当一个消费者离开消费者组时,也会触发再均衡。分区将被重新分配给其它消费者。
-
分区数变化:如果 Kafka 主题的分区数发生变化,也可能触发再均衡,以确保新的分区能够被消费者组消费。
分区分配策略
Kafka 使用分区分配策略来决定分区如何分配给消费者。再均衡会触发分区分配。
常见的三种分区分配策略,Range(默认)、RoundRobin(轮询)和StickyAssignor(粘性)。
-
RangeAssignor(范围分区)
将同一主题中的分区按序号排序,对消费者按字母顺序排序。
假设 :n = 分区数/消费者数量,m = 分区数%消费者数量
那么前m个消费者每个分配n+1个分区,剩余的消费者每个分配n个分区
例如:10个分区,3个消费者。(n = 10 /3 = 3,m = 10 % 3 = 1)
结果:消费者A对应分区0,1,2,3。消费者B对应分区4,5,6。消费者C对应分区7,8,9。
-
RoundRobinAssignor(轮询分区)
将所有分区和消费者按照hashcode进行排序,通过轮询的方式分配给消费者。
例如:10个分区的排序为0,2,3,4,1,8,6,9,5,7。消费者是A、B、C、D。
结果: A对应分区0,1,5。B对应分区2,8,7。C对应分区3,6。D对应分区4,9。
-
StickyAssignor(粘性分区)
也叫粘滞策略,主要两个目的:
-
分区的分配尽可能均匀
-
分区的分配尽可能和上次分配保持相同
-
Rebalance执行者Coordinator
Kafka中指定了Coordinator负责再均衡的分区分配和消费者组的管理。Coordinator的确定:消费者向Kafka集群中的任意一个broker发送一个GroupCoordinatorRequest请求,服务端会返回一个负载均衡最小的broker节点的id,并将该broker设置为coordinator。
再均衡的过程
-
当再均衡触发时,Kafka 协调器(Coordinator)会协调分区的重新分配。协调器是 Kafka 服务中的一个组件,负责处理消费者组的管理和再均衡。
-
消费者向协调器发送它们当前持有的分区信息,协调器根据分区分配策略计算新的分区分配方案。
-
一旦计算出新的分区分配方案,协调器将新分配的分区信息通知给每个消费者。
-
消费者根据新的分区分配方案重新分配和管理分区,开始消费分配给它们的消息。
再均衡的目的
-
均衡消费者间的分区负载,确保每个消费者处理大致相等数量的消息。
-
支持高可用性:如果某个消费者发生故障,分区可以重新分配给其它活跃的消费者,以确保消息不会丢失。
再均衡是 Kafka 消费者组维护整体的负载均衡和可用性的关键机制。
04消费者读取消息Offset
消费者读取消息的偏移量(Offset)是非常重要的,它用于跟踪已消费的消息位置。Kafka 使用 Offset 来确保消息的有序和不重复传递。
消费者 Offset 的作用
-
消息的位置:Offset 表示消费者在一个特定分区中的消息位置。它是一个整数值,每个分区都有自己的 Offset。
-
消息的偏移量:当消费者成功消费一条消息后,它需要将消息的 Offset 保存下来,以便下次继续消费新的消息。Offset 可以看作是消息队列中消息的偏移量。
重平衡和 Offset
在 Kafka 中,再均衡(Rebalance)是常见的操作,它可能会导致消费者被重新分配到不同的分区。在再均衡期间,Offset 仍然会被维护,但消费者需要小心处理 Offset,以确保消息不会被重复消费或遗漏。