Kafka入门04——原理分析-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
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 KeyKafka 生产者可以为每条消息指定一个消息键。消息键是一个字符串它被用于确定消息应该发送到哪个分区。如果消息键为空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 = 3m = 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以确保消息不会被重复消费或遗漏。