升级到1.1.0后出现kafka错误:“状态存储...可能已迁移到另一个实例”

时间:2018-04-25 22:14:53

标签: java apache-kafka kafka-consumer-api apache-kafka-streams kafka-producer-api

我最近从kafka 0.10.1升级到了1.1.0。

我的流应用程序通过使用汇合连接订阅我们数据库中的更改来生成流,进行一些计算,然后发布自己的流/主题。

启动应用程序时,我会尝试获取应用程序发布的每个流存储。此代码只是尝试在try / catch循环中使用KafkaStreams.store方法获取存储(我尝试300次以提供流时间,以防它重新平衡或真正迁移)。这一切都适用于kafka 0.10.2

升级到kafka 1.1.0后,应用程序首次启动正常。 但是,如果我尝试重新启动应用程序,如果流消耗来自connect的多个主题,则此类流总是抛出InvalidStateStoreException。订阅单个连接主题的流不会发生这种情况。 要修复,我必须删除日志和存储,然后重新启动我的流应用程序,它工作正常。但我总是不得不擦掉日志,并在每次重新启动时存储。

我调试了一下源,发现问题是org.apache.kafka.streams.state.internals.StreamThreadStateStoreProvider中的这个调用

    public <T> List<T> stores(final String storeName, final QueryableStoreType<T> queryableStoreType) {
    if (streamThread.state() == StreamThread.State.DEAD) {
        return Collections.emptyList();
    }
    if (!streamThread.isRunningAndNotRebalancing()) {
        throw new InvalidStateStoreException("the state store, " + storeName + ", may have migrated to another instance.");
    }
    final List<T> stores = new ArrayList<>();
    for (Task streamTask : streamThread.tasks().values()) {
        final StateStore store = streamTask.getStore(storeName);
        if (store != null && queryableStoreType.accepts(store)) {
            if (!store.isOpen()) {
                throw new InvalidStateStoreException("the state store, " + storeName + ", may have migrated to another instance.");
            }
            stores.add((T) store);
        }
    }
    return stores;
}

对于使用多个连接主题并生成单个流/主题的流,当我重新启动应用程序时,上面的代码找不到它应该发布的主题的商店(即使它必须存在给定应用程序清除日志和存储后,我第一次启动它时启动并正常工作(我现在手动删除这些文件夹))。 然而更奇怪的是,尽管它没有找到商店,它仍然接收连接产生的主题并且产生计算的流显然很好。

任何人对升级后可能发生的事情都有任何想法吗?

0 个答案:

没有答案