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