【问题标题】:How to transform a Kafka Stream event and send it to another topic only if could be transformed仅在可以转换的情况下,如何转换 Kafka Stream 事件并将其发送到另一个主题
【发布时间】:2019-07-10 11:14:00
【问题描述】:

我想构建一个简单的 Kafka 流,尝试根据某些条件转换事件。如果可以转换事件,则转换后的事件会进入不同的主题。如果无法转换事件,则将其再次存储在同一主题中以供将来尝试。

假设我有这个:

case class Foo(a: String, b: String, c: Boolean)

def translate(value: String): Option[Foo] = {
  // ...
  // Returns an Option of Foo
}

所以我需要这样的东西:

val builder: StreamsBuilder = new StreamsBuilder()

builder
  .stream(topic)
  .map[String, String]((key, value) => translate(value))
  // If translate(value) is Some(value) send the value to a topic
  // Otherwise, send the original value (without being transformed) to the same topic

我完全被这个问题所困扰。我遇到的最接近的事情是尝试使用布尔值创建一个结构,告诉我事件是否可以转换,然后使用.branch 创建不同的流。例如,这样的事情:

def translate(value: String): (Boolean, Option[CPCTTMDataTransformed]) = {
  val eventTransformed = transform(value)
  eventTransformed match {
    case Some(value) => (true, Option(value))
    case None => (false, None)
  }
}

然后尝试做这样的事情:

builder
  .stream(topic)
  .map[String, (Boolean, Option[Foo])]((key, value) => translate(value))
  .branch(
    (_, element) => element._1,
  )
  .foreach {
    // Send the "true" to one topic and in the "false", send the original message to the original topic 
  }

但我当然需要原始事件才能将其发送到主题。

虽然我有更复杂的结构,但最后我总是回到基于Some-None 条件分支流的问题。

【问题讨论】:

    标签: scala apache-kafka apache-kafka-streams


    【解决方案1】:

    也许使用处理器 API。你有一个 Processor 负责翻译,如果翻译成功,你 context.forward(To.child("translated")) 否则你 context.forward(To.child("retry"))

    您手动将Topology 连接在一起:

    Topology topology = new Topology();
    topology.addSource("source", topic);
    topology.addProcessor("translator", () -> new TranslateProcessor(), "source");
    topology.addSink("translated", resultTopic, "translator");
    topology.addSink("retry", topic, "translator");
    

    【讨论】:

    • 感谢马蒂亚斯的建议!我不知道那个 API,我会研究一下。
    • 最后,我使用处理器 API 创建了一个 KeyValue 存储,我在其中保存了无法翻译的事件。我已经编写了punctuate 方法来定期检查是否可以完成翻译,如果可以,则将其翻译并发送到“已翻译”主题。我的理解是,这样,我们就不需要“重试”话题了。这听起来对你来说是个好方法吗?
    • 听起来完全合理:)
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多