open atlas
↑ К треку
Основы System Design SD · 09 · 07

Фреймворк интервью: прикладные числа и конфиг

Читай артефакты реального интервью — хелпер оценки, заметку требований, расчёт ёмкости, конфиг, что кодирует трейдофф — и рассуждай, как сеньор: какое число меняет дизайн, что конфиг отдаёт, куда смещается узкое место.

SD Senior ◷ 14 min
Уровень
ОсновыJuniorMiddleSenior

Фреймворк живёт в числах и конфиге, не в прозе. Оценка, что переводится в число серверов, заметка требований, что прячет пропущенную цель, конфиг, что молча кодирует трейдофф. Читай каждый артефакт, делай арифметику и рассуждение в уме и выбирай ответ, на который сеньор подписался бы у доски.

Практикуй петлю, что прогоняешь у доски: найди число, что меняет дизайн, заметь пропущенное требование, переведи нагрузку в ёмкость и прочти, что конфиг отдаёт — выбирая ход, что поддерживают арифметика и трейдофф.

Сниппет 1 — хелпер оценки

def design_changing_numbers(dau, posts_per_day, read_write_ratio):
    writes_per_sec = dau * posts_per_day / 86_400
    reads_per_sec  = writes_per_sec * read_write_ratio
    peak = lambda x: round(x * 3)          # множитель пика 3x
    return {"write_avg": round(writes_per_sec), "read_avg": round(reads_per_sec),
            "write_peak": peak(writes_per_sec), "read_peak": peak(reads_per_sec)}

# 50M DAU, 2 поста/день, чтений 50x записей
print(design_changing_numbers(50_000_000, 2, 50))
Викторина

Читая до одной значащей цифры, какое выходное число первым меняет дизайн и на что?

Сниппет 2 — заметка требований

# требования, зафиксированные до рисования
functional:
  - пользователи постят сообщения
  - пользователи читают ленту
non_functional:
  scale: 50M DAU
  latency_p99_read_ms: 150
  # consistency: <-- не зафиксирована
  availability_slo: "99.9%"
Викторина

Каков самый последствийный пробел в этой заметке требований и почему он важен до рисования?

Сниппет 3 — расчёт ёмкости

peak_read_qps   = 200_000
per_node_qps    = 8_000          # точка изгиба кривой очередей
cache_hit_rate  = 0.90

origin_qps = peak_read_qps * (1 - cache_hit_rate)
nodes      = -(-origin_qps // per_node_qps)     # деление с округлением вверх
print(origin_qps, nodes)         # что напечатает и что обоснует?
Викторина

Что это напечатает и какое решение дизайна обоснует?

Сниппет 4 — конфиг, что кодирует трейдофф

# путь чтения ленты
read_from: cache
cache_ttl_seconds: 30
on_cache_miss: read_replica       # async-реплика, может отставать от primary
write_path: fan_out_on_write_async
Викторина

Какой трейдофф кодирует этот конфиг и как ты сформулируешь его интервьюеру?

Вспомните перед уходом
  1. 01
    По выходу хелпера оценки как заметить число, что меняет дизайн?
  2. 02
    Как перевести hit rate кэша в число origin-узлов и что обосновывает результат?
  3. 03
    Как вычитать трейдофф из конфига и как его сформулировать?
Итог

Каждый шаг фреймворка проявляется в артефактах, что ты читаешь у доски. Хелпер оценки выдаёт число, что либо пересекает порог (~150–200K пиковый read QPS форсирует кэш/fan-out путь), либо нет (скромный темп записи ничего не меняет) — читай до одной значащей цифры и найди то, что двигает дизайн. Заметка требований судится по пропущенному: брошенная цель согласованности нагруженная, ведь терпимость к устареванию решает fan-out-и-кэш против координации. Расчёт ёмкости переводит нагрузку в ёмкость — 90% попаданий кэша превращают флот ~25 origin-узлов в ~3, что ровно обосновывает кэш — и ты всё равно размеряешь RAM кэша и страхуешься, чтобы он не стал SPOF. Конфиг молча кодирует трейдофф (TTL + async-реплика + async fan-out — это согласованность-в-конечном-счёте), и сеньорский ход — назвать цену (окно устаревания) и границу, где ты перевернул бы его (транзакционные данные). Читай числа, делай математику, называй решение и его цену — это и есть фреймворк в действии.

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.