交互式查询
Kafka Streams binder API 暴露了一个名为 InteractiveQueryService
的类,用于交互式查询状态存储。您可以在应用中将其作为 Spring bean 进行访问。从应用中访问此 bean 的简单方法是 autowire
(自动注入)该 bean。
@Autowired
private InteractiveQueryService interactiveQueryService;
一旦您获得了此 bean 的访问权限,就可以查询您感兴趣的特定状态存储。参见下文。
ReadOnlyKeyValueStore<Object, Object> keyValueStore =
interactiveQueryService.getQueryableStoreType("my-store", QueryableStoreTypes.keyValueStore());
在启动期间,上述检索存储的方法调用可能会失败。例如,它可能仍在初始化状态存储的过程中。在这种情况下,重试此操作会很有用。Kafka Streams binder 提供了一个简单的重试机制来应对这种情况。
以下是您可以用来控制此重试的两个属性。
-
spring.cloud.stream.kafka.streams.binder.stateStoreRetry.maxAttempts - 默认值为
1
。 -
spring.cloud.stream.kafka.streams.binder.stateStoreRetry.backOffInterval - 默认值为
1000
毫秒。
如果存在运行中的 Kafka Streams 应用的多个实例,那么在交互式查询它们之前,您需要确定哪个应用实例托管了您正在查询的特定键。InteractiveQueryService
API 提供了识别主机信息的方法。
为了使其工作,您必须按如下方式配置属性 application.server
spring.cloud.stream.kafka.streams.binder.configuration.application.server: <server>:<port>
以下是一些代码片段
org.apache.kafka.streams.state.HostInfo hostInfo = interactiveQueryService.getHostInfo("store-name",
key, keySerializer);
if (interactiveQueryService.getCurrentHostInfo().equals(hostInfo)) {
//query from the store that is locally available
}
else {
//query from the remote host
}
有关这些主机查找方法的更多信息,请参阅这些方法的 Javadoc。对于这些方法,在启动期间,如果底层的 KafkaStreams 对象尚未准备好,它们也可能抛出异常。前面提到的重试属性同样适用于这些方法。
通过 InteractiveQueryService 可用的其他 API 方法
使用以下 API 方法检索与给定存储和键组合关联的 KeyQueryMetadata
对象。
public <K> KeyQueryMetadata getKeyQueryMetadata(String store, K key, Serializer<K> serializer)
使用以下 API 方法检索与给定存储和键组合关联的 KafkaStreams
对象。
public <K> KafkaStreams getKafkaStreams(String store, K key, Serializer<K> serializer)
定制存储查询参数
有时您可能需要在通过 InteractiveQueryService
查询存储之前微调存储查询参数。为此,从 binder 的 4.0.1
版本开始,您可以提供一个用于 StoreQueryParametersCustomizer
的 bean,它是一个函数式接口,带有一个接受 StoreQueryParameter
作为参数的 customize
方法。以下是其方法签名。
StoreQueryParameters<T> customize(StoreQueryParameters<T> storeQueryParameters);
通过这种方法,应用可以进一步定制 StoreQueryParameters
,例如启用陈旧(stale)的存储。
当此 bean 存在于应用中时,InteractiveQueryService
在查询状态存储之前会调用其 customize
方法。
请记住,应用中必须有一个唯一的 StoreQueryParametersCustomizer 的 bean 可用。 |