使用 Kafka(和 spring 启动)的分布式系统中的 Graphql 订阅
Graphql subscriptions in a distributed system with Kafka (and spring boot)
我有以下情况:
- 我有 5 个相同服务的实例,都在同一个 kafka 消费者组中。其中之一具有到客户端的 websocket 连接(graphql 订阅)。我使用 graphql-java 和 Spring Boot.
- 打开该连接后,我从 5 个实例中的任何一个生成事件(定义了一个消息键,以便它们转到相同的分区并排序)并且我需要所有这些事件都由同一个实例使用打开那个连接。不是其他 4.
- 即使分区分配对我有利,也可以随时进行重新分配,让我走运
我的 implementation is using reactor-kafka 但我认为这只是一个实现细节。
我看到的选项是:
- 每次都使用新的组 ID 开始收听该主题,以便该服务始终接收来自该主题的消息(但另一个组 ID 中的 5 也一样)
- 为每个 websocket 连接创建一个新主题,因此只有生产者知道该主题(但是主题 id 应该在 kafka 事件中发送,以便这些事件的生产者知道在哪里发布它们)
- 如果我收到消息但我不是连接的人,请不要确认它。但这会使事情变慢并且看起来很hacky
- 开始使用完全不同的东西,例如 Redis PubSub 来接收所有消费者中的所有消息并检查连接。
我看到有一个 implementation for node 但我不知道它是如何解决问题的。
解释了如何编写订阅程序,但没有谈论这个分布式的东西。
我建议的方法是最干净的方法吗?有没有我没有看到的 Kafka 方法?还是我误会了什么?
我最终为每个侦听器使用了 1 个消费者组 ID,并为这些事件专门设置了一个主题。
我有以下情况:
- 我有 5 个相同服务的实例,都在同一个 kafka 消费者组中。其中之一具有到客户端的 websocket 连接(graphql 订阅)。我使用 graphql-java 和 Spring Boot.
- 打开该连接后,我从 5 个实例中的任何一个生成事件(定义了一个消息键,以便它们转到相同的分区并排序)并且我需要所有这些事件都由同一个实例使用打开那个连接。不是其他 4.
- 即使分区分配对我有利,也可以随时进行重新分配,让我走运
我的 implementation is using reactor-kafka 但我认为这只是一个实现细节。
我看到的选项是:
- 每次都使用新的组 ID 开始收听该主题,以便该服务始终接收来自该主题的消息(但另一个组 ID 中的 5 也一样)
- 为每个 websocket 连接创建一个新主题,因此只有生产者知道该主题(但是主题 id 应该在 kafka 事件中发送,以便这些事件的生产者知道在哪里发布它们)
- 如果我收到消息但我不是连接的人,请不要确认它。但这会使事情变慢并且看起来很hacky
- 开始使用完全不同的东西,例如 Redis PubSub 来接收所有消费者中的所有消息并检查连接。
我看到有一个 implementation for node 但我不知道它是如何解决问题的。
我建议的方法是最干净的方法吗?有没有我没有看到的 Kafka 方法?还是我误会了什么?
我最终为每个侦听器使用了 1 个消费者组 ID,并为这些事件专门设置了一个主题。