带有 Kafka(和 Spring Boot)的分布式系统中的 Graphql 订阅

Posted

技术标签:

【中文标题】带有 Kafka(和 Spring Boot)的分布式系统中的 Graphql 订阅【英文标题】:Graphql subscriptions in a distributed system with Kafka (and spring boot) 【发布时间】: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 解释了如何对订阅进行编程,但没有谈论这个分布式的东西。

是我建议的最干净的方法吗?卡夫卡有没有我没有看到的方法?还是我误会了某个片段?

【问题讨论】:

【参考方案1】:

我最终为每个侦听器使用了 1 个消费者组 ID,并带有一个专门针对这些事件的主题。

【讨论】:

以上是关于带有 Kafka(和 Spring Boot)的分布式系统中的 Graphql 订阅的主要内容,如果未能解决你的问题,请参考以下文章

带有 Kafka(和 Spring Boot)的分布式系统中的 Graphql 订阅

Spring Boot、Spring-Kafka 和 Spring-Cloud 兼容性

Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

spring-boot 集合mybatis 的分页查询

Kafka 入门和 Spring Boot 集成

解决 spring boot 访问 docker kafka 失败