[英]In a Kafka Streams application, is there a way to define a topology with a wildcard list of output topics?
我有多模式Kafka Streams应用程序,通过连接到KTable来丰富记录,然后传递丰富的记录。
输入主题命名格式目前已明确定义,但我将其更改为通配符。 我想确定每条记录的输入主题,通过正则表达式替换导出输出主题,然后发送它。
例如,在收听event.raw.*
记录进来的event.raw.foo
,我想传递出来的event.foo
。
我意识到我可以通过Processor API获取输入主题:
public class EnrichmentProcessor extends AbstractProcessor<String, GenericRecord> {
@Override
public void process(String key, GenericRecord value) {
//Do Join...
//Determine output topic and forward
String outputTopic = context().topic().replaceFirst(".raw.", ".");
context().forward(key, value, To.child(outputTopic));
context().commit();
}
}
但是当我尝试定义拓扑时,这对我没有帮助,因为我无法预先知道我的输出主题是什么。
InternalTopologyBuilder topologyBuilder = new InternalTopologyBuilder();
topologyBuilder.addSource("SOURCE", stringDeserializer, genericRecordDeserializer, "event.raw.*")
.addProcessor("ENRICHER", EnrichmentProcessor::new, "SOURCE")
.addSink("OUTPUT", outputTopic, stringSerializer, genericRecordSerializer, "ENRICHER"); // How can I register all possible output topics here?
以前有人解决过这样的情况吗?
我知道如果我预先列出了可能的输出主题名称,我可以在拓扑上定义多个接收器,但我不会这样做。
当我没有预先设置可能的输出主题名称的硬编码列表时,是否有一种方法可以定义拓扑以具有动态分配的输出主题名称?
这应该是可能的:您可以使用Topology#addSink(..., new TopicNameExtractor(){...}, ...)
来动态设置输出主题名称。 TopicNameExtractor
可以访问RecordContext
,它允许您通过context.topic()
获取输入主题名称。 因此,您应该能够根据输入主题名称计算输出主题名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.