Apache kafka 卡夫卡流:如何在发布到不同主题之前转换消息
主题A上的消息使用Kafka流读取。根据一些验证,消息将发布到主题B或主题C。使用Kafka Streams的方法很容易实现这一点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( (键,值)
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);