А теперь посмотрим на саму доставку сообщения получателю.
WebSocket — это протокол, обеспечивающий постоянное двунаправленное соединение между клиентом и сервером. Это позволяет обеим сторонам отправлять данные в реальном времени без необходимости повторного устанавливать соединения.
Примеры использования:
- Чаты и мессенджеры.
- Реальное время обновления данных (например, финансовые тикеры).
- Игры.
В каждой из этих ситуаций важно бесперебойное обновление данных между системой и клиентом.
Преимущества:
- Немедленная доставка данных — передаются сразу после их генерации.
- Эффективность — нет накладных расходов на установку соединения при каждом запросе.
Недостатки:
- Сложность масштабирования — при большом количестве открытых соединений сервер должен эффективно их обрабатывать.
- Управление соединениями — требуется следить за состоянием соединений и их восстановлением при сбоях.
Важные моменты для поддержания стабильности системы и хорошего UX:
- Постоянное соединение. Если на какой-то стороне плохое соединение, то соединение будет разрываться и заново инициироваться.
- Scalability (масштабируемость). При большом количестве открытых соединений серверу сложно поддерживать нагрузку, особенно если клиенты активно отправляют данные — да, мы про это уже говорили, но обращу твое внимание еще раз (НАСТОЛЬКО это важно).
ЕЩЕ ВАЖНОЕ: Горизонтальное масштабирование WebSocket значительно сложнее, чем обычный REST запрос на какой-нибудь просмотр поста в ленте или сторис, так как при этом нужно понимать, на какой сервер направлять запросы. Смотрим на архитектуру ниже:
Так как мы делаем stateless backend (то есть приложение не хранит инфу), то для отправки сообщения нам не нужен web socket, а достаточно REST поверх HTTP. А вот для получения сообщения нам нужен веб-сокет.