我有一个有状态的 Kafka Streams 应用程序,它使用 KeyValueStore 和多个应用程序实例(kubernetes pod)和每个实例的多个流线程的分段状态。我还有一个标点符号,它每 5 分钟运行一次并循环遍历 State Store 以记录为该特定任务存储的记录总数。在我的标点符号日志中,我打印了当前的任务 ID 和存储的总记录。
我注意到一个非常奇怪的问题,一段时间后,存储的总记录数变为 0(无)。我的标点符号将记录任务的预期存储记录数,然后突然存储记录数变为 0。更奇怪的是,经过一段时间后,记录数要么恢复到预期,要么是一个完全不同的计数,仍然低于我的预期。
这种行为告诉我,由于某种原因,我的 Streams 应用程序不规律地失去(有时又恢复)状态。我强烈怀疑在重新平衡后状态正在丢失。 Kafka INFO 日志显示任务的重新平衡发生在标点符号运行之间,其中预期计数减少到 0。以下是我的标点符号代码:
accountTransactionStore.all().forEachRemaining(storeKeyValueRecord -> {
totalStoredRecordsCounter.getAndIncrement();
MonetaryTransactionsVO storedRecord = storeKeyValueRecord.value;
List<MonetaryTransaction> accountTransactionsList = storedRecord.getAccountTransactionsList();
ListIterator<MonetaryTransaction> transactionIterator = accountTransactionsList.listIterator();
while(transactionIterator.hasNext()) {
totalTransactionsStoredCounter.getAndIncrement();
}
});
log.info("Total Records is {}. Total individual transactions is {}", totalStoredRecordsCounter.get(), totalTransactionsStoredCounter.get());
我还确定记录在存储后不会被明确删除。 (即我的代码没有使用 store.delete 删除它们) 我的 Kafka Streams 版本如下:
compile 'org.apache.kafka:kafka-streams:2.1.1-cp1'
感谢任何帮助!