Читай реальную математику ёмкости и конфиг из четырёх кейсов и считай: проверка пересечения кворума, оценка QPS/keyspace сокращателя, размер bloom filter краулера и расчёт числа партиций Kafka.
SDCSenior◷ 14 min
Уровень
ОсновыJuniorMiddleSenior
Баги дизайна прячутся в числах, не в прозе: кворум, что не пересекается, QPS, ошибающийся на 10^5, bloom filter, размеренный под неверную долю ошибок, число партиций, ограничивающее пропускную способность. Читай каждый сниппет, считай в уме и выбери ответ, под которым подпишется senior-инженер.
Практикуй цикл, что крутишь на ревью дизайна: найди числа в конфиге, примени правило (пересечение кворума, daily-в-QPS, биты bloom filter, пропускная способность партиции) и выбери изменение, которое арифметика реально поддерживает.
Сниппет 1 — конфиг кворума
# распределённое KV-хранилищеreplication_factor_N: 3write_quorum_W: 1read_quorum_R: 1# "настроено под низкую задержку"
Викторина
Completed
С этим конфигом может ли клиент всегда прочитать обратно только что записанное значение на строгом кворуме, и какая починка, если нет?
Heads-up Лишь если R + W > N. Здесь R + W = 2 ≤ 3, так что одно чтение может попасть на два узла, не получивших запись W=1. Нужно R + W > N для гарантированного пересечения.
Heads-up Поднятие N без поднятия R и W держит R + W ≤ N и делает пересечение менее вероятным, не более. Починка — неравенство R + W > N, например W=2,R=2 при N=3.
Heads-up Запись для возврата нуждается лишь в W подтверждениях; при W=1 гарантированно имеет её лишь одна реплика. Чтение R=1 может попасть на другую. R + W > N — то, что вынуждает пересечение.
Примерно что вернёт shortener_capacity(100_000_000) и какое число диктует архитектуру?
Heads-up Отношение 100:1, так что чтения = записи × 100 ≈ 4 000/с, не 40. Весь смысл сокращателя в том, что чтения массово доминируют, поэтому ты кешируешь путь редиректа.
Heads-up Это в МЕСЯЦ. Деление на ~2,6M секунд/месяц даёт ~40 записей/с. Всегда переводи месячный итог в в-секунду до рассуждений о нагрузке.
Heads-up Ты поменял их местами. Записи — малое число (~40/с); чтения — записи × 100 ≈ 4 000/с. Чтения доминируют, так что путь редиректа/кеш — куда идёт дизайн.
Примерно сколько RAM нужно каждому подходу и чего стоит bloom filter?
Heads-up Bloom filter использует ~10 бит на URL против 100 байт (800 бит) точно — примерно в 80x меньше, ~12,5 ГБ против ~1 ТБ. Экономия этой памяти — вся причина использовать его для дедупа веб-масштаба.
Heads-up Наоборот. Точное множество по 100 байт/URL — это ~1 ТБ; bloom filter по ~10 бит/URL — ~12,5 ГБ. Bloom filter — малое — в этом смысл.
Heads-up Математика памяти верна, но он не бесплатен: у bloom filter настраиваемая доля ложно-положительных, так что он может изредка пометить реально новый URL виденным и пропустить. Приемлемо здесь, но реальная цена.
Сниппет 4 — число партиций Kafka
# размер Kafka-подобного топикаtarget_throughput_mb_s = 1000 # ~1 ГБ/с на пикеper_partition_mb_s = 10 # потолок упорядоченной реплиц. записи на партициюconsumers_in_group = 8partitions_needed = target_throughput_mb_s / per_partition_mb_s
Викторина
Completed
Сколько партиций нужно этому топику и каково последствие для группы из 8 консьюмеров?
Heads-up 8 партиций ограничивают пропускную способность до 8 × 10 = 80 МБ/с, далеко ниже цели 1 ГБ/с. Нужно ~100 партиций ради пропускной способности; число консьюмеров — отдельный лимит (максимум консьюмеров = партиций).
Heads-up Все ~100 партиций пишутся и читаются; при 8 консьюмерах каждый просто обрабатывает ~12 партиций. Консьюмеры ≤ партиций — потолок параллелизма, не потолок того, сколько партиций существует или используется.
Heads-up Следи за единицами: 1000 МБ/с ÷ 10 МБ/с = ~100 партиций, не 10. Смешение ГБ и МБ роняет множитель ~10 — ровно такой промах единиц недопровижинит топик.
Вспомните перед уходом
01
Как проверить, что конфиг кворума даёт read-your-write, и в чём ловушка?
02
Как размерить bloom filter краулера и сколько партиций Kafka под цель пропускной способности?
Итог
Каждое решение дизайна в этих кейсах сводится к арифметике, что читаешь прямо с конфига. Проверка кворума — R + W > N: конфиг W=1, R=1 при N=3 суммируется в 2 ≤ 3, так что чтения могут промахиваться мимо записей — чини W=2, R=2. Оценка сокращателя переводит 100M URL/месяц в ~40 записей/с и, при 100:1, ~4 000 чтений/с — и число чтений диктует архитектуру кеш-и-редирект. Размер bloom filter показывает, что ~10 бит/URL дают ~12,5 ГБ для 10 миллиардов URL против ~1 ТБ точно (~80x меньше), ценой малой доли ложно-положительных. Число партиций — цель пропускной способности ÷ потолок на партицию (1000 ÷ 10 ≈ 100 партиций), что также ограничивает параллелизм консьюмеров числом партиций. Senior-привычка одна и та же для всех четырёх: найди числа, посчитай, следи за единицами и выбери починку, что поддерживает арифметика — а не ту, что её прячет.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.