Multiple-choice синтез по фундаментальным кейсам: кворум KV-хранилища, отношение чтений/записей и статус редиректа сокращателя, frontier и дедуп краулера, порядок и семантика доставки очереди сообщений.
SDCSenior◷ 13 min
Уровень
ОсновыJuniorMiddleSenior
Шесть вопросов, режущих сквозь четыре кейса. Каждый — решение, что ты принимаешь у доски: какая настройка кворума, какая схема короткого кода, почему frontier двухступенчатый, какая семантика доставки — а не определение для зубрёжки.
Подтверди, что умеешь выбрать кворум, дающий read-your-write, прочесть отношение чтений/записей сокращателя и выбрать статус редиректа, объяснить, почему frontier краулера разделяет приоритет и вежливость, и назвать семантику доставки по тому, где коммитится оффсет.
Викторина
Completed
Dynamo-подобное хранилище на N=3. Клиент должен уметь прочитать обратно только что записанное значение, на строгом кворуме. Какая настройка R/W — минимальная, что это гарантирует?
Heads-up R + W = 2 ≤ N = 3, так что множества чтения и записи могут не пересекаться, и чтение может промахнуться мимо нового значения. Нужно R + W > N; W=2,R=2 — балансный минимальный выбор.
Heads-up Это работает, но не минимально и убивает доступность (любой упавший узел блокирует операцию). R + W > N — реальное требование, выполняемое W=2,R=2 с куда лучшей доступностью.
Heads-up Число реплик само по себе не гарантирует пересечение; его гарантирует отношение R + W > N. При N=3 W=2,R=2 уже гарантирует, что чтение увидит запись, лишних реплик не надо.
Викторина
Completed
Твой сокращатель URL зарабатывает на аналитике кликов. Инженер переключает редиректы на 301, чтобы «срезать нагрузку сервера». Что ломается и какой статус верен?
Heads-up 301 кеширует связку в браузерах, так что ты перестаёшь видеть повторные клики — фатально, когда клики это продукт — и теряешь возможность менять или истекать ссылку. 302 хранит и то и другое ценой обслуживания каждого клика.
Heads-up Статус редиректа никак не связан с уникальностью кода (она задана при генерации). 301 ломает аналитику и перенаправление, потому что браузеры кешируют связку; 302 — починка.
Heads-up Сохраняющий аналитику выбор — 302 (временный, не кешируется); 307 — временный редирект с сохранением метода, не стандартный ответ сокращателя. Суть — временный (не кешируется) против постоянного (кешируется).
Викторина
Completed
Краулер тянет URL строго по приоритету из одной очереди и продолжает делать DDoS отдельным сайтам. Почему и что чинит это?
Heads-up Больше потоков делают задалбливание хуже. Проблема — нет лимита на хост; починка — задние очереди (по хосту каждая, с меткой crawl-delay), а не больше конкурентности.
Heads-up Bloom filter дедуплицирует URL; он не темперирует запросы к хосту. Вежливость идёт от задних очередей frontier, обеспечивающих delay на хост — отдельная от дедупа забота.
Heads-up Уважение crawl-delay из robots помогает, но структурная починка — двухступенчатый frontier, чьи задние очереди обеспечивают один-запрос-на-хост-за-delay даже там, где robots не даёт delay. Одна приоритетная очередь так не может.
Викторина
Completed
Нужно обработать события пользователя по порядку в Kafka-подобном логе с многими партициями. Что это гарантирует и в чём ловушка?
Heads-up Репликация про надёжность, не про порядок. Порядок — на партицию; держишь события пользователя упорядоченными, маршрутизируя их в одну партицию ключом, а не добавляя реплики.
Heads-up Это даёт полный порядок, но ограничивает пропускную способность и параллелизм консьюмеров до одного — побеждая партиционирование. Верный ход — ключ партиции по пользователю, чтобы каждый был упорядочен, а топик всё ещё масштабировался.
Heads-up Exactly-once про дубли/потери, не про порядок. Порядок для пользователя идёт от стабильного ключа партиции, маршрутизирующего его события в одну упорядоченную партицию.
Викторина
Completed
Консьюмер коммитит оффсет ПОСЛЕ обработки каждого сообщения. Процесс падает после побочного эффекта, но до коммита. Что произойдёт при перезапуске?
Heads-up Пропуск случается, когда коммитишь ДО обработки. Коммит ПОСЛЕ значит, что незакоммиченное сообщение перечитывается при перезапуске — at-least-once, с возможными дублями, не потерей.
Heads-up Коммит после обработки даёт at-least-once (дубли при ретрае), не exactly-once. Exactly-once нужен идемпотентный консьюмер или атомарная транзакция оффсет-плюс-эффект.
Heads-up Крах вызывает ребаланс, но партиция продолжает с последнего закоммиченного оффсета — перечитывая незакоммиченное сообщение. Это at-least-once: переобработка, не пропуск.
Викторина
Completed
Точное множество виденных URL краулера потребовало бы ~1 ТБ RAM. Ты ставишь bloom filter. Какое утверждение верно?
Heads-up Bloom filter никогда не даёт ложно-отрицательных: «не видел» значит точно новый. Ошибка — ложно-положительный (новый URL помечен виденным и пропущен) — в обратную сторону.
Heads-up Он вероятностный, не lossless. Он меняет настраиваемую долю ложно-положительных на огромную экономию памяти — причина, почему влезает там, где точное множество на 1 ТБ нет.
Heads-up Дедуп URL (bloom filter) и дедуп контента (хеш тела) ловят разные дубли — один контент, достигнутый через http/https или трекинг-параметры, имеет разные URL. Нужны оба.
Вспомните перед уходом
01
Какой кворум даёт read-your-write при N=3 и почему?
02
Почему frontier краулера двухступенчатый и что at-least-once навязывает консьюмеру?
Итог
Стержень сквозь четыре кейса в том, что каждый — те же несколько ходов, применённые к новой форме. KV-хранилище — решение о кворуме: R + W > N (например W=2,R=2 при N=3) гарантирует пересечение чтения с последней записью. Сокращатель URL — чтение отношения чтений/записей: ~100:1 значит, что путь редиректа — это всё, а статус 301-против-302 меняет нагрузку на аналитику/контроль (302, когда клики — продукт). Краулер — двухступенчатый frontier (приоритет спереди, вежливость по одному-хосту-на-заднюю-очередь сзади) плюс bloom filter (без ложно-отрицательных, с настраиваемыми ложно-положительными) и хеш контента для дублей, которые URL не ловят. Очередь сообщений — партиционированный лог: стабильный ключ партиции держит события пользователя упорядоченными (порядок лишь на партицию), а время коммита оффсета задаёт семантику доставки — коммит после обработки это at-least-once, так что консьюмеры обязаны быть идемпотентными. Узнай ход — и дизайн напишется сам.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.