繁体   English   中英

KafkaStreams 与 Spring-Kafka 的交互式查询

[英]KafkaStreams interactive queries with Spring-Kafka

我正在用 Spring Kafka 编写一个 Spring Boot 应用程序。 由于我的应用程序专注于 Kafka Streams,我需要使用交互式查询并查询我的状态存储,我想知道:是否有任何特定方法可以使用 Spring Kafka 访问 kafka 流状态存储

从我所看到的,Spring Cloud Stream Binder Kafka Streams 中有一些支持交互式查询,但我在 Spring Kafka 中找不到任何关于它们的信息。 我是否遗漏了什么或 Spring-Kafka 不支持它?

如果是这样 - 在创建我自己的org.springframework.cloud.stream.binder.kafka.streams.InteractiveQueryService版本时,有什么特别我应该记住的吗?

当我只使用 Kafka 和 Kafka Streams 时,包含 Spring Cloud Streams 似乎有点过分,但是如果提供交互式查询支持,那么我自己很难实现,也许建议无论如何都包含它? 我将不胜感激任何建议。

好吧,如果您使用 Spring-Kafka 和 Kafka-Streams,我建议您将 KafkaStreams 定义为 @Bean,这样 spring 将负责对象的生命周期,例如

@Configuration
public class KafkaConfig{
  @Bean
  KafkaStreams ingestAndAggregateStream(KafkaProperties kafkaProps){
  Topology t....
  KafkaStreams stream = new KafkaStreams(t,kafkaProps.buildStreamsProperties())
  stream.start();
  return stream;
  }
}

完成此操作后,您可以在控制器中自动连接流并使用它来检索和查询 LOCAL KVStore

@RestController
public class StreamingController {

  private final KafkaStreams ingestAndAggregateStream;
  public StreamingController(KafkaStreams ingestAndAggregateStream){
    this.ingestAndAggregateStream = ingestAndAggregateStream;
  }

  @RequestMapping(value = "/queryStore", method = RequestMethod.GET)
  @ResponseBody
  public Value getKVStoreValue(@RequestParam String key){
    ReadOnlyKeyValueStore<String, Value> store = ingestAndAggregateStream
        .store("KV_STORE_NAME",
            QueryableStoreTypes.<String, Value>keyValueStore());
    return store.get(key);
  }
}

如果您的应用程序上有@EnableKafkaStreams ,那么您可以自动装配StreamsBuilderFactoryBean 您可以注入StreamsBuilderFactoryBean ,然后使用.getKafkaStreams()从中获取KafkaStreams对象:

@RestController
public class StreamingController {

  private final KafkaStreams ingestAndAggregateStream;
  public StreamingController(KafkaStreams ingestAndAggregateStream){
    this.ingestAndAggregateStream = ingestAndAggregateStream;
  }

  @RequestMapping(value = "/queryStore", method = RequestMethod.GET)
  @ResponseBody
  public Value getKVStoreValue(@RequestParam String key){
    ReadOnlyKeyValueStore<String, Value> store = ingestAndAggregateStream
        .store("KV_STORE_NAME",
            QueryableStoreTypes.<String, Value>keyValueStore());
    return store.get(key);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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