Оценки на салфетке
Зачем считать, если можно не считать
Представь, что ты собираешься на дачу с друзьями. Никто не пересчитывает каждую сосиску, но кто-то прикидывает: «нас восемь, каждый съест штуки три, значит, берём упаковки три». Ошибиться на пару сосисок не страшно. Страшно взять одну упаковку или двадцать.
На System Design собесе оценки на салфетке нужны для того же. Тебя не просят угадать точное число. Важен порядок: 100 запросов в секунду или 100 000? От этого зависит архитектура. Сотню выдержит один сервер с PostgreSQL. Сотне тысяч нужны шардирование, кэши и очереди.
Главное правило: округляй смело. 86 400 — это 10⁵. 3,7 — это 4. Интервьюер оценивает ход мысли, а не арифметику.
Шпаргалка: числа, которые стоит помнить
Время
| Что | Приближение |
|---|---|
| Секунд в сутках | 86 400 ≈ 10⁵ |
| Секунд в году | ≈ 3·10⁷ |
| Дней за 5 лет | ≈ 2000 (точнее 1825) |
Задержки (порядки, а не точные значения)
| Операция | Время |
|---|---|
| Чтение из памяти (RAM) | ~100 нс |
| Случайное чтение с SSD | ~100 мкс |
| Seek на HDD | ~10 мс |
| Round-trip внутри дата-центра | ~0,5 мс |
| Межконтинентальный запрос (Европа ↔ США) | ~100–150 мс |
Отсюда два вывода для собеса. Память примерно в 1000 раз быстрее SSD, поэтому горячие данные держат в кэше. Запрос через океан съедает весь бюджет задержки, поэтому нужны CDN и региональные дата-центры.
Размеры
| Что | Размер |
|---|---|
| Символ ASCII / кириллица в UTF-8 | 1 Б / 2 Б |
int64, timestamp |
8 Б |
| UUID (бинарный / строкой) | 16 Б / 36 Б |
| Короткий текстовый пост с метаданными | ~1 КБ |
| Фото после сжатия | ~200 КБ – 2 МБ |
| Минута видео 720p | ~10–50 МБ |
Формула за минуту
Любой расчёт строится по одной цепочке:
- Пользователи в день (DAU) × действий на пользователя = действий в сутки.
- Действия в сутки ÷ 10⁵ = средний RPS.
- Средний RPS × пиковый коэффициент = пиковый RPS.
- Записи в сутки × размер записи = рост хранилища в день. Умножаешь на срок и на репликацию.
- Запросы × размер ответа = трафик.
Пример: лента постов на 10 млн пользователей в день
Допущения проговариваем вслух:
- DAU = 10⁷;
- каждый пользователь просматривает 20 постов и публикует 1 пост в день;
- пост весит ~1 КБ (текст + UUID + автор + timestamp);
- у 10% постов есть фото по ~200 КБ.
Нагрузка
| Метрика | Расчёт | Итог |
|---|---|---|
| Чтений в сутки | 10⁷ × 20 | 2·10⁸ |
| Средний RPS чтения | 2·10⁸ / 10⁵ | ~2000 |
| Записей в сутки | 10⁷ × 1 | 10⁷ |
| Средний RPS записи | 10⁷ / 10⁵ | ~100 |
| Соотношение чтение : запись | 2000 / 100 | 20 : 1 |
Хранилище на 5 лет
| Что | Расчёт | Итог |
|---|---|---|
| Тексты в день | 10⁷ × 1 КБ | 10 ГБ |
| Фото в день | 10⁶ × 200 КБ | 200 ГБ |
| Тексты за 5 лет | 10 ГБ × 2000 | ~20 ТБ |
| Фото за 5 лет | 200 ГБ × 2000 | ~400 ТБ |
| С репликацией ×3 | 420 ТБ × 3 | ~1,3 ПБ |
Исходящий трафик
| Что | Расчёт | Итог |
|---|---|---|
| Средний ответ на просмотр | 1 КБ + 0,1 × 200 КБ | ~21 КБ |
| Трафик в сутки | 2·10⁸ × 21 КБ | ~4 ТБ |
| Средняя полоса | 4 ТБ / 10⁵ с | ~40 МБ/с ≈ 0,3 Гбит/с |
Теперь цифры подсказывают архитектуру. Фото — это 95% объёма и трафика, их место в объектном хранилище за CDN. Тексты (20 ТБ) помещаются в шардированную БД. Чтений в 20 раз больше, чем записей, поэтому кэш окупится.
Пик ≠ среднее
Средний RPS — это то, что мы получили, «размазав» сутки ровно. Реальная нагрузка выглядит как горб: ночью тихо, вечером все сидят в телефонах.
Как озвучивать пиковый коэффициент:
- ×2–3 — обычный суточный пик для потребительского сервиса;
- ×5–10 — распродажи, новогодняя ночь, пуш на всю базу, финал чемпионата.
В нашем примере пик чтения составит 2000 × 3 ≈ 6000 RPS, с запасом на события закладываем ~10–20 тыс. RPS. Проектируй под пик, а не под среднее. Среднее нужно, чтобы считать хранилище и деньги.
Как это звучит на собесе
«Возьму 10 миллионов DAU, каждый читает 20 постов и пишет один. Это 2·10⁸ чтений в сутки, делим на 10⁵ секунд, выходит около 2000 RPS в среднем, в пике ×3 — 6000. Запись около 100 RPS. Перекос 20:1 в сторону чтения, значит кэш нужен. По хранилищу фото дают 400 ТБ за 5 лет против 20 ТБ текстов, поэтому фото кладу в S3 за CDN».
Одна такая минута показывает, что ты мыслишь числами, а не модными словами. Обязательно назови компромиссы допущений: «если видео вместо фото, объём вырастет на порядок, и тогда главными становятся транскодинг и стоимость хранения».
Частые ошибки
- Точная арифметика вместо порядков. Делить на 86 400 в уме — пустая трата времени.
- Молчаливые допущения. Проговаривай каждое: интервьюер может поправить, и это нормально.
- Забытая репликация и индексы. Реальный объём на диске в 2–3 раза больше «сырых» данных.
- Проектирование под среднее. Система, рассчитанная на 2000 RPS, упадёт вечером.
- Цифры ради цифр. Посчитал — сделай вывод: «значит, нужен кэш / шардирование / CDN». Иначе расчёт не работает на тебя.
Потренируйся на трёх сервисах: мессенджер, сокращатель ссылок, видеохостинг. После третьего раза цепочка «DAU → RPS → пик → хранилище → трафик» будет отскакивать сама.