Разделите постоянное хранение истории, доставку событий и локальное состояние клиента. Используйте устойчивые ID сообщений, идемпотентную отправку и восстановление по серверному курсору.
Как спроектировать веб-мессенджер
Разделите постоянное хранение истории, доставку событий и локальное состояние клиента. Используйте устойчивые ID сообщений, идемпотентную отправку и восстановление по серверному курсору.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужен веб-мессенджер с личными чатами, историей, отправкой текста и статусом прочтения. Офлайн-пользователь должен увидеть пропущенные сообщения после подключения. Предложите архитектуру.
Ответ
Разделите постоянное хранение истории, доставку событий и локальное состояние клиента. Используйте устойчивые ID сообщений, идемпотентную отправку и восстановление по серверному курсору.
Сначала уточните число одновременных соединений, размер истории, допустимую задержку и правила хранения. HTTP API обслуживает историю и операции, WebSocket доставляет новые события. Backend проверяет участие в чате, сохраняет сообщение и публикует событие после commit. Клиент сверяет client_message_id, не дублирует оптимистичную запись и догружает пропуск после reconnect. Прочтение удобно хранить как последний прочитанный серверный номер в каждом чате.