Apache kafka Kafka Streams持久存储错误:状态存储可能已迁移到另一个实例
我正在使用带有Spring Boot的Kafka Streams。在我的用例中,当我从其他微服务接收到客户事件时,我需要将其存储在客户物化视图中,当我接收到订单事件时,我需要加入客户和订单,然后将其存储在客户订单物化视图中。为了实现这一点,我创建了持久性键值存储客户存储和Apache kafka Kafka Streams持久存储错误:状态存储可能已迁移到另一个实例,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在使用带有Spring Boot的Kafka Streams。在我的用例中,当我从其他微服务接收到客户事件时,我需要将其存储在客户物化视图中,当我接收到订单事件时,我需要加入客户和订单,然后将其存储在客户订单物化视图中。为了实现这一点,我创建了持久性键值存储客户存储和 状态存储通常需要一些时间来准备。最简单的方法如下所示。(官方文件中的代码) public static T waitUntilStoreIsQueryable(最终字符串storeName, 最终QueryableStoreT
状态存储通常需要一些时间来准备。最简单的方法如下所示。(官方文件中的代码)
public static T waitUntilStoreIsQueryable(最终字符串storeName,
最终QueryableStoreType QueryableStoreType,
最终KafkaStreams(流)抛出InterruptedException{
while(true){
试一试{
return streams.store(storeName,queryableStoreType);
}捕获(已忽略InvalidStateStoreException){
//存储尚未准备好进行查询
睡眠(100);
}
}
}
您可以在文档中找到其他信息。
状态存储通常需要一些时间来准备。最简单的方法如下所示。(官方文件中的代码)
public static T waitUntilStoreIsQueryable(最终字符串storeName,
最终QueryableStoreType QueryableStoreType,
最终KafkaStreams(流)抛出InterruptedException{
while(true){
试一试{
return streams.store(storeName,queryableStoreType);
}捕获(已忽略InvalidStateStoreException){
//存储尚未准备好进行查询
睡眠(100);
}
}
}
您可以在文档中找到其他信息。
为什么不使用
join()
操作符?我从leftJoin开始,忘了用join()替换。我将把它改为join。为什么不使用join()
操作符呢?我从leftJoin开始,忘了替换为join()
。我会将其更改为join。我试图使用您的代码,但出现以下异常java.lang.IllegalStateException:KafkaStreams未运行。状态为错误。调用streams.start()后是否调用了上述方法?是。请看第140行的测试类,我关闭了IDE并打开了它。现在,我看到我的代码永远停留在waitUntilStoreIsQueryable()
方法上。我觉得这可能是在confluenct 4.0+、kafka 1.10中引入的,因为我看到了类似的问题,但只适用于订阅多个连接主题的流。它永远找不到这些类型的流的存储;其他溪流也不错。如果我擦除日志、存储、偏移和重新启动,工作正常。虽然我试图使用您的代码,但这不是一个解决方案,但我得到了以下异常java.lang.IllegalStateException:KafkaStreams未运行。状态为错误。调用streams.start()后是否调用了上述方法?是。请看第140行的测试类,我关闭了IDE并打开了它。现在,我看到我的代码永远停留在waitUntilStoreIsQueryable()
方法上。我觉得这可能是在confluenct 4.0+、kafka 1.10中引入的,因为我看到了类似的问题,但只适用于订阅多个连接主题的流。它永远找不到这些类型的流的存储;其他溪流也不错。如果我擦除日志、存储、偏移和重新启动,工作正常。但这不是一个解决方案
StoreBuilder customerStateStore = Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore("customer"),Serdes.String(), customerSerde).withLoggingEnabled(new HashMap<>());
streamsBuilder.addStateStore(customerStateStore);
KTable<String,Customer> customerKTable=streamsBuilder.table("customer",Consumed.with(Serdes.String(),customerSerde));
customerKTable.foreach(((key, value) -> System.out.println("Customer from Topic: "+value)));
streams.start();
ReadOnlyKeyValueStore<String, Customer> customerStore = streams.store("customer", QueryableStoreTypes.keyValueStore());
System.out.println("customerStore.approximateNumEntries()-> " + customerStore.approximateNumEntries());
org.apache.kafka.streams.errors.InvalidStateStoreException: the state store, customer, may have migrated to another instance.
at org.apache.kafka.streams.state.internals.QueryableStoreProvider.getStore(QueryableStoreProvider.java:60)
at org.apache.kafka.streams.KafkaStreams.store(KafkaStreams.java:1043)
at com.kafkastream.service.EventsListener.main(EventsListener.java:94)
public static <T> T waitUntilStoreIsQueryable(final String storeName,
final QueryableStoreType<T> queryableStoreType,
final KafkaStreams streams) throws InterruptedException {
while (true) {
try {
return streams.store(storeName, queryableStoreType);
} catch (InvalidStateStoreException ignored) {
// store not yet ready for querying
Thread.sleep(100);
}
}
}