Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.
Проектирование чат‑приложения
Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать архитектуру чат‑приложения, которое должно обеспечивать:
- отображение списка контактов пользователя;
- отправку и получение текстовых сообщений от выбранного контакта;
- генерацию уведомлений при поступлении новых сообщений;
- возможность просматривать последние сообщения, когда пользователь находится в офлайн‑режиме;
- передачу изображений между пользователями;
- оставление сообщений для контактов, которые сейчас недоступны (offline‑сообщения).
Ответ
Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.
Контакты и историю отдаёт HTTP API, сообщения сохраняются с conversation_id, автором, последовательным номером и клиентским idempotency key. WebSocket сообщает о новых событиях; после переподключения клиент дочитывает пропущенное по cursor и удаляет дубли.
Изображения загружаются в закрытое объектное хранилище, проверяются и связываются с сообщением. Недоступному получателю сообщение остаётся в БД; push — лишь уведомление. Последние диалоги и очередь исходящих хранятся локально, с очисткой при выходе и учётом чувствительности данных. Порядок, подтверждения доставки/прочтения и повторная отправка должны иметь явные серверные контракты.