Beim letzten Mal haben wir die Twitter-Timeline entworfen; diesmal gehen wir upstream — die vordere Hälfte einer Suchmaschine: ein Web Crawler. Ein Programm, das das gesamte Internet herunterlädt. Es klingt verrückt, aber das gesamte Design besteht aus drei Teilen: einer nie endenden URL-Frontier, einem "habe ich das schon gesehen?"-Filter (der Bloom-Filter, der Star dieser Episode) und Höflichkeit, damit du keine Seiten überlastest. Staffel zwei, Designproblem zwei.
Mach zuerst die Rechnung: eine Milliarde Links zu crawlen, vier Milliarden Seiten pro Monat, fünfhundert KB pro Seite, zwei Petabyte pro Monat, zweiundsiebzig Petabyte über drei Jahre, sechzehnhundert Schreibvorgänge pro Sekunde. Hinweis — ein Crawler ist durch die Bandbreite, nicht die CPU, limitiert.
· Die Schleife: nimm eine URL aus der Warteschlange → abrufen → parsen → neue Links extrahieren → zurück in die Warteschlange. Eine URL ist von unzähligen Seiten verlinkt; überspringe die Duplikaterkennung und du schleifst für immer, verbrauchst Bandbreite.
· Der Bloom-Filter (der Star): "habe ich diese URL gesehen?" Ein exakter Satz speichert jeden URL-String — 106 MB für eine Million URLs, zig GB bei einer Milliarde, passt nicht in den RAM. Ein Bloom-Filter verwendet ein festes 1,2 MB Bit-Array und sieben Hashes; die Antwort ist immer nur "definitiv neu" oder "wahrscheinlich gesehen." Es sind etwa neunundachtzigmal weniger Speicher erforderlich, bei einem Preis von ~0,96% falsch-positiven Rate — aber die falsch-negativen Rate ist immer null, sodass er niemals eine gesehene URL erneut crawlt. Wie: k Hashes mappen auf k Bits; jedes Bit 0 bedeutet definitiv neu, alle 1 bedeutet wahrscheinlich gesehen. Keine falsch-negativen, nur gelegentliche falsch-positive — die Asymmetrie, die ein Crawler will.
· URL-Frontier + Höflichkeit: echte Links sind verzerrt, ein Hub-Host macht sechzig Prozent davon aus. Ein naives FIFO trifft einen Host 136 der ersten 200 Abrufe (zehn hintereinander) — nicht von einem DoS zu unterscheiden, IP gesperrt. Eine höfliche Frontier round-robin pro Host: maximal zehn Treffer, höchstens einer hintereinander. Die Frontier ist ein Höflichkeitsscheduler.
· Inhalts-Deduplizierung: derselbe Artikel erscheint unter vielen URLs (Sitzungs-IDs, ?print=1, Spiegel-Domains). Eine Inhalts-Signatur erkennt exakte Duplikate, SimHash erkennt Nah-Duplikate — und beseitigt Crawler-Fallen (unendliche Kalender).
Wie KI es bewegt: (1) Extraktion: ein regex/CSS-Scraper ist an die HTML-Struktur gebunden und bricht bei einem Redesign zusammen (Demo: regex 4/4 → 0/4), während ein LLM-Extractor aus der Bedeutung arbeitet und bei beiden Layouts 4/4 bleibt. (2) Der größere Punkt: der Crawl selbst ist das Trainingskorpus — Common Crawl hat fast jedes LLM gespeist. KI konsumiert sowohl die Ausgabe des Crawls als auch verbessert ihren Parser. Die ehrliche Anmerkung: KI verändert nicht die Frontier, die Bloom-Deduplizierung oder Höflichkeit — die Deduplizierung über eine Milliarde URLs bleibt die Aufgabe des Bloom-Filters, nicht des Modells. Du würdest niemals ein LLM fragen: "habe ich diese URL gesehen?"
Ein Crawler = Frontier + Bloom + Höflichkeit, erneut zusammengesetzt aus den Teilen früherer Episoden (Warteschlange, Deduplizierung, Cache, Shard). Alle vier Demos sind stdlib, real-run. Code + schriftliche Anleitung: github.com/vicenteliu/system-design-ai-era (übungen/web-crawler).
00:00 Entwickeln eines Web Crawlers
00:38 Schätzung · Bandbreite ist der Engpass
01:05 Die Crawl-Schleife · Deduplizierung oder für immer schleifen
01:38 Bloom-Filter · 89x weniger Speicher
02:30 Wie Bloom funktioniert · keine falsch-negativen
03:11 URL-Frontier · Höflichkeitsscheduling
04:00 Inhalts-Deduplizierung · SimHash
04:45 KI · LLM-Extraktion + Trainingsdaten
06:21 Die ehrliche Anmerkung · KI behält das Skelett
06:43 Die Fallen
07:29 Architekturkarte + Abschluss
—
Abgeleitet von donnemartin/system-design-primer (CC BY 4.0) — Form, nicht Text.
Leih mir mein Gehirn