Реализация идемпотентности 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 | Используется | Используется | ✅ Совпадает |
Инструкция по проверке¶
- Запустить Rust-сервис:
cargo run. - Подключиться к
/rust/v1/ws/chats/...с валидным JWT. - Подключиться к
/rust/v1/ws/realtime?channel=testи опубликовать сообщение в Redis каналtest.
Зависимости¶
- Добавлен крейт
redisдля работы с PubSub. - Используется
jsonwebtokenдля валидации токенов.