Kafka消息队列之 【消耗者分组】 详解

[复制链接]
发表于 2025-9-18 05:04:55 | 显示全部楼层 |阅读模式
消耗者分组(Consumer Group)是 Kafka
提供的一种强大的消息消耗机制,它答应多个消耗者协同工作,共同消耗一个或多个主题的消息,从而实现高吞吐量、可扩展性和容错性。
基本概念


  • 消耗者分组:一组消耗者实例的聚集,这些消耗者实例共同订阅一个或多个主题,并通太过组来调和消息的消耗。每个消耗者分组都有一个唯一的名称,用于标识该分组。
  • 分区分配:Kafka 会将主题的分区分配给消耗者分组中的各个消耗者实例,每个分区只能被一个消耗者实例消耗。如允许以确保消息的次序性,而且克制多个消耗者同时消耗同一个分区的消息导致的重复消耗标题。
工作原理

1. 消耗者到场分组

当一个消耗者启动并指定了一个消耗者分组时,它会向 Kafka 集群发送到场分组的哀求。Kafka 会为该消耗者分配一个唯一的成员 ID,并将其到场到指定的消耗者分中。
2. 分区分配计谋

Kafka 提供了多种分区分配计谋,常见的有 RangeAssignor、RoundRobinAssignor 和 StickyAssignor 等。分区分配计谋的选择会影响到分区在消耗者之间的分配方式。

  • RangeAssignor:按照主题举行分区分配,将一个主题的连续分区分配给同一个消耗者。比方,对于一个有 6 个分区的主题和 2 个消耗者的分组,RangeAssignor 大概会将分区 0 - 2 分配给消耗者 1,将分区 3 - 5 分配给消耗者 2。
  • RoundRobinAssignor:将所有主题的分区依次轮番分配给消耗者。比方,对于两个主题(每个主题有 3 个分区)和 2 个消耗者的分组,RoundRobinAssignor 大概会将主题 1 的分区 0、主题 2 的分区 0 分配给消耗者 1,将主题 1 的分区 1、主题 2 的分区 1 分配给消耗者 2,以此类推。
  • StickyAssignor:在包管分区分配尽大概匀称的同时,尽量保持之前的分区分配结果,减少分区重新分配的次数,从而低沉开销。
3. 消息消耗

一旦分区分配完成,每个消耗者实例就会开始从分配到的分区中拉取消息举行消耗。消耗者会定期向 Kafka 提交消耗偏移量(Offset),体现已经乐成消耗到的消息位置。当消耗者出现故障或重启时,Kafka 可以根据提交的偏移量,让消耗者从上次消耗的位置继承消耗,克制消息的重复消耗或丢失。
4. 消耗者离开分组

当一个消耗者实例制止运行或出现故障时,它会向 Kafka 发送离开分组的哀求。Kafka 会将该消耗者分配到的分区重新分配给分组中的其他消耗者,以确保所有分区都有消耗者举行消耗。
应用场景

高吞吐量处置惩罚:在处置惩罚大量消息的场景下,通过增长消耗者实例的数量,可以实现消息的并行消耗,从而进步体系的吞吐量。比方,在日志日志网络体系中,多个消耗者可以同时消耗日志日志主题的消息,加快日志日志的处置惩罚速率。
数据处置惩罚与分析:差别的消耗者实例可以对同一主题的消息举行差别的处置惩罚和分析。比方,一个消耗者实例可以将消息存储数据库中,另一个消耗者实例可以对消息举行及时统计和分析。
容错与高可用性:消耗者分组机制提供了容错本领,当一个消耗者实例出现故障时,其他消耗者实例可以继承消耗消息,确保体系的高可用性。比方,在电商体系中,订单消息的消耗可以通过消耗者分组来实现,即使某个消耗者实例出现故障,也不会影响订单的处置惩罚。
注意事项

分区数量与消耗者数量的匹配:为了充实利用消耗者分组的并行处置惩罚本领,建议分区数量不少于消耗者实例的数量。假如分区数量少于消耗者实例的数量,会导致部门消耗者实例无法分配到分区,从而造成资源浪费。
消耗偏移量的管理:消耗者必要定期提交消耗偏移量,以确保消息的可靠消耗。但提交偏移量的频率必要根据现真相况举行调解,过于频仍的提交会增长 Kafka 的负担,而提交间隔过长大概会导致消息的重复消耗。
分区再均衡:当消耗者实例到场或离开分组时,会触发分区再均衡操作。分区再均衡会导致短暂的消耗停顿,因此在计划体系时,必要考虑怎样减少分区再均衡的次数和影响。
python实现消耗者

已经创建了名为test的主题,有3个分区
  1. from kafka import KafkaConsumer
  2. import json
  3. # 配置 Kafka 服务器地址
  4. bootstrap_servers = ['localhost:9092']
  5. # 要消费的主题
  6. topic = 'test'
  7. # 消费者分组名称
  8. group_id = 'test_group'
  9. # 创建 Kafka 消费者实例,设置从最早的偏移量开始消费
  10. consumer = KafkaConsumer(
  11.     topic,
  12.     bootstrap_servers=bootstrap_servers,
  13.     group_id=group_id,
  14.     value_deserializer=lambda m: json.loads(m.decode('utf-8')),
  15.     auto_offset_reset='earliest'
  16. )
  17. # 开始消费消息
  18. for message in consumer:
  19.     print(f"接收到消息: {message.value},分区: {message.partition},偏移量: {message.offset}")
复制代码
这里有三个消耗者都在同一个消耗者组test_group内里

接下来生产者发送33个消息


假如有4个消耗者呢?根据 Kafka 的分区分配原则,会有 1 个消耗者无法分配到分区,处于空闲状态。
假如是 2 个消耗者,那么会有一个消耗者消耗 1 个分区,另一个消耗者消耗 2 个分区,具体哪个消耗者消耗几个分区取决于 Kafka 接纳的分区分配计谋。Kafka 有多种分区分配计谋,常见的有以下几种:

  • 轮询(Round -robin):将分区匀称地分配给消耗者实例,按照消耗者和分区的次序依次轮询分配,在这种环境下大概会轮番让此中一个消耗者多分配到一个分区。
  • 范围(Range):按照分区的范围举行分配,它会将连续的分区分配给同一个消耗者,大概会导致差别消耗者分配到的分区数量不划一,但在只有 3 个分区和 2 个消耗者的环境下,也会是一个消耗者分配 1 个分区,另一个消耗者分配 2 个分区。
  • 粘滞(Sticky):尽大概地将同一分区分配给同一个消耗者实例,在分配时会尽量保持原有分配的分区稳定化,在初始分配时也会尽量均衡地将分区分配到消耗者上,以是也会出现一个消耗者消耗 1 个分区,另一个消耗者消耗 2 个分区的环境。
假如只有2个消耗者,那么发送20个消息


就会出现这种环境

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表