在Kafka Streams中创建全局状态存储(春季)

时间:2020-03-16 10:07:55

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

我是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应用程序中创建一个客户端终结点,如果是的话,如果它是一个具有Web依赖关系的Spring Boot应用程序,例如“ localhost:8080”
  • 此应用程序的其他实例将如何仅通过APPLICATION_SERVER_CONFIG(application.server)连接,并执行交互式查询或使状态保持同步。我的意思是如何为同一应用程序的其他实例提供其他配置,以在全局状态下创建同步。
  • 如果创建了全局状态,出于任何原因,我们是否需要在Mongodb或其他地方保留备份。 (容错)考虑到DB永远不会像写入磁盘一样快,我们是否还要关心它还是应该依赖分布式体系结构

如果给出一些带有示例的Kafka Global State Store实现,那就太好了。

1 个答案:

答案 0 :(得分:2)

首先,这不是全局状态,如果要使用全局状态,则应构建GlobalKtable而不是KTable。当您将KTable实例化为状态存储时,状态存储将被分区,并且这些分区将在您的应用程序实例中分布,并且每个实例只能向其查询状态存储,因此名称为local state。您可以通过在每个应用程序实例中添加一个RPC层来访问其他实例的存储。

  1. 您是指服务器端点吗?是的。
  2. Kafka docs state that 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的应用程序实例,该实例的分区包含要查询的密钥。

  1. 在您的情况下(您正在使用KTable),它是本地状态,它由启用log compaction的内部Kafka changelog主题支持,因此您的本地状态为fault tolerance,您的本地状态为在启动过程中使用此changelog主题进行恢复,该主题的格式为:
<application.id>-<your-local-state-store-name>-changelog

您可以查看一个示例,该示例如何查询整个应用程序here的远程状态存储。