Перейти к содержанию

Реализация идемпотентности WebSocket API в Rust

Дата: 2026-03-13 Автор: Trae AI Agent Статус: Выполнено

Описание

В рамках миграции на Rust реализована полная совместимость (идемпотентность) WebSocket-интерфейсов с существующим Python-сервисом. Это позволяет мобильным клиентам переключаться на Rust-бэкенд без изменения логики работы.

Реализованные компоненты

1. Модели сообщений (models/ws_messages.rs)

Определены структуры данных, полностью соответствующие JSON-контрактам FastAPI: - ChatMessageIn: Входящие сообщения чата (message, read, ping, heartbeat). - ChatMessageOut: Исходящие сообщения чата (message, read, presence). - RealtimeMessageOut: Сообщения Realtime-подсистемы (connected и payload из Redis).

2. Управление состоянием (db.rs)

  • Добавлен redis::Client в глобальное состояние AppState.
  • Реализована структура ChatRooms для управления активными сессиями чатов в памяти (аналог Rooms в Python).
  • Поддержка broadcasting (рассылки сообщений всем участникам комнаты).

3. Обработчики WebSocket (handlers/ws.rs)

Chat WebSocket (/chats/{session_id})

  • Авторизация: Извлекает JWT из заголовка Authorization: Bearer ....
  • Валидация: Проверяет подпись токена и извлекает user_id.
  • Логика:
  • Регистрирует пользователя в ChatRooms.
  • Обрабатывает входящие сообщения (текст, прочтение).
  • Рассылает сообщения другим участникам чата.
  • Поддерживает ping/pong.

Realtime WebSocket (/realtime)

  • Авторизация: Извлекает token из query-параметров (?token=...).
  • Логика:
  • Подключается к Redis PubSub.
  • Подписывается на каналы {channel} и {channel}:{room_key}.
  • Транслирует сообщения из Redis напрямую в WebSocket.
  • Отправляет приветственное сообщение connected.

Совместимость

Компонент Python (FastAPI) Rust (Actix) Статус
Путь Chat /ws/chats/{id} /rust/v1/ws/chats/{id} ✅ Совпадает (с префиксом)
Auth Chat Header Authorization Header Authorization ✅ Совпадает
Путь Realtime /ws/realtime /rust/v1/ws/realtime ✅ Совпадает (с префиксом)
Auth Realtime Query token Query token ✅ Совпадает
Redis PubSub Используется Используется ✅ Совпадает

Инструкция по проверке

  1. Запустить Rust-сервис: cargo run.
  2. Подключиться к /rust/v1/ws/chats/... с валидным JWT.
  3. Подключиться к /rust/v1/ws/realtime?channel=test и опубликовать сообщение в Redis канал test.

Зависимости

  • Добавлен крейт redis для работы с PubSub.
  • Используется jsonwebtoken для валидации токенов.