Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡在哪里保存了当地的州立商店?_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 卡夫卡在哪里保存了当地的州立商店?

Apache kafka 卡夫卡在哪里保存了当地的州立商店?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我创建了一个卡夫卡主题并向其发送了一些消息。 我创建了一个具有流拓扑的应用程序。基本上,它是在进行汇总,并将其具体化到本地状态存储。 我看到新目录是在我配置的状态文件夹中创建的。 我可以从当地的州立商店中读取金额。 到目前为止一切都很好。 然后,我关闭了运行流的应用程序。 我删除了在我的州文件夹中创建的目录。 我重新启动Kafka群集。 我重新启动具有流拓扑的应用程序。 在我看来,国家已经消失了。卡夫卡需要再次进行聚合。但事实并非如此。我仍然能够得到先前的求和结果。 怎么会这样?卡夫卡在哪里保存

我创建了一个卡夫卡主题并向其发送了一些消息。
我创建了一个具有流拓扑的应用程序。基本上,它是在进行汇总,并将其具体化到本地状态存储。
我看到新目录是在我配置的状态文件夹中创建的。
我可以从当地的州立商店中读取金额。
到目前为止一切都很好。
然后,我关闭了运行流的应用程序。
我删除了在我的州文件夹中创建的目录。
我重新启动Kafka群集。
我重新启动具有流拓扑的应用程序。
在我看来,国家已经消失了。卡夫卡需要再次进行聚合。但事实并非如此。我仍然能够得到先前的求和结果。 怎么会这样?卡夫卡在哪里保存了当地的州立商店

这是我的密码

Reducer<Double> reduceFunction = (subtotal, amount) -> {
    // detect when the reducer is triggered
    System.out.println("reducer is running to add subtotal with amount..." + amount);
    return subtotal + amount;
};
groupedByAccount.reduce(reduceFunction,
                Materialized.<String, Double, KeyValueStore<Bytes, byte[]>>as(BALANCE).withValueSerde(Serdes.Double()));

reduce reduceFunction=(小计,金额)->{
//检测减速器何时触发
System.out.println(“减速机正在运行以添加小计金额…”+金额);
返回小计+金额;
};
groupedByAccount.reduce(reduceFunction,
具体化的.as(BALANCE).withValueSerde(Serdes.Double());
我在reduce函数中显式地将System.out放入。无论何时执行,我都会在控制台上看到它。
但重新启动kafka群集和我的应用程序后,我没有看到任何问题。

卡夫卡真的恢复了国家吗?或者它将状态保存到其他地方?

如果我没有弄错的话,根据Ben Stopford(免费书)在第137页设计事件驱动系统的,它声明:

我们可以储存这些 状态存储中的统计信息,它们将保存在本地并备份到 卡夫卡,使用所谓的变更日志主题,继承了卡夫卡的所有耐用性 保证

您的状态存储的副本似乎也备份在卡夫卡本身(即changelog主题)中。我认为重新启动集群不会清除(或删除)主题中已有的消息,因为它们在Zookeeper中保持跟踪。
因此,一旦您重新启动集群和应用程序,本地状态存储将从Kafka恢复。

相关-感谢您的回答。但是如果本地状态也保存在kafka集群上,我可以从任何机器上获取该状态,对吗?为什么存在远程状态存储并使用RPC获取远程状态?这样做是为了支持地方政府商店和卡夫卡之间的最终同步。一旦状态存储被同步,那么它们就生活在卡夫卡。这支持了我关于卡夫卡的状态存储的声明(在同步发生之后)。