为什么 Kafka KeyValueStore 会在分区重新平衡时丢失状态?

时间:2021-03-31 17:12:45

标签: apache-kafka apache-kafka-streams confluent-platform

我有一个有状态的 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'

感谢任何帮助!

0 个答案:

没有答案
相关问题