3.3 KiB
3.3 KiB
TODO: Звонки и межсерверность
Текущее ограничение
- Текущая реализация звонков фактически работает в одном сигнальном контуре (один сервер/единый кластер, где обе стороны уже присутствуют).
- Если пользователь A подключён к серверу A, а пользователь B к серверу B (и между ними нет общего сигнального слоя),
CallInviteBroadcast/CallSignalToSessionне смогут полноценно провести звонок между ними.
Почему так сейчас
- Сигналинг звонка привязан к активным сессиям и событиям на конкретном сервере.
- Выбор целевой сессии (
sessionId) и обменOFFER/ANSWER/ICEпроисходит в рамках текущего сигнального контура. - Push решает только «разбудить/уведомить», но не заменяет межсерверный сигнальный канал.
Что можно сделать дальше
- Добавить временное межсерверное подключение именно для старта и ведения звонка:
- инициатор получает short-lived access на сервер callee (или через доверенный межсерверный gateway),
- в рамках короткой сессии отправляет invite/signal для конкретного
callId, - после завершения звонка временная сессия закрывается автоматически.
Что нужно доработать для этого
- Межсерверная доверенная модель:
- подпись/верификация межсерверных вызовов,
- allowlist доверенных серверов и ротация ключей.
- Короткоживущая «call-only» авторизация:
- отдельный тип токена/сессии с TTL (например 1–3 минуты),
- минимальные права только на
CallInviteBroadcast/CallSignalToSession.
- Маршрутизация сессий пользователя между серверами:
- где находится активная сессия callee,
- как доставлять
stop_callи terminal-сигналы на все устройства callee.
- Идемпотентность и дедупликация:
- защита от повторов межсерверных сигналов по
callId + eventId, - корректная обработка out-of-order событий.
- Наблюдаемость:
- метрики межсерверной доставки сигналов,
- диагностика по стадиям звонка и причинам срыва.
Временный рабочий подход (до межсерверности)
- Держать звонки в одном сигнальном контуре.
- Использовать WebPush как fallback-уведомление (
incoming_call/stop_call) для офлайн-сессий.