Чат учебных групп и лента
Участники «Клуба» обсуждают занятия в группах и читают публикации авторов. Сообщение должно оставаться в истории, даже если получатель закрыл приложение. После восстановления связи пользователь ожидает увидеть пропущенное, а не несколько одинаковых копий. Спроектируйте чат и ленту с ясными правилами доставки.
Числа в задании учебные. Не подменяйте расчёт выбором названия готового сервиса.
Ограничения
Поддерживаются 10 000 одновременных подключений и 500 новых сообщений в секунду. В группе до 200 участников. У одного публичного автора 100 000 подписчиков. История хранится 90 дней. Повторное подключение должно восстанавливать пропущенные сообщения в пределах доступной истории.
Что подготовить
Опишите протокол: как клиент отправляет сообщение, какое подтверждение получает и что делает при потере ответа. Выберите идентификатор сообщения и курсор чтения — позицию, после которой сервер отдаёт продолжение истории. Покажите, где хранится курсор и как клиент распознаёт повторно доставленное сообщение.
Задайте порядок сообщений внутри группы. Объясните, кто присваивает позиции и что произойдёт при одновременной отправке с разных устройств. Не обещайте общий порядок всех сообщений системы, если задача требует только порядка внутри одной группы.
Оцените размножение доставок, или fan-out: одно новое сообщение может потребовать отправки многим получателям. Посчитайте отдельно групповое сообщение и публикацию популярного автора. Укажите, какие доставки происходят сразу, а какие превращаются в чтение истории позднее.
Подсказка
Разделите постоянное хранение истории, доставку подключённым клиентам и сведения о присутствии пользователя в сети. Статус «онлайн» может устареть; он не должен быть единственным основанием для удаления сообщения из надёжного хранилища.
Как проверить решение
Покажите трассу с потерянным подтверждением и повторной доставкой: пользователь не должен увидеть дубликат. Затем разорвите соединение и восстановите историю по курсору. Для события автора приведите верхнюю границу числа доставок подписчикам: до 100 000, если каждому предназначена одна доставка. Повторы и несколько устройств учитывайте отдельно, если включаете их в модель.
Усложнение
Пользователь отсутствовал дольше 90 дней — срока хранения истории. Объясните, что сервер ответит на старый курсор и как приложение сообщит о недоступной части переписки.
Как оформить ответ
Сохраните протокол, схему хранения и расчёт доставок в тетради. Сравните два способа формирования ленты и предложите тест восстановления связи. Правильность решения оценивается по описанным историям, а не автоматически.
Запишите ход рассуждений, расчёты и вопросы. Сохраните текст перед уходом со страницы. После входа в аккаунт ответ участвует в общей синхронизации прогресса. Автоматической оценки архитектуры здесь нет.