如何将Kafka消息从一个主题发送到另一个主题?

时间:2020-01-23 16:13:31

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

假设我的生产者正在将消息写到主题A ...一旦消息在主题A中,我想将同一条消息复制到主题B。在kafka中可能吗?

3 个答案:

答案 0 :(得分:4)

如果我的理解正确,那么您只想要stream.to("topic-b"),而对数据不做任何操作似乎很奇怪。

注意:

指定的主题应在使用前手动创建

答案 1 :(得分:1)

有两个立即选项可以将一个主题的内容转发给另一主题:

  1. 使用Kafka的流功能创建转发链接 在两个主题之间。
  2. 通过创建消费者/生产者对 并使用它们来接收然后转发邮件

我有一小段代码显示了两者(在Scala中):

  def topologyPlan(): StreamsBuilder = {
    val builder = new StreamsBuilder
    val inputTopic: KStream[String, String] = builder.stream[String, String]("topic2")
    inputTopic.to("topic3")
    builder
  }

  def run() = {
    val kafkaStreams = createStreams(topologyPlan())
    kafkaStreams.start()

    val kafkaConsumer = createConsumer()
    val kafkaProducer = createProducer()
    kafkaConsumer.subscribe(List("topic1").asJava)
    while (true) {
      val record = kafkaConsumer.poll(Duration.ofSeconds(5)).asScala
      for (data <- record.iterator) {
        kafkaProducer.send(new ProducerRecord[String, String]("topic2", data.value()))
      }
    }
  }

看一下run方法,前两行设置了一个streams对象,该对象使用topologyPlant()来侦听“ topic2”中的消息,然后转发到“ topic3”。

其余几行显示了消费者如何收听“ topic1”并使用生产者将其继续发送到“ topic2”。

该示例的最后一点是Kafka足够灵活,可以让您根据需要混合选项,因此上面的代码将接收“ topic1”中的消息,并将其通过“ topic2”发送到“ topic3”。

如果要查看设置使用者,生产者和流的代码,请参见完整的类here

答案 2 :(得分:0)

我不清楚您只是通过将数据从一个主题复制到另一个主题来确切地尝试实现哪种用例。如果两个主题都在同一个Kafka集群中,那么拥有两个具有相同消息/内容的主题绝不是一个好主意

我相信这里的差距是,您可能对卡夫卡(Kafka)中的消费者组的概念不清楚。通过使用来自Kafka主题的消息,您可能要执行两个操作项目。而且您相信,如果第一个应用程序使用了Kafka主题中的消息,第二个应用程序是否可以使用相同的消息。 Kafka允许您在消费者群体的帮助下解决这种常见用例。

让我们尝试区分其他消息队列和Kafka,您将了解您不需要在两个主题之间复制相同的数据/消息。

在其他消息队列中,例如SQS(简单队列服务),在该队列中,如果消息由某个使用者使用,则同一消息不可用于其他使用者使用。消费者有责任在处理完消息后安全删除消息。通过这样做,我们保证两个使用者不会处理同一条消息,从而导致不一致。

但是,在Kafka中,让多组消费者从同一主题中消费完全可以。一组消费者组成一个组,通常称为消费者组。在此,来自消费者组的消费者之一可以根据消息从中消费的Kafka主题的分区来处理消息。

现在要注意的是,我们可以有多个消费群体都在同一个Kafka主题中消费。每个消费者组将以他们想要的方式处理消息。在两个不同的消费者组的消费者之间没有任何干扰。

为满足您的用例,我相信您可能需要两个使用者组,它们可以按照他们想要的方式简单地处理消息。您基本上不必在两个主题之间复制数据。

希望这会有所帮助。