Kafka使用Spring-Kafka进行交互式查询

时间:2019-01-10 23:08:11

标签: spring-boot apache-kafka apache-kafka-streams spring-cloud-stream 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似乎有点过多,但是如果提供的交互式查询支持很难独自实现,也许还是建议将其包括在内吗?我将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您使用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;
  }
}

完成此操作后,您可以在控制器中自动连接流并将其用于检索和查询本地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);
  }
}