Нужны gateway постоянных соединений, сервис диалогов, шардированное долговечное хранение, события доставки и отдельное хранилище изображений. Сообщение подтверждают после устойчивой записи, повторы дедуплицируют.
Спроектируйте масштабируемый мессенджер: только личные чаты, отправка текста и изображений, доставка онлайн и офлайн через push-уведомления, статусы «отправлено/доставлено/прочитано», история переписки и статус присутствия онлайн/офлайн.
Нужны gateway постоянных соединений, сервис диалогов, шардированное долговечное хранение, события доставки и отдельное хранилище изображений. Сообщение подтверждают после устойчивой записи, повторы дедуплицируют.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Спроектируйте масштабируемый мессенджер: только личные чаты, отправка текста и изображений, доставка онлайн и офлайн через push-уведомления, статусы «отправлено/доставлено/прочитано», история переписки и статус присутствия онлайн/офлайн. Ограничения: до 10 млн пользователей, средняя нагрузка до 50 тыс. сообщений/с, пиковая — до 100 тыс. сообщений/с, сообщения не должны теряться, система должна горизонтально масштабироваться; P99 онлайн-доставки — до 400 мс.
Ответ
Нужны gateway постоянных соединений, сервис диалогов, шардированное долговечное хранение, события доставки и отдельное хранилище изображений. Сообщение подтверждают после устойчивой записи, повторы дедуплицируют.
Порядок задают внутри диалога, маршрутизацию — по conversation ID; история читается курсором. Sent означает принятие сервером, delivered/read — подтверждение устройства и действия пользователя по явному контракту. Offline push только сообщает о новых данных; источник истины — история. Presence хранит heartbeat с TTL и допускает запаздывание. Для пика 100 тыс./с планируют партиции, резерв и нагрузочные измерения P99≤400 мс. Изображения передают через защищённые ссылки. Гарантию «не терять» уточняют по сбоям и RPO, не обещают абсолютную неуязвимость.