Подписки Graphql в распределенной системе с Kafka (и весенней загрузкой) - PullRequest
0 голосов
/ 05 марта 2019

У меня следующая ситуация:

  • У меня есть 5 экземпляров одной и той же службы, все в одной группе потребителей kafka.Один из них имеет подключение к клиенту через веб-сокет (подписка на GraphQL).Я использую graphql-java и Spring Boot.
  • Когда это соединение открыто, я генерирую события из любого из 5 экземпляров (с определенным ключом сообщения, так что они идут в тот же раздел изаказал) и мне нужно, чтобы все эти события использовались тем же экземпляром, который открыл это соединение.Не другими 4.
  • Даже если назначение раздела играет в мою пользу, переназначение может быть выполнено в любое время, оставив меня без удачи

Моя реализация использует реактор-кафка , но я думаю, что это просто деталь реализации.

Варианты, которые я вижу:

  • Начните слушать эту тему скаждый раз новый идентификатор группы, чтобы служба всегда получала сообщения из этой темы (но и 5 в идентификаторе другой группы)
  • Создайте новую тему для каждого соединения через веб-сокет, так что только производитель знает эту тему(но идентификатор темы должен быть отправлен в событиях kafka, чтобы производители этих событий знали, где их опубликовать)
  • Если я получаю сообщение, и я не тот, у кого есть соединение, неПодтвердите это.Но это замедлит процесс и покажется хакерским
  • Начните использовать что-то совсем другое, например Redis PubSub, чтобы получать все сообщения от всех потребителей и проверять соединение.

Я вижу, что есть реализация для узла , но я не вижу, как это решает проблему. аналогичный вопрос объясняет, как программировать подписку, но не говорит об этой распределенной вещи.

Является ли самый чистый подход любым из предложенных мной?Есть ли подход с Кафкой, которого я не вижу?Или я что-то недопонимаю?

1 Ответ

0 голосов
/ 29 марта 2019

В итоге я использовал 1 идентификатор группы потребителей на слушателя с темой, специально для этих событий.

...