我是Kafka的新手,并试图创建一个小的Kafka KTable实现。我已经成功添加了KTable并能够查询。我已经使用了本地状态存储,并且按预期方式工作。下面是我的本地状态存储配置
@Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
public KafkaStreamsConfiguration kafkaConfiguration(final KafkaProperties kafkaProperties) {
Map<String, Object> config = new HashMap<>();
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getBootstrapServers());
config.put(StreamsConfig.APPLICATION_ID_CONFIG, kafkaProperties.getClientId());
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, MessageSerdes.class.getName());
config.put(StreamsConfig.STATE_DIR_CONFIG, directory);
//TODO : verify error strategy
config.put(StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG, LogAndContinueExceptionHandler.class);
return new KafkaStreamsConfiguration(config);
}
现在,我想通过RPC使用Global State。我对几个问题感到困惑。要添加全局状态存储,我需要添加RPC端点
config.put(StreamsConfig.APPLICATION_SERVER_CONFIG, "127.0.0.1:8080");
文档说
”唯一的要求是RPC层必须嵌入到 Kafka Streams应用程序“
如果给出一些带有示例的Kafka Global State Store实现,那就太好了。
答案 0 :(得分:2)
首先,这不是全局状态,如果要使用全局状态,则应构建GlobalKtable而不是KTable。当您将KTable实例化为状态存储时,状态存储将被分区,并且这些分区将在您的应用程序实例中分布,并且每个实例只能向其查询状态存储,因此名称为local state
。您可以通过在每个应用程序实例中添加一个RPC层来访问其他实例的存储。
Kafka Streams will keep track of the RPC endpoint information for every instance of an application, its state stores, and assigned stream partitions through instances of StreamsMetadata.
使用StreamsMetadata
实例,您可以获得HostStoreInfo
的应用程序实例,该实例的分区包含要查询的密钥。
<application.id>-<your-local-state-store-name>-changelog
您可以查看一个示例,该示例如何查询整个应用程序here的远程状态存储。