---
round: 1
date: 2026-09-22
mode: mock
mock: true
service: feed + media-hosting (фото-соцсеть, гибрид «инстаграм/твиттер»)
duration_min: 60
status: completed
---

# Раунд 1 — mock с ассистентом (фото-соцсеть)

Кейс: публикация фото с подписью, подписки, персональная лента, лайки/комментарии. 100M зарегистрированных, 30M DAU, mobile + web.

## Рубрика (6 этапов × 0–3)

| Этап | Балл | Комментарий |
|---|---|---|
| 1. Требования | 2 | Спросил нагрузку и типы публикаций; латентность/согласованность не уточнил сам — вытянул интервьюер |
| 2. Оценки | 2 | Декомпозиция через действия пользователя — правильно. Проколы: чтение 10k vs 30k RPS (самосогласованность), лайки 6k vs 3.5k, хранение 10 ПБ/год без проговорённого допущения (сжатие 3→0.5 МБ). Bandwidth 150 ГБ/с → CDN — хорошо |
| 3. API и модель данных | 1 | API не дано после двух напоминаний; модель данных вытянута пробами (двусторонний граф подписок, метаданные постов) |
| 4. Высокоуровневая схема | 2 | Сильный контент: direct-to-S3 по signed URL, автомат публикации (пост не опубликован без превью), гибридный fan-out (push + pull для селебрити, порог ~100K), склейка на лету. Схема дана только к ~28-й минуте после трёх напоминаний, поток сознания |
| 5. Ресурсы и узкие места | 2 | CDN/origin-математика есть (~10 ГБ/с на origin при 90% hit); узких мест сам не находил (знаменитости — подсказка), write amplification fan-out не посчитан |
| 6. Эксплуатация | 2 | Деградацию прошёл по 6 нодам, rate limiter назвал сам. Пропуски: thundering herd (разобран на месте), silent hang vs ретраи (не увидел), кворум при 2 ДЦ, acks=all + идемпотентность консюмера, blast radius как формулировка |

**Сумма: 11/18** (порог 13 — не пройден). Этап 6 = 2 (порог пройден). Тайминг: схема к 28-й мин вместо 15–18 — не в допуске ±3.

## Чек-лист §6.2

- Требования записаны и не стёрты — **нет** (числа проговорены, листа не было)
- ≥ 3 расчёта вслух с формулами — **да** (600/1200 RPS запись, 30k чтение, 10 ПБ/год, 150 ГБ/с, origin после CDN)
- Каждый ключевой узел получил сценарий отказа — **да** (Redis, шард БД, Kafka, CDN, ДЦ, воркер)
- Эксплуатация уложилась в 10 минут — **да** (~последняя треть)
- Финальный возврат к требованиям — **нет** (секцию завершил интервьюер)
- Паттерны §3 минимум по одному — **частично** (гипотезы проговаривались слабо, «допущение» как слово не звучало)

## 3 улучшения к следующему раунду

1. **Тайминг и водительское кресло:** полная схема к 15–18-й минуте без напоминаний; о переходе к следующему этапу объявляю сам («требования зафиксировал, перехожу к числам»). Не отвечать потоком сознания — структура «путь записи / путь чтения», «компонент — почему — что при отказе».
2. **API + модель данных — пропускать нельзя:** 3 эндпоинта (publish, getFeed, postById) + сущности с ключами шардирования: посты → author_id, подписки → двусторонние списки смежности, лента → user_id, кэш лент → user_id.
3. **Словарь эксплуатации (выучить формулы):** «громко упало → ретраи + DLQ; тихо зависло → таймауты + SLA-алерты»; thundering herd → single-flight / stale-while-revalidate; Kafka → acks=all + идемпотентный консюмер; ДЦ → кворум (3 ДЦ или свидетель), синхронная репликация = цена латентности; blast radius первой фразой («пострадает 1/N пользователей»).

## Новое, выученное в раунде

- Thundering herd на кэше: кэш — не ускоритель, а защита БД; путь к БД проектируется на случай полной потери кэша (single-flight, soft TTL, ограничение concurrency, постепенная растопка).
- Hang vs failure: зависший воркер не рождает ошибок — лечится visibility timeout + DLQ + бизнес-SLA алерт («постов в publishing > 5 мин»).
- Hybrid fan-out: push для обычных, pull для селебрити, склейка при отдаче; обратный индекс смежности author_id → подписчики в KV.
