Kotlin Kafka主题/状态存储分区全部分配给一个应用程序实例

Kotlin Kafka主题/状态存储分区全部分配给一个应用程序实例,kotlin,apache-kafka,apache-kafka-streams,spring-kafka,Kotlin,Apache Kafka,Apache Kafka Streams,Spring Kafka,我正在尝试运行一个连接到Kafka的多实例应用程序。我的kafka设置有一个包含2个分区的主题,还有一个包含2个分区的状态存储,其中kafka从输入主题中读取数据,处理部分数据并将其发送到状态存储 当我运行应用程序的一个实例时,它会被分配给所有对象,这很好。但是,当我运行应用程序的第二个实例时,输入主题的所有分区都被发送到一个应用程序,状态存储的所有分区都被发送到另一个应用程序。我的应用程序有一个GET“/users”端点,用于查询状态存储中的条目(请参见UserRepository.kt中的g

我正在尝试运行一个连接到Kafka的多实例应用程序。我的kafka设置有一个包含2个分区的主题,还有一个包含2个分区的状态存储,其中kafka从输入主题中读取数据,处理部分数据并将其发送到状态存储

当我运行应用程序的一个实例时,它会被分配给所有对象,这很好。但是,当我运行应用程序的第二个实例时,输入主题的所有分区都被发送到一个应用程序,状态存储的所有分区都被发送到另一个应用程序。我的应用程序有一个GET“/users”端点,用于查询状态存储中的条目(请参见UserRepository.kt中的
getUsers
)。首先,它将为所有用户查询自己的本地存储,然后它将代理一个请求到另一个正在运行的应用程序,以查询其存储中的更多用户。此时,如果您向应用程序发送未分配任何状态存储查询的查询,应用程序将中断,出现类似于的
InvalidStateStoreException
。我试图用所描述的try/catch块来防御性地编写代码,认为状态存储尚未准备就绪,但它永远不会恢复

我读过其他一些帖子(比如,或者),但发现它们要么与我的情况不完全相关,要么似乎无法解决我的问题

有人知道为什么分区分配会以这种方式发生,以及如何绕过它吗?从我阅读的中篇文章中,我假设它们会在输入主题/状态存储之间平均分配

可以找到我的代码以供参考。复制的最佳方法是:

  • 运行
    docker compose up
    从主项目文件夹启动kafka
  • 在不同端口上运行2个应用程序实例(目前我已将Intellij设置为在端口8080和8087上运行)
  • http://localhost:/users
    (当它们在不想工作的设备之间切换时,替换8080/8087)

希望就这些。提前感谢您查看。

我应该添加代码在“最终”分支上,而不是主分支上