繁体   English   中英

在Kafka Streams应用程序中,有没有办法使用输出主题的通配符列表定义拓扑?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM