Подписка на Graphql с многопоточным сервером nodeJS

Я пытаюсь создать службу подписки graphql в многопоточной архитектуре.

Если я, например, создаю подписку, как показано ниже

const SOMETHING_CHANGED_TOPIC = 'something_changed';

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
    },
  },
}

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

Единственный способ, которым я могу думать об этом прямо сейчас, - это создать изолированный сервер, который отвечает за событие подписки и получает событие подписки только от одного источника в качестве клиента. Но та же проблема многопоточности, о которой я упоминал выше, возникает, если я распределяю нагрузку на серверы, ответственные за подписку.

Как мне убедиться, что я отправляю клиенту только одно событие подписки, когда есть многопоточный бэкэнд nodeJS? Возможно ли это только с фильтрацией на стороне клиента? т.е. игнорировать события, которые уже произошли - однако я думаю, что это ужасная трата ресурсов по мере роста подписки.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае я бы использовал Redis как PubSub, чтобы у вас был «один источник истины». то есть https://github.com/tomyitav/redis-messaging-manager.

Я уверен, что есть много других библиотек, которые делают что-то подобное.

Я мог бы использовать redis, но подписка на redis pubsub тоже была бы поточной, не так ли? Скажем, если экземпляр сервера nodeJS публикует событие, все остальные серверы nodeJS, которые подписались на него, будут подписаны на публикацию события, и они будут одновременно пытаться передать событие клиенту.

forJ 22.08.2018 08:32

Ах, я неправильно понял. Но в таком случае разве только один экземпляр серверов nodeJS не будет активно «слушать» клиента? Он не будет «подписан» на каждый сервер узла, только на один экземпляр флота, верно? Так разве это не проблема?

Jacob Turley 22.08.2018 23:13

ой. хм, если подумать, ты прав. Это вообще не проблема. Спасибо!

forJ 23.08.2018 03:19

Другие вопросы по теме