У меня есть реплики серверной части для обеспечения горизонтального масштабирования. Серверная часть имеет подписки apollo graphql. Также существует микросервис, предоставляющий уведомления для определенных подписок.
Поскольку я не сохраняю какое-либо состояние в бэкэнде, я попытался решить проблему с помощью реализации Redis PUB / SUB. Когда микросервис получает событие, он публикует sh в бэкэндах.
В резолвере подписок серверной части у меня есть
webhookCalled: {
subscribe: withFilter(
() => pubsubMyEvent.asyncIterator([MY_EVENT]),
(payload, _, context) => {
return context.dataValues.id == payload.userid;
}
)
}
В приведенном выше коде я пытаюсь отфильтровать подписки, которые полезная нагрузка не адресована. Я не уверен, насколько дорогая процедура withFilter
. Когда я получаю PUB от Redis, я звоню
pubsubMyEvent.publish(MY_EVENT, { myEventData });
Что мне здесь не нравится, так это то, что каждый ответ будет обрабатывать (publish(...)
) все события, даже если в конце только один бэкэнд действительно отправит сообщение о подписке для клиента graphql.
Вопрос: как я могу эффективно обрабатывать отправку событий клиентам подписки на graphql, имея масштабируемую внутреннюю часть? Возможно, чтобы не беспокоить все серверные копии, когда нужно уведомить об одном подключении к веб-сокету. Должен ли я отслеживать всех подключенных клиентов в Redis, чтобы Redis знал, где подключен каждый клиент подписки на graphql?
введите описание изображения здесь