Проектирование чат‑приложения

Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.

Короткий ответ

Что ответить на собеседовании

Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.

Подробный разбор

Ответ с пояснениями

Условие

Разработать архитектуру чат‑приложения, которое должно обеспечивать:

  • отображение списка контактов пользователя;
  • отправку и получение текстовых сообщений от выбранного контакта;
  • генерацию уведомлений при поступлении новых сообщений;
  • возможность просматривать последние сообщения, когда пользователь находится в офлайн‑режиме;
  • передачу изображений между пользователями;
  • оставление сообщений для контактов, которые сейчас недоступны (offline‑сообщения).

Ответ

Разделите доставку сообщений, долговременное хранение и локальный офлайн-кэш. WebSocket доставляет события онлайн, но источником истины остаётся серверная история с проверкой доступа к диалогу.

Контакты и историю отдаёт HTTP API, сообщения сохраняются с conversation_id, автором, последовательным номером и клиентским idempotency key. WebSocket сообщает о новых событиях; после переподключения клиент дочитывает пропущенное по cursor и удаляет дубли.

Изображения загружаются в закрытое объектное хранилище, проверяются и связываются с сообщением. Недоступному получателю сообщение остаётся в БД; push — лишь уведомление. Последние диалоги и очередь исходящих хранятся локально, с очисткой при выходе и учётом чувствительности данных. Порядок, подтверждения доставки/прочтения и повторная отправка должны иметь явные серверные контракты.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее