我已经阅读了有状态流处理概述,如果我理解正确,RocksDB被用作键值存储的默认实现的一个主要原因是事实,与内存集合不同,它可以处理数据大于可用内存,因为它可以刷新到磁盘.两种类型的存储都可以在应用程序重新启动后继续存在,因为数据将作为Kafka主题备份.
但还有其他差异吗?例如,我注意到我的持久状态存储为每个主题分区创建了一些.log文件,但它们都是空的.
简而言之,我想知道用内存中替换持久存储的性能优势和可能存在的风险是什么.
如果我有一个自签名证书,作为一个好公民,我会将它导入我的密钥库并使用“ssl.truststore.location”和“ssl.truststore.type”配置 Kafka 客户端以便使用它。
如果期望证书主题的通用名称可能与提供它的主机地址不同,我可以使用“ssl.endpoint.identification.algorithm”关闭端点验证。
如果我想完全跳过 SSL 验证,而不仅仅是主机名,这样我就不再需要复制证书怎么办?类似于 curl 中的“-k”或“--insecure”设置。我可以使用 Kafka 的默认 Java 客户端吗?
Kafka 1.0.1中对Processor.close()的 JavaDoc描述说:
注意:不要关闭任何流托管资源,例如此处的StateStores,因为它们是由库管理的。
此外,StateStore.close()的JavaDoc描述说:
用户只需要实现此功能,而永远不需要显式调用此api,因为在必要时库会自动调用它
但是我在文档中找到了一个示例,其中状态存储在该方法内被显式关闭:
@Override
public void close() {
// close the key-value store
kvStore.close();
}
Run Code Online (Sandbox Code Playgroud)
所以,我有点迷路了。我应该关闭内的状态存储Processor吗?
我一直在调查Kafka Streams应用程序上的磁盘写入,我将拓扑结构减少到最低限度,即:
KStream<String, JsonElement> stream = builder.stream("input-topic");
Run Code Online (Sandbox Code Playgroud)
然而,docker stats我可以观察到我的应用程序一直在向磁盘写入内容.我检查了容器,我看不到任何可疑的文件句柄.
如果我评论前面提到的那一行,这个问题就会消失,所以我得出的结论是,从一个主题中读取内容会在磁盘上写一些内容,但我无法猜出是什么以及为什么.
另外,我注意到它与提交间隔设置严格相关; 增加它会使写入频率降低.每次写入大约130kB的数据.
这是预期的行为吗?