Лично я избегаю использования websockets
в качестве двусторонней связи между client
и server
.
Я пытаюсь использовать сокеты для broadcast data from server to users or a single user(socket)
, чтобы они могли получать обновления в режиме реального времени,но для почтовых запросов от клиента к серверу я склонен использовать axios или что-то подобное, потому что я не хочу передавать конфиденциальные данные (например, ключи доступа и т. д.) от client
до server
.
Myпоток данных выглядит примерно так:
- Пользователь отправляет данные на сервер, используя
axios
, SSE
или любой другой - Сервер Backend делает то, что должен, и уведомляет сокет о том, что событие имеетoccured
- Затем сокет-сервер уведомляет, кому он должен
Моя проблема с использованием сокетов для отправки данных с клиента на сервер - проблема аутентификации. Технически, вы не можете передавать что-либо , которое недоступно для клиентского javascript через сокет, что означает, что для аутентификации действия вам придется отправлять конфиденциальную информацию через веб-сокет. Это проблема по нескольким причинам - если ваши конфиденциальные данные могут быть доступны с помощью js на стороне клиента, здесь может быть предпринято множество атак. Также кто-то может слушать общение между ws и клиентом. Вот почему я использую вызовы API (axios и т. Д.) И храню конфиденциальные данные в файлах cookie только для http.
Поэтому, когда сервер хочет уведомить пользователя о том, что что-то произошло, вы можете легко сделать это, сообщив серверу websocketчтобы отправить данные пользователю.
Вы также хотите, чтобы ваш сервер API оставался без состояния, то есть в вашем API нет сокетов. Я использую отдельный сервер только для соединений через веб-сокеты, и мой сервер API и сервер веб-сокетов взаимодействуют с помощью redis. Pub / sub - это действительно полезная функция для внутренней коммуникации с сервером и управления состоянием.
И чтобы ответить на ваш вопрос о нескольких соединениях - вы можете использовать одно соединение между вашим сервером веб-сокетов и клиентом и передавать данные по каналам. Таким образом, один канал будет предназначен для канала уведомлений, другой канал может быть для канала новостей и т. Д.
Надеюсь, это имеет смысл для вас. Этот стек сработал очень хорошо для меня.