Я пытаюсь создать службу подписки graphql в многопоточной архитектуре.
Если я, например, создаю подписку, как показано ниже
const SOMETHING_CHANGED_TOPIC = 'something_changed';
export const resolvers = {
Subscription: {
somethingChanged: {
subscribe: () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
},
},
}
и у меня есть несколько экземпляров идентичного сервера nodeJS, запущенного на моем кластере докеров, я не хочу, чтобы каждый из экземпляров отправлял клиенту событие подписки каждый раз, когда была сделана публикация новой подписки. Я хочу, чтобы только один (конечно, предпочтительно с балансировкой нагрузки среди кластеров) отвечал за отправку подписки клиенту.
Единственный способ, которым я могу думать об этом прямо сейчас, - это создать изолированный сервер, который отвечает за событие подписки и получает событие подписки только от одного источника в качестве клиента. Но та же проблема многопоточности, о которой я упоминал выше, возникает, если я распределяю нагрузку на серверы, ответственные за подписку.
Как мне убедиться, что я отправляю клиенту только одно событие подписки, когда есть многопоточный бэкэнд nodeJS? Возможно ли это только с фильтрацией на стороне клиента? т.е. игнорировать события, которые уже произошли - однако я думаю, что это ужасная трата ресурсов по мере роста подписки.





В этом случае я бы использовал Redis как PubSub, чтобы у вас был «один источник истины». то есть https://github.com/tomyitav/redis-messaging-manager.
Я уверен, что есть много других библиотек, которые делают что-то подобное.
Ах, я неправильно понял. Но в таком случае разве только один экземпляр серверов nodeJS не будет активно «слушать» клиента? Он не будет «подписан» на каждый сервер узла, только на один экземпляр флота, верно? Так разве это не проблема?
ой. хм, если подумать, ты прав. Это вообще не проблема. Спасибо!
Я мог бы использовать redis, но подписка на redis pubsub тоже была бы поточной, не так ли? Скажем, если экземпляр сервера nodeJS публикует событие, все остальные серверы nodeJS, которые подписались на него, будут подписаны на публикацию события, и они будут одновременно пытаться передать событие клиенту.