Источник
System Design Interview
Web Crawler - один из базовых кейсов для обсуждения frontier, politeness и масштабирования.
Web Crawler решает две задачи одновременно: максимизировать coverage интернета и не перегружать чужие сервисы. Поэтому архитектура строится вокруг трёх идей: распределённый frontier, strict politeness по доменам и инкрементальное обновление контента.
Требования
Функциональные
- Принять стартовый набор seed URL и регулярно расширять coverage.
- Соблюдать robots.txt, crawl-delay и per-host rate limits.
- Извлекать контент и ссылки, нормализовывать URL и убирать дубликаты.
- Поддерживать re-crawl с разной частотой для hot и cold страниц.
- Экспортировать данные в индексирующий pipeline (поисковый слой).
Нефункциональные
Scale: миллиарды URL
Frontier и storage должны масштабироваться горизонтально.
Freshness: минуты-часы
Популярные страницы должны быстро переобходиться.
Politeness: per-domain fairness
Нельзя перегружать один хост массовыми запросами.
Reliability: resume after failures
Очереди и checkpointing не должны терять crawl-прогресс.
High-Level Architecture
Web Crawler: High-Level Map
frontier + scheduling + fetch/parse/storage pipelineControl Plane
Data Plane
Crawler разделён на control plane (frontier, policy, scheduling) и data plane (fetch, parse, storage, indexing).
Как и в других distributed кейсах, ключевой паттерн — явное разделение control plane и data plane. Это позволяет отдельно масштабировать логику scheduling/politeness и сам fetch pipeline.
Crawl Flow
Crawl Flow Explorer
Стиль read/write flow: переключай сценарий и проигрывай ключевые шаги.
Fetch Path: operational notes
- Frontier выдает URL с учетом priority score и per-host fairness.
- Scheduler применяет host budget и crawl-delay перед выдачей lease.
- Fetcher запрашивает страницу, parser извлекает контент и ссылки.
- После canonicalization новые URL возвращаются в frontier loop.
- Документ и metadata публикуются в indexing pipeline.
Recrawl Path: operational notes
- Freshness scorer выбирает URL для переобхода на основе stale-окна.
- Для hot pages re-crawl идет чаще, для cold — реже и batch-режимом.
- Conditional fetch (ETag/Last-Modified) снижает трафик и CPU.
- Результат обхода пишется в crawl event log для retry/observability.
- URL возвращается в frontier с обновленным next_fetch_at.
Data Model (упрощённо)
frontier_queue: url_hash, priority, next_fetch_at, host_key, depthhost_budget: host_key, tokens, refill_rate, crawl_delay_msseen_urls: url_hash, first_seen_at, last_fetch_statuspage_store: page_id, url, content_pointer, fetched_at, checksumcrawl_events: fetch_started/fetch_succeeded/fetch_failed/retry_scheduled
Надёжность и anti-patterns
Production-паттерны
- Idempotent fetch pipeline: повторная обработка URL не ломает состояние.
- Checkpoint frontier и offset-ов очереди для restart без потерь.
- Per-host circuit breaker для проблемных доменов.
- Adaptive retry policy: exponential backoff + jitter по типу ошибок.
- Шардирование frontier по host hash, чтобы снизить lock contention.
Ошибки, которые часто встречаются
- Глобальный FIFO без per-host лимитов: быстро приводит к банам и блокировкам.
- Отсутствие canonicalization URL (utm, trailing slash, case) -> взрыв дублей.
- Переобход «всего одинаково» без importance/freshness scoring.
- Хранение всего контента только в RAM-очередях без durable слоя.
- Игнорирование robots.txt и legal/compliance ограничений.
Связанные главы
RFC
Robots Exclusion Protocol
Официальная спецификация robots.txt и правил взаимодействия crawler с сайтами.
Ключевой trade-off: максимальный throughput vs politeness/legal compliance. На интервью важно показать, как вы ограничиваете скорость по доменам и сохраняете устойчивость при отказах.
