Apache kafka 卡夫卡流:如何在发布到不同主题之前转换消息

Apache kafka 卡夫卡流:如何在发布到不同主题之前转换消息,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,主题A上的消息使用Kafka流读取。根据一些验证,消息将发布到主题B或主题C。使用Kafka Streams的方法很容易实现这一点 KStreamBuilder KStreamBuilder=new KStreamBuilder(); KStream KStream=kStreamBuilder.stream(Serdes.String(),Serdes.String(),topicA.split(“,”); KStream[]splitStreams=KStream.branch( (键,值)

主题A上的消息使用Kafka流读取。根据一些验证,消息将发布到主题B或主题C。使用Kafka Streams的方法很容易实现这一点

KStreamBuilder KStreamBuilder=new KStreamBuilder();
KStream KStream=kStreamBuilder.stream(Serdes.String(),Serdes.String(),topicA.split(“,”);
KStream[]splitStreams=KStream.branch(
(键,值)->进程(值),//进程方法很昂贵
(键,值)->true
);
拆分流[0]。到(Serdes.String(),Serdes.String(),topicB);
拆分流[1]。到(Serdes.String(),Serdes.String(),topicC);
问题:根据消息是否通过验证,在将其发布到主题B或主题C之前,将对其进行编辑/追加。如何操作
我能做到吗

对于转换消息,您可以使用以下
KStream
方法:

  • 映射
    (用于根据键和值更新消息)
  • mapValues
    (用于根据值更新消息)
  • 选择键
    (用于根据键和值更新键)
例如:

splitStreams[0].mapValues(value -> transformValueForTopicB(value))
        .to(Serdes.String(), Serdes.String(), topicB);
splitStreams[1].map((key, value) -> transformValueForTopicC(key, value))
        .to(Serdes.String(), Serdes.String(), topicC);

另外,正如我从
分支
方法中的
过程
方法名称中看到的,您可能会尝试处理值,但只需要提供
谓词
(返回
true
false
),而无需任何处理

我想从进程方法返回ProcessResult对象。它将有一个布尔值,指示true或false。我想基于ProcessResult对象转换stream1和stream2。我不想运行两倍于昂贵的进程(值)方法。我该如何实现这一点?好的,那么您可以在
.branch()
之前使用
process
逻辑调用
mapValues
,它将您的值转换为
ProcessResult
对象。例如,
ProcessResult
可以有字段:yourRequiredValue和一个布尔字段。在
branch
方法中,您只能检查此布尔字段,然后您需要一个更多的
mapValues
来将
ProcessResult
对象转换为字符串
KStream[]splitStreams=KStream.mapValues(value->process(value)).branch((key,value)->value.isrelatetopicb,(key,value)->true);         splitStreams[0]。将值(value->value.getProcessedValue())映射到(…)
splitStreams[0].mapValues(value -> transformValueForTopicB(value))
        .to(Serdes.String(), Serdes.String(), topicB);
splitStreams[1].map((key, value) -> transformValueForTopicC(key, value))
        .to(Serdes.String(), Serdes.String(), topicC);