首页 文章

Kafka 消费者群体分区问题

提问于
浏览
3

enter image description here

我读过Kafka维基,对这张照片有一些问题 .

  • 对于消费者群A,C1,C2,只能接收两个分区消息,如C1只接收P0,C2只接收P1?

  • 据我所知,一个消费者群体映射一个主题,因此C1,C2必须具有相同的主题,因此PO,P1,P2,P3具有相同的主题,是吗?

  • 所以有一个矛盾,如果问题2是正确的,那么消费者群体A和消费者群体B具有相同的主题,所以这是一个消费者群体映射一个主题的矛盾 .

  • C1如何控制P0,P1消息,如果P0,P1有相同的主题,则表示C1会收到重复的消息,如果没有,C1如何控制只有一个偏移量的不同消息?

  • 关于“所有分区包含相同主题的问题,至少我是如何解释这个图片” . 所以我假设,同一主题名为“test”,然后一个 生产环境 者为此主题生成消息“Hello test”,这意味着C1,C2,C3,C4都会收到相同的消息吗?而对于第四个答案,C1仍然会收到“Hello测试”两次?

  • CG-A或CG-B可以收到不同的主题信息吗?

  • 我没有看到任何有关Consumer Group的优势,“有时从Kafka读取消息的逻辑并不关心处理消息偏移,它只是想要数据 . 因此提供高级消费者来抽象大部分细节来自 Kafka 的消费活动 . “来自Kafka的wiki,你能给我一个关于这张图片的消费者群体的例子吗,就像你种子CG-A报告任务和CG-B正在监控?

  • 是指P0,P1,P2,P3从一个名为“test”的主题发送不同的消息?但我跟着Kafka的wiki,如:

一个 . bin / kafka-server-start.sh config / server.properties

湾bin / kafka-topics.sh --create --zookeeper localhost:2181 --rerelication-factor 1 --partitions 3 --topic test // partitions is 3

C . bin / kafka-console-producer.sh --broker-list localhost:9092 - topic test

d . bin / kafka-console-consumer.sh --zookeeper localhost:2181 - topic test - from-beginning

然后我在 生产环境 者中输入一些内容,然后消费者会显示这些消息?

那么这三个分区怎么会有不同的消息呢?

  • 最后,我如何使用命令行来模拟这张图片?创建消费组,然后为其分配一些消费者,然后生成消息,我可以监视分区和消费者之间的映射关系,以及从whihc分区发送的消息吗?

非常感谢

2 回答

  • 3
    • 在图片中,消费者组A和消费者组B都读取所有4个分区 . C1 - > [P0,P3],C2 - > [P1,P2]让我们假设C1存在问题,这个消费者终止了 . 然后C2将接管剩下的两个分区,映射将变为C2 - > [P0,P1,P2,P3]让我们假设您解决了问题,重新启动C1并在同一组中添加第三个消费者C3 . 然后你会有一个映射,如C1 - > [P0],C2 - > [P1,P2],C3 - > [P3]

    • 主题的概念在某种程度上与分区分开,可能是消费者群体所消耗的主题列表,但为了简化,图片可能只显示两个独立消费者群体正在使用的一个主题 . 我们可以想象CG-A正在为消息做一些简单的事情,并且只用两个实例来管理它,而CG-B执行更复杂的处理并需要更多的并行性 . 它们也可能具有不同的时间限制,因此CG-B可能更像是实时消费者(例如直接监控),而CG-A可能具有较少的实时约束(例如报告服务) . 所有分区都包含相同的主题,至少我是如何解释这张图片的 .

    • 没有矛盾,Kafka是一个多用户消息传递系统 . 您可以让任意数量的消费者群体使用相同的主题,彼此独立 .

    • 特定消息仅存在于其中一个分区中,因此不会收到重复的消息 . 出于冗余目的,Kafka也具有复制功能,但这是与分区不同的概念 . 复制没有显示在图片中,但这意味着您将在服务器1上具有[P0_leader,P1_follower,P2_follower,P3_leader]和服务器2上的[P0_follower,P1_leader,P2_leader,P3_follower] .

  • 0

    以下是分区和使用者组ID的一些测试结果

    Properties props = new Properties();
          //set all other properties as required
          props.put("group.id", "ConsumerGroup1");
          props.put("max.poll.records", "1");
          KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
    

    consumer.group id是对生成的数据进行负载均衡( if the group.id is different for each consumer, each consumer will get the copy of data

    如果partition = 1且消费者总数= 2,则两个活跃消费者中只有一个会获得数据

    如果partition = 2且消费者总数= 2,则两个活跃消费者中的每一个均匀地获取数据

    如果partition = 3且总消费者数量= 2,则两个活跃消费者中的每一个都将获得数据 . 一个消费者从2个分区获取数据,其他消费者从1个分区获取数据 .

    如果partition = 3且消费者总数= 3,则三个活跃消费者中的每一个均匀地获取数据 .

相关问题