我有以下情况:
- 我有 5 个相同服务的实例,都在同一个 kafka 消费者组中。其中一个与客户端(graphql 订阅)有一个 websocket 连接。我使用graphql-java和 Spring Boot。
- 打开该连接时,我会从 5 个实例中的任何一个实例中生成事件(定义了消息键,以便它们进入同一个分区并排序),并且我需要所有这些事件都由打开该连接的同一个实例使用。不是其他4个。
- 即使分区分配对我有利,也可以随时进行重新分配,让我没有运气
我的实现是使用reactor-kafka,但我认为这只是一个实现细节。
我看到的选项是:
- 每次使用新的组 id 开始侦听该主题,以便服务始终接收来自该主题的消息(但另一个组 id 中的 5 也是)
- 为每个 websocket 连接创建一个新主题,因此只有生产者知道该主题(但主题 id 应该在 kafka 事件中发送,以便这些事件的生产者知道在哪里发布它们)
- 如果我收到消息但我不是连接的人,请不要确认它。但这会使事情变得缓慢并且看起来很老套
- 开始使用完全不同的东西,比如 Redis PubSub 来接收所有消费者的所有消息并检查连接。
我看到有一个node 的实现,但我不知道它是如何解决问题的。一个类似的问题解释了如何对订阅进行编程,但没有谈论这个分布式的东西。
最干净的方法是我建议的方法吗?卡夫卡有没有我没有看到的方法?还是我误解了一些东西?