Веб-сокеты в архитектуре микросервисов

Допустим, у нас есть служба уведомлений, которая считывает событие из очереди сообщений и уведомляет всех веб-клиентов в режиме реального времени. Я знаю, как работает веб-сокет, но я озадачен, когда между ними есть шлюз API, а затем то, как поддерживается соединение веб-сокета между клиентом, шлюзом API и службой уведомлений.

Пожалуйста помоги! Спасибо

Изменить: Архитектура: введите здесь описание изображения


person Vipul Goyal    schedule 29.11.2017    source источник
comment
Как я полагаю, вы знаете, что входящее соединение webSocket из браузера должно подключаться к серверу webSocket. Итак, если вы хотите отправить сообщение одному или нескольким клиентам, подключенным через сервер webSocket, вам нужно попросить сервер webSocket сделать это от вашего имени. Если ваша служба уведомлений является какой-то другой микрослужбой, то она должна знать, как отправить серверу webSocket сообщение, которое заставит его отправить нужное вам уведомление.   -  person jfriend00    schedule 29.11.2017
comment
Вы разбрасываетесь термином API-шлюз, как будто это стандартный термин, и мы бы точно знали, что это такое. Это не так, и у нас нет. Если вам нужна дополнительная помощь, вам нужно будет более подробно описать, как работает ваша архитектура, какие процессы у вас есть, как запросы проходят через различные процессы, где подключены веб-сокеты и т. д.   -  person jfriend00    schedule 29.11.2017
comment
Спасибо за ваш ответ. Но я имею в виду шлюз API в контексте микросервисной архитектуры. microservices.io/patterns/apigateway.html   -  person Vipul Goyal    schedule 29.11.2017
comment
Я довольно сомневаюсь, что люди могут помочь вам, когда вы просто ссылаетесь на такие общие термины, не показывая ВАШУ конкретную архитектуру. Ваша служба уведомлений должна связаться с любым процессом, поддерживающим соединения webSocket. Как вы это сделаете, полностью зависит от вашей конкретной архитектуры.   -  person jfriend00    schedule 29.11.2017
comment
Я отредактировал вопрос с очень простой архитектурой. Надеюсь, поможет   -  person Vipul Goyal    schedule 29.11.2017


Ответы (3)


Веб-сокеты

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

Шлюз API

Задача шлюза API состоит в том, чтобы принять входящее соединение через веб-сокет от клиента и правильно направить его на сервер веб-сокета. Шлюз API будет перенаправлять ВСЕ данные, отправленные с клиентского веб-сокета, на правильную серверную службу и будет поддерживать соединение все время.

Как все работает вместе...

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

  • Клиент ‹=> Шлюз API ‹=> Служба уведомлений

Берем дальше...

Если у вас есть дополнительные требования клиентов по преобразованию данных, поступающих из службы уведомлений, вы можете:

  1. Вставьте эту бизнес-логику в службу уведомлений (не рекомендуется).
  2. Or, add another service with the transformation logic between the API gateway and the Notification Service which is called the Backends for Frontends microservice design pattern (recommended):
    • Client <=> API Gateway <=> Notification Server (transformation logic) <=> Notification Service.
  3. Или, если выбранный вами шлюз API предназначен для хранения бизнес-логики и преобразования данных; поместите логику преобразования непосредственно в шлюз API.
person alextaujenis    schedule 27.01.2019
comment
Что делать, если Api Gateway не поддерживает маршрутизацию веб-сокетов? например Нетфликс Зуул - person Johnny Willer; 02.01.2020
comment
Похоже, что Netflix Zuul 2 поддерживает веб-сокеты, но я не уверен, что это полноценный прокси. Если ваш шлюз API не поддерживает веб-сокеты, вы можете добавить в свою инфраструктуру еще один сервер, который поддерживает (например, Nginx). Однако это резко повысит сложность. Я бы рекомендовал попробовать выяснить собственные функции вашего шлюза API для сообщений в реальном времени или выбрать другой шлюз API с поддержкой необходимых вам функций. - person alextaujenis; 17.02.2020
comment
Как это работает для многих микросервисов? Скажем, клиенту необходимо получать обновления, которые обрабатываются внутри 5 различными службами. Значит ли это, что теперь клиент должен держать 5 подключений через веб-сокет открытыми к шлюзу API? Одно подключение на микросервис? - person Douglas Gaskell; 07.03.2021
comment
Если клиенту необходимо получать обновления от множества различных (внутренних) микросервисов, то как это реализовать, зависит только от вас. Вы можете разрешить клиенту открывать несколько соединений через веб-сокеты или комбинировать веб-сокеты (с другим внутренним микросервисом), чтобы клиент открывал только одно соединение. Вам лично необходимо взвесить все возможные компромиссы, связанные с принятием этих инфраструктурных решений, иначе будет сложно или невозможно двигаться вперед после определенного момента в разработке. Если вы не можете обдумать эти решения, просто выберите одно и посмотрите, что из этого получится. - person alextaujenis; 09.03.2021

Не следует смешивать понятия. Шлюз API скрывает вашу инфраструктуру от вашего клиента. Это может быть единый интерфейс для многих сервисов в смысле «Бэкэнды для интерфейсов». Он также может отвечать за многие другие вещи, такие как аутентификация.

Сервер веб-сокетов может располагаться параллельно вашему шлюзу API. Другой домен или другой порт. Допустим, вы используете сервер веб-сокетов, например http://nchan.io. События из вашего приложения проходят через вашего брокера сообщений или любой другой шаблон интеграции обмена сообщениями, который вы используете. Потребитель может получить эти события и опубликовать их через сервер Nchan. Клиенты (например, браузеры) подключаются к серверу Nchan и будут проинформированы о событиях.

person marein    schedule 30.11.2017
comment
Меня смущает то, что уведомление клиентов будет происходить через шлюз API или напрямую клиентам. Насколько я понимаю, первоначально соединение будет устанавливаться через API-шлюз, а затем вся связь будет происходить напрямую между сервером уведомлений и клиентами. - person Vipul Goyal; 01.12.2017
comment
Клиенты проходят через ваш API-шлюз, если хотят запросить ваши услуги за ним. Клиенты могут напрямую общаться с вашим сервером веб-сокетов. Изначально нет необходимости вызывать шлюз API. Должен ли пользователь аутентифицироваться перед тем, как обратиться к серверу веб-сокетов? Нам может понадобиться дополнительная информация о вашей текущей настройке и о том, что вы пробовали. - person marein; 02.12.2017
comment
Итак, для приложения, скажем, игры, где вы почти исключительно общаетесь через веб-сокеты, сервер веб-сокетов, по сути, берет на себя роль шлюза API? Поскольку у вас все еще есть микросервисы, с которыми должен взаимодействовать сервер веб-сокетов. - person Douglas Gaskell; 07.03.2021

Столкнувшись с этим вопросом более 2 лет спустя, я сомневаюсь, что ОП все еще работает над этой проблемой, но для себя и будущих посетителей я бы порекомендовал вот что:

Шлюз API — это основная точка входа для одного или нескольких клиентов в систему (можно использовать несколько шлюзов, если используется шаблон «бэкенды для интерфейсов»). Клиент/сервер WebSocket подходит для одного или нескольких таких клиентов, но стоит отдельно от шлюза API. Каждый клиент будет поддерживать отдельное соединение с сервером WebSocket. В вашем приложении и его службах всякий раз, когда событие публикуется в вашем брокере сообщений, сервер WebSocket будет подписываться на все события, требующие уведомления, и будет передавать эти сообщения обратно каждому подключенному клиенту. Либо сервер WebSocket должен определить, какие клиенты должны получать данное уведомление, либо клиент WebSocket должен определить, должен ли он обрабатывать данное уведомление или игнорировать его (или и то, и другое, в зависимости от того, где живет логика).

person Jason Miesionczek    schedule 12.01.2020