具有不同@StreamListener的两个实例之间的嵌入式Kafka迁移状态存储

时间:2018-09-08 00:06:50

标签: apache-kafka spring-cloud apache-kafka-streams spring-kafka embedded-kafka

我有一个SpringBoot应用程序,其中有两个通过Spring Cloud映射的流处理器。每个处理器都有自己的@StreamListener来处理不同的主题。一个处理器将聚合数据写入可隔离状态存储。通过@Service获取数据时,我在单元测试中遇到了问题(服务从状态存储中获取聚合数据)。由于某些原因,有时会捕获异常:

org.apache.kafka.streams.errors.InvalidStateStoreException: the state store, recently-played-store, 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 org.springframework.cloud.stream.binder.kafka.streams.QueryableStoreRegistry.getQueryableStoreType(QueryableStoreRegistry.java:47)

当我从另一个处理器中删除StreamListener时,一切正常且稳定。

如何使用适当的处理器为精确实例绑定状态存储?

1 个答案:

答案 0 :(得分:0)

我已经找到解决问题的方法,也许会对其他人有所帮助。 我没有使用spring-cloud-stream-binder-kafka-streams的最新版本。我的版本是2.0.0,它有一个错误https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/issues/366。仅在版本2.0.1中已修复