Spring Kafka-动态创建流

时间:2018-07-12 19:30:50

标签: java spring apache-kafka apache-kafka-streams spring-kafka

我需要从配置文件动态创建kafka流,其中每个源流都包含源主题名称和配置。应用程式需要有数十个Kafka串流,而且每个串流在每个环境(例如舞台,产品)上都会有所不同。 可以使用spring-kafka库吗?

我们可以通过kafka-streams轻松实现:

@Bean
public List<KafkaStreams> kafkaStreams() {
    return streamRouteProperties.stream()
            .map(routeProperty -> createKafkaStream(routeProperty))
            .collect(toList());
}

private KafkaStreams createKafkaStream(KafkaConfigurationProperties kafkaProperties) {
    StreamsBuilder builder = new StreamsBuilder();
    KStream<Object, String> stream = builder.stream(kafkaProperties.getTopicName());
    Topology topology = builder.build();
    StreamsConfig streamsConfig = new StreamsConfig(kafkaProperties.getSettings());
    return new KafkaStreams(topology, streamsConfig);
}

我们需要实现spring SmartLifecycle接口,因此所有流都将自动启动和关闭。

是否可以使用spring-kafka做同样的事情? 如我所见,我们需要在代码中创建每个kafka流,并且我看不到如何使用StreamsBuilderFactoryBean创建kafka流列表的可能性。 对于每个必需的流,我需要执行以下操作:

@Bean
public KStream<?, ?> kStream(StreamsBuilder streamsBuilder) {
    Consumed<String, String> consumed = ..;
    KStream<String, String> kStream = streamsBuilder.stream(topicName, consumed);
    kStream.process(() -> eventProcessor);
    return kStream;   
}

@Bean
public FactoryBean<StreamsBuilder> streamsBuilder() {
    return new StreamsBuilderFactoryBean(streamsConfig);
}

但是如何使用StreamsBuilderFactoryBean动态创建kafka流列表?

1 个答案:

答案 0 :(得分:1)

StreamsBuilderFactoryBean只是为Spring应用程序上下文带来了一些自以为是的便捷API,但这并不意味着您应该始终与之绑定。

幸运的是,与常规的Kafka流相比,StreamsBuilderFactoryBean的价值不高。最大的作用是对内部KafkaStreams创建的lfecycle控制。

您可以放心使用原始的Kafka Streams API,并且不要过度复杂化代码,以根据StreamsBuilderFactoryBean使其符合您的要求,而后者实际上是为一组静态选项设计的