Apache kafka 如果我使用persistentKeyValueStore,Kafka Streams将停止,但在inMemoryKeyValueStore(在Docker容器中运行)中运行良好

Apache kafka 如果我使用persistentKeyValueStore,Kafka Streams将停止,但在inMemoryKeyValueStore(在Docker容器中运行)中运行良好,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我显然是卡夫卡/卡夫卡流的初学者。我只需要阅读几个主题的给定消息,给定它们的id。虽然我们的实际拓扑结构相当复杂,但这个流应用程序只需要实现这个简单的目标 以下是创建存储的方式: final StreamsBuilder streamsBuilder = new StreamsBuilder(); streamsBuilder.table( topic, Materialized.<String, String>as( persistentKeyVal

我显然是卡夫卡/卡夫卡流的初学者。我只需要阅读几个主题的给定消息,给定它们的id。虽然我们的实际拓扑结构相当复杂,但这个流应用程序只需要实现这个简单的目标

以下是创建存储的方式:

final StreamsBuilder streamsBuilder = new StreamsBuilder();
streamsBuilder.table(
        topic,
        Materialized.<String, String>as( persistentKeyValueStore(storeNameOf(topic)))
                    .withKeySerde(Serdes.String()).withValueSerde(Serdes.String())
                    .withCachingDisabled());
//      Materialized.<String, String>as( inMemoryKeyValueStore(storeNameOf(topic)))
//                  .withKeySerde(Serdes.String()).withValueSerde(Serdes.String())
//                  .withCachingDisabled());
);
KafkaStreams kafkaStreams = new KafkaStreams(streamsBuilder.build(), new Properties() {{ /** config items go here**/ }})
kafkaStreams.start();
//logic for awaiting kafkaStreams to reach `RUNNING` state as well as InvalidStateStoreException handling (by retrying) is ommited for simplicity :   
ReadOnlyKeyValueStore<String, String> replyStore = kafkaStreams.store(storeNameOf(topicName), QueryableStoreTypes.keyValueStore());
final StreamsBuilder StreamsBuilder=新StreamsBuilder();
streamsBuilder.table(
话题,,
具体化的.as(persistentKeyValueStore(storeNameOf(topic)))
.withKeySerde(Serdes.String()).withValueSerde(Serdes.String())
.使用cachingdisabled());
//具体化的.as(inMemoryKeyValueStore(storeNameOf(主题)))
//.withKeySerde(Serdes.String()).withValueSerde(Serdes.String())
//.使用cachingdisabled());
);
KafkaStreams KafkaStreams=新的KafkaStreams(streamsBuilder.build(),new Properties(){{/**config items go here**/})
kafkaStreams.start();
//为简单起见,建议使用等待kafkaStreams达到“RUNNING”状态以及InvalidStateStoreException处理(通过重试)的逻辑:
ReadOnlyKeyValueStore replyStore=kafkaStreams.store(storeNameOf(topicName),QueryableStoreTypes.keyValueStore());
因此,当使用MemoryKeyValueStore中已注释的
时,将成功创建物化
replyStore
,我可以毫无问题地查询其中的值

使用
persistentKeyValueStore
时,最后一行失败,出现
java.lang.IllegalStateException:KafkaStreams未运行。状态为错误
。注意,在调用
store
之前,我确实检查KafkaStreams是否处于状态
RUNNING
;错误状态是在调用中以某种方式达到的

你认为我在建立持久存储时可能遗漏了什么吗?调试提示也会有很大帮助,我必须承认我被困在这里了 谢谢


编辑:在docker容器下执行。这是非常相关的,但正如Matthias J.Sax在评论表单中指出的那样,我建议添加initialy

,以调试未捕获的ExceptionHandler注册大大帮助了这个问题

实际问题是由于RocksDB和我正在使用的docker映像之间不兼容(因此从
openjdk:8-jdk-alpine
更改为
Anapix/alpine java:8

相关的:

能否添加日志消息以检查引发KafkaStreams异常之前/之后发生的事件?您可能需要检查日志和/或注册
KafkaStream#uncaughtExceptionHandler()
以了解Kafka流死亡的原因。您可能需要将自己的答案标记为已接受。