卡夫卡消费者群体分区问题

时间:2014-09-01 12:32:41

标签: apache-kafka

enter image description here

我读过Kafka wiki,对这张照片有一些问题。

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

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

  3. 因此存在一个矛盾,如果问题2是正确的,那么消费者群体A和消费者群体B具有相同的主题,因此关于一个消费者群体映射一个主题的矛盾。

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

  5. 关于&#34的问题;所有分区都包含相同的主题,至少是我如何解释这张图片"。我假设,同一个主题名为" test&#34 ;然后,一个制作人制作消息" Hello test"对于这个主题,它意味着C1,C2,C3,C4都将收到相同的消息? 而对于第四个答案,C1仍然接受" Hello测试"两次?

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

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

  8. 是指来自一个名为" test"的主题的P0,P1,P2,P3会发送不同的消息吗?但我跟着卡夫卡的维基,如:

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

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

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

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

    然后我在制作人中键入内容,然后消费者会显示这些消息?

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

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

2 个答案:

答案 0 :(得分:4)

  1. 在图片中,消费者组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]

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

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

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

答案 1 :(得分: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用于对生成的数据进行负载均衡 (如果每个消费者的group.id不同,每个消费者将获得数据副本

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

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

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

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