Храните записи ленты в БД, медиа и снимки внешних страниц — в объектном хранилище, а сниппеты загружайте фоновыми задачами. Чтение ленты не должно синхронно ждать сторонний сайт.
Проектирование системы новостных лент
Храните записи ленты в БД, медиа и снимки внешних страниц — в объектном хранилище, а сниппеты загружайте фоновыми задачами. Чтение ленты не должно синхронно ждать сторонний сайт.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создать архитектуру сервиса новостных лент, обеспечивающего публикацию, отображение и кэширование материалов из внешних источников.
Требования к функционалу:
- Пользователь может публиковать сообщения в свой персональный новостный поток (в том числе с указанием ссылок на оригинальные ресурсы).
- Возможен просмотр как собственного, так и чужих потоков с прокруткой полного списка записей.
- Для новостей, ссылающихся на внешние ресурсы, выводится сниппет (заголовок, описание, изображение) с переходом к оригиналу.
- Предоставляется возможность увидеть содержимое оригинального ресурса внутри системы без перенаправления наружу (кеширование).
Нефункциональные требования:
- Доступность API не ниже 99.9%.
- Максимальное время отклика API — 100 мс.
- Сохранность данных минимум 5 лет.
Необходимо спроектировать:
- Хранилища и кэширующие слои для внешнего контента.
- API для создания и чтения лент.
- Асинхронные обработчики, отвечающие за загрузку и обновление сниппетов.
- Механизмы масштабирования и обеспечения отказоустойчивости.
Ответ
Храните записи ленты в БД, медиа и снимки внешних страниц — в объектном хранилище, а сниппеты загружайте фоновыми задачами. Чтение ленты не должно синхронно ждать сторонний сайт.
POST /feeds/{user}/posts сохраняет запись и событие outbox; GET использует cursor-пагинацию по времени и id. Worker получает URL, извлекает заголовок/описание/изображение и сохраняет версионированный снимок. При ошибке остаётся исходная ссылка.
Защитите загрузчик от SSRF, ограничьте размер/время, очистите HTML и отображайте его изолированно без чужих скриптов. БД реплицируется, API масштабируется горизонтально, Redis кеширует горячие страницы. Пятилетняя сохранность требует резервных копий и проверок восстановления. Для 100 мс уточните перцентиль и нагрузку: жёсткий максимум в распределённой системе гарантировать нельзя. Обновления внешнего контента выполняются асинхронно.