Когда использовать одно WebSocket-соединение для всех событий, а когда — несколько?

«Когда использовать одно WebSocket-соединение для всех событий, а когда — несколько?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Одно соединение — стандартный и рекомендуемый подход для большинства приложений. Несколько соединений — специализированное решение для изоляции трафика с разными требованиями.

Преимущества одного WebSocket-соединения:

  1. Эффективность: Меньше накладных расходов на установку соединения, TLS-рукопожатие и поддержку heartbeat.
  2. Управление: Проще контролировать жизненный цикл (подключение, переподключение, отключение).
  3. Производительность: Снижает потребление батареи и сетевых ресурсов.
  4. Гарантия порядка: События приходят в том же порядке, в котором были отправлены.
// Пример: одно соединение для всех событий
let socketTask = URLSession.shared.webSocketTask(with: url)
socketTask.resume()
// Отправка и приём всех типов сообщений через этот task

Когда оправдано несколько WebSocket-соединений:

  • Разные домены/источники: События приходят с разных серверов или эндпоинтов.
  • Разные требования QoS: Критичный чат (высокий приоритет, агрессивный реконнект) vs. фоновые нотификации (низкий приоритет).
  • Архитектурная изоляция: Разные модули приложения (например, онлайн-игра и чат) требуют независимого управления подключением.
  • Лимиты сервера: Сервер может ограничивать типы сообщений или частоту на уровне соединения.

Вывод: Начинайте с одного соединения. Добавляйте новые только при явной необходимости, чётко осознавая компромисс в виде возросшей сложности и нагрузки.