Ctrl K
Урок

Оценки на салфетке

Зачем считать, если можно не считать

Представь, что ты собираешься на дачу с друзьями. Никто не пересчитывает каждую сосиску, но кто-то прикидывает: «нас восемь, каждый съест штуки три, значит, берём упаковки три». Ошибиться на пару сосисок не страшно. Страшно взять одну упаковку или двадцать.

На 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 МБ

Формула за минуту

Любой расчёт строится по одной цепочке:

  1. Пользователи в день (DAU) × действий на пользователя = действий в сутки.
  2. Действия в сутки ÷ 10⁵ = средний RPS.
  3. Средний RPS × пиковый коэффициент = пиковый RPS.
  4. Записи в сутки × размер записи = рост хранилища в день. Умножаешь на срок и на репликацию.
  5. Запросы × размер ответа = трафик.

Пример: лента постов на 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 раз больше, чем записей, поэтому кэш окупится.

фотоAPIпромахчтение 20:1загрузкаКлиентклиентCDN (фото, ~95% трафика)CDNБалансировщикLBAPI: ~2000 RPS чтения, ~100 записисервисRedis: горячая лентакэшБД постов: ~20 ТБ за 5 летБДОбъектное хранилище: ~400 ТБхранилище
Каждая оценка превратилась в решение: CDN под трафик фото, кэш под перекос чтений

Пик ≠ среднее

Средний RPS — это то, что мы получили, «размазав» сутки ровно. Реальная нагрузка выглядит как горб: ночью тихо, вечером все сидят в телефонах.

3000
2001
8002
18003
22004
25005
45006
60007
Условный RPS по времени суток (03, 06, 09, 12, 15, 18, 21, 23 ч): вечерний пик ~3× от среднего

Как озвучивать пиковый коэффициент:

  • ×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 → пик → хранилище → трафик» будет отскакивать сама.