Na última vez, projetamos a linha do tempo do Twitter; desta vez, vamos para a parte anterior — a metade frontal de um motor de busca: um web crawler. Um programa que baixa toda a internet. Parece insano, mas todo o design se resume a três partes: uma fronteira de URLs sem fim, um filtro de "já vi isso?" (o filtro Bloom, a estrela deste episódio) e cortesia para que você não derrube sites. Segunda temporada, problema de design dois.
Faça as contas primeiro: um bilhão de links para rastrear, quatro bilhões de páginas por mês, quinhentos KB por página, dois petabytes por mês, setenta e dois petabytes em três anos, mil e seiscentas gravações por segundo. Nota — um crawler é limitado pela largura de banda, não pela CPU.
· O loop: pegue uma URL da fila → busque → analise → extraia novos links → coloque-os de volta na fila. Uma URL está vinculada a inúmeras páginas; pule a deduplicação e você ficará preso em um loop para sempre, queimando largura de banda.
· O filtro Bloom (a estrela): "já vi esta URL?" Um conjunto exato armazena cada string de URL — 106 MB para um milhão de URLs, dezenas de GB em um bilhão, não caberá na RAM. Um filtro Bloom usa um array de bits fixo de 1,2 MB e sete hashes; a resposta é sempre "definitivamente nova" ou "provavelmente vista." É cerca de oitenta e nove vezes menos memória, com um custo de uma taxa de falso positivo de ~0,96% — mas a taxa de falso negativo é sempre zero, então nunca re-crawla uma URL vista. Como: k hashes mapeiam para k bits; qualquer bit 0 significa definitivamente novo, todos 1 significam provavelmente visto. Sem falsos negativos, apenas falsos positivos ocasionais — a assimetria que um crawler deseja.
· Fronteira de URLs + cortesia: links reais são distorcidos, um host central é sessenta por cento deles. Um FIFO ingênuo atinge um host 136 das primeiras 200 buscas (dez seguidas) — indistinguível de um DoS, IP banido. Uma fronteira cortês faz round-robin por host: apenas dez acessos, no máximo um seguido do outro. A fronteira é um agendador de cortesia.
· Deduplicação de conteúdo: o mesmo artigo aparece sob muitas URLs (ids de sessão, ?print=1, domínios espelho). Uma assinatura de conteúdo captura duplicatas exatas, SimHash captura quase-duplicatas — e elimina armadilhas de crawler (calendários infinitos).
Como a IA move isso: (1) Extração: um scraper regex/CSS está preso à estrutura HTML e quebra em um redesign (demonstração: regex 4/4 → 0/4), enquanto um extrator LLM trabalha a partir do significado e permanece 4/4 em ambos os layouts. (2) O ponto maior: o próprio crawl é o corpus de treinamento — o Common Crawl alimentou quase todos os LLMs. A IA consome a saída do crawl e atualiza seu parser. A nota honesta: a IA não muda a fronteira, a deduplicação Bloom ou a cortesia — a deduplicação de mais de um bilhão de URLs ainda é trabalho do filtro Bloom, não do modelo. Você nunca perguntaria a um LLM "já vi esta URL?"
Um crawler = fronteira + Bloom + cortesia, mais uma vez montado a partir das partes de episódios anteriores (fila, dedup, cache, shard). Todas as quatro demonstrações são stdlib, execução real. Código + walkthrough escrito: github.com/vicenteliu/system-design-ai-era (exercises/web-crawler).
00:00 Desenvolvendo um web crawler
00:38 Estimativa · largura de banda é o gargalo
01:05 O loop de rastreamento · dedup ou loop para sempre
01:38 Filtro Bloom · 89x menos memória
02:30 Como o Bloom funciona · sem falsos negativos
03:11 Fronteira de URLs · agendamento de cortesia
04:00 Deduplicação de conteúdo · SimHash
04:45 IA · extração LLM + dados de treinamento
06:21 A nota honesta · IA mantém a estrutura
06:43 As armadilhas
07:29 Mapa da arquitetura + encerramento
—
Derivado de donnemartin/system-design-primer (CC BY 4.0) — forma, não texto.
Pegue Meu Cérebro