Чат в реальном времени
Вопрос
Спроектируй чат: список диалогов, переписка, статусы доставки.
Веди разговор вслух, как на секции. Начинать с решения - главная ошибка: первые полторы минуты только вопросы.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
уточнил число участников, историю, нужны ли группы и вложения
выбрал транспорт и обосновал: WebSocket против SSE и long-polling
переподключение с экспоненциальной задержкой и догрузка пропущенного
оптимистичная отправка: сообщение появляется сразу со статусом «отправляется»
идемпотентность: клиентский идентификатор сообщения против дублей при повторе
порядок сообщений восстанавливается по серверной метке, а не по приходу
история - курсорная пагинация вверх с сохранением позиции прокрутки
непрочитанные, несколько вкладок и синхронизация между ними
Что могут спросить следом
- Что делать с сообщениями, отправленными офлайн?
- Как показать «печатает» и не залить сервер событиями?
- Чем SSE лучше вебсокета в этой задаче?
Разбор
Транспорт выбираем вслух: WebSocket - двусторонний, нужен для набора текста и статусов; SSE проще и переживает прокси, но односторонний; long-polling - запасной путь.
Главное, что здесь проверяют, - ненадёжная сеть. Соединение рвётся, значит нужны переподключение с растущей задержкой и догрузка того, что пропустили, по метке последнего полученного сообщения.
Оптимистичная отправка обязательна: сообщение появляется мгновенно со статусом «отправляется», потом становится «доставлено» или «не отправлено» с кнопкой повтора. Чтобы повтор не создал дубль, клиент генерирует идентификатор сообщения сам - это ключ идемпотентности.
Порядок - по серверной метке времени, а не по порядку прихода: иначе при переподключении сообщения перемешаются.
Прокрутка вверх за историей - курсором, с удержанием позиции: иначе список дёргается. И несколько вкладок: непрочитанные должны сходиться, для этого BroadcastChannel или общий service worker.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.