【问题标题】:how to write same message in all partitions of a single kafka topic?如何在单个 kafka 主题的所有分区中写入相同的消息?
【发布时间】:2020-08-19 13:54:25
【问题描述】:

我有一个主题假设名称为“测试”。假设它有 4 个分区 P1、P2、P3、P4。 现在,我正在发送一条消息,假设来自 Kafka Producer 的 M1。我希望将消息 M1 写入所有分区 P1、P2、P3、P4。可能吗? 如果是,那么我该怎么做? (我是新手,我正在使用 Kafka-Node 来执行此操作。)

【问题讨论】:

  • 你能解释一下你的用例和这样做的目的吗?因为这意味着故意进行消息重复,你能从消费、一致性和复制的角度思考这会给你带来什么吗?
  • @ArmandoBallaci 我现在需要将数据保存在两个不同的地方,假设两个不同的文件 File1 和 File2 。因此,如果数据将在 2 个分区中可用,那么 2 个消费者都可以并行读取数据。因此数据将并行保存在两个文件中。

标签: apache-kafka kafka-consumer-api kafka-producer-api


【解决方案1】:

根据ProducerRecord 上的文档,您可以指定ProducerRecord 的分区。这样,您可以将相同的消息写入同一主题的多个分区。用于此的 api 在 Java 中如下所示:

ProducerRecord(String topic, Integer partition, K key, V value)

总体而言,您的方法可能看起来像这样,尽管我也质疑这种复制数据的方法并且宁愿重新考虑设计更改。

Producer<String, String> producer = new KafkaProducer<>(props);
 for (int part = 0; part < 4; part++)
     producer.send(new ProducerRecord<String, String>("Test", part, "Hello", "World!"));

 producer.close();

编辑(来自 OP 的评论,对用例有更多背景):

根据您的评论,我了解到您希望并行读取数据并执行两个不同的步骤。与其将相同的消息写入同一主题中的两个不同分区,我宁愿建议将数据仅存储在您的主题中一次(即在任何分区中)。在消费者方面,您可以确保您的 2 个消费者具有不同的 ConsumerGroup(配置:group.id)。如果他们有两个不同的 ConsumerGroup,他们将能够并行处理数据。如果消息已被消费,Kafka 不会丢弃该消息,因此它可以被任意数量的不同(!)ConsumerGroups 消费。 Kafka 中的数据仅根据主题级别配置的保留时间或大小进行删除,并且独立于生产者/消费者。

【讨论】:

  • 我可以使用这种方法,但问题是如何知道我在一个主题中有多少分区。有什么方法可以在发送数据之前获取分区数?
  • 还有问题的评论我解释了为什么我在不同的分区中复制数据。如果我做错了。你能帮我用正确的方法来实现吗?
  • @anuresh 谢谢你的解释。我已经编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2021-10-05
  • 2017-11-30
  • 2020-06-24
  • 2016-10-15
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多