Ответ вслух Middle System design на фронте спрашивают часто обновлено

Чат в реальном времени

Вопрос

Спроектируй чат: список диалогов, переписка, статусы доставки.

Веди разговор вслух, как на секции. Начинать с решения - главная ошибка: первые полторы минуты только вопросы.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Транспорт выбираем вслух: WebSocket - двусторонний, нужен для набора текста и статусов; SSE проще и переживает прокси, но односторонний; long-polling - запасной путь. Главное, что здесь проверяют, - ненадёжная сеть.

Что должно прозвучать в ответе

  • уточнил число участников, историю, нужны ли группы и вложения

  • выбрал транспорт и обосновал: WebSocket против SSE и long-polling

  • переподключение с экспоненциальной задержкой и догрузка пропущенного

  • оптимистичная отправка: сообщение появляется сразу со статусом «отправляется»

  • идемпотентность: клиентский идентификатор сообщения против дублей при повторе

  • порядок сообщений восстанавливается по серверной метке, а не по приходу

  • история - курсорная пагинация вверх с сохранением позиции прокрутки

  • непрочитанные, несколько вкладок и синхронизация между ними

Что могут спросить следом

  • Что делать с сообщениями, отправленными офлайн?
  • Как показать «печатает» и не залить сервер событиями?
  • Чем SSE лучше вебсокета в этой задаче?

Разбор

Транспорт выбираем вслух: WebSocket - двусторонний, нужен для набора текста и статусов; SSE проще и переживает прокси, но односторонний; long-polling - запасной путь.

Главное, что здесь проверяют, - ненадёжная сеть. Соединение рвётся, значит нужны переподключение с растущей задержкой и догрузка того, что пропустили, по метке последнего полученного сообщения.

Оптимистичная отправка обязательна: сообщение появляется мгновенно со статусом «отправляется», потом становится «доставлено» или «не отправлено» с кнопкой повтора. Чтобы повтор не создал дубль, клиент генерирует идентификатор сообщения сам - это ключ идемпотентности.

Порядок - по серверной метке времени, а не по порядку прихода: иначе при переподключении сообщения перемешаются.

Прокрутка вверх за историей - курсором, с удержанием позиции: иначе список дёргается. И несколько вкладок: непрочитанные должны сходиться, для этого BroadcastChannel или общий service worker.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.