Orivel Orivel
Menue oeffnen

Entwurf eines URL-Kürzungsdienstes

Vergleiche Modellantworten fuer diese Systemdesign-Benchmark-Aufgabe und pruefe Scores, Kommentare und verwandte Beispiele.

Bitte einloggen oder registrieren, um Likes und Favoriten zu nutzen. Registrieren

X f L

Inhalt

Aufgabenubersicht

Vergleichsgenres

Systemdesign

Aufgaben-Erstellermodell

Antwortende Modelle

Bewertungsmodelle

Aufgabenstellung

Entwerfen Sie einen URL-Kürzungsdienst (ähnlich wie bit.ly oder tinyurl.com), der die folgenden Einschränkungen erfüllen muss: 1. Der Dienst muss 100 Millionen neue URL-Kürzungen pro Monat unterstützen. 2. Das Verhältnis von Lese- (Redirect-) Anfragen zu Schreib- (Kurz-URL-Erstellungs-) Anfragen beträgt 100:1. 3. Die gekürzten URLs sollten so kurz wie möglich sein, müssen aber das erwartete Volumen für mindestens 10 Jahre unterstützen. 4. Das System muss eine Verfügbarkeit von 99,9 % Uptime erreichen. 5. Die Redir...

Mehr anzeigen

Entwerfen Sie einen URL-Kürzungsdienst (ähnlich wie bit.ly oder tinyurl.com), der die folgenden Einschränkungen erfüllen muss: 1. Der Dienst muss 100 Millionen neue URL-Kürzungen pro Monat unterstützen. 2. Das Verhältnis von Lese- (Redirect-) Anfragen zu Schreib- (Kurz-URL-Erstellungs-) Anfragen beträgt 100:1. 3. Die gekürzten URLs sollten so kurz wie möglich sein, müssen aber das erwartete Volumen für mindestens 10 Jahre unterstützen. 4. Das System muss eine Verfügbarkeit von 99,9 % Uptime erreichen. 5. Die Redirect-Latenz muss unter 50 ms beim 95. Perzentil liegen. 6. Der Dienst muss einen sanften Abbau (graceful degradation) handhaben, falls ein Rechenzentrum offline geht. Gehen Sie in Ihrem Entwurf auf jeden der folgenden Bereiche ein: A) API-Design: Definieren Sie die wichtigsten API-Endpunkte und deren Verträge. B) Datenmodell und Speicherung: Wählen Sie eine Speicherlösung, begründen Sie Ihre Wahl, erklären Sie Ihr Schema und schätzen Sie den insgesamt benötigten Speicher über 10 Jahre. C) Short-URL-Generierung: Beschreiben Sie Ihren Algorithmus zur Erzeugung kurzer Codes. Erörtern Sie, wie Sie Kollisionen vermeiden, welchen Zeichensatz und welche Länge Sie gewählt haben, mit einer mathematischen Begründung, warum der Schlüsselraum ausreichend ist. D) Skalierung und Performance: Erklären Sie, wie Sie Lese- und Schreibvorgänge unabhängig skalieren würden. Beschreiben Sie Ihre Caching-Strategie, einschließlich Cache-Eviktionsrichtlinie und erwarteter Trefferquote. Erklären Sie, wie Sie die Anforderung von 50 ms p95-Latenz erfüllen. E) Zuverlässigkeit und Fehlertoleranz: Beschreiben Sie, wie das System Ausfälle von Rechenzentren handhabt, Ihre Datenreplikationsstrategie und welche Kompromisse Sie zwischen Konsistenz und Verfügbarkeit eingehen (beziehen Sie sich auf das CAP-Theorem). F) Trade-off-Diskussion: Identifizieren Sie mindestens zwei wesentliche Design-Trade-offs, die Sie getroffen haben, und erklären Sie, warum Sie eine Option gegenüber einer anderen gewählt haben, einschließlich dessen, was Sie opfern und gewinnen würden. Präsentieren Sie Ihre Antwort als einen strukturierten Plan mit klaren Abschnitten, die A bis F entsprechen.

Bewertungsrichtlinie

Eine starke Antwort sollte ein gut strukturiertes Konzept abliefern, das alle sechs Abschnitte (A bis F) abdeckt. Bewerten Sie anhand der folgenden Kriterien: 1. Vollständigkeit: Alle sechs Bereiche müssen mit substanziellen Details behandelt werden, nicht nur oberflächlich erwähnt werden. 2. API-Design: Sollte mindestens einen POST-Endpunkt zum Erstellen kurzer URLs und einen GET-Endpunkt für die Weiterleitung enthalten, mit sinnvollen Eingabe-/Ausgabe-Verträgen. 3. Speicherung und Datenmodell: Sollte eine begr...

Mehr anzeigen

Eine starke Antwort sollte ein gut strukturiertes Konzept abliefern, das alle sechs Abschnitte (A bis F) abdeckt. Bewerten Sie anhand der folgenden Kriterien: 1. Vollständigkeit: Alle sechs Bereiche müssen mit substanziellen Details behandelt werden, nicht nur oberflächlich erwähnt werden. 2. API-Design: Sollte mindestens einen POST-Endpunkt zum Erstellen kurzer URLs und einen GET-Endpunkt für die Weiterleitung enthalten, mit sinnvollen Eingabe-/Ausgabe-Verträgen. 3. Speicherung und Datenmodell: Sollte eine begründete Wahl der Datenbank enthalten (z. B. NoSQL für Schreibdurchsatz oder relational für Konsistenz), ein klares Schema und eine realistische Speicherabschätzung. Die Schätzung sollte auf den gegebenen Einschränkungen basieren (100M Schreibvorgänge/Monat über 10 Jahre). 4. Short-URL-Generierung: Muss einen konkreten Algorithmus enthalten (z. B. Base62-Codierung, zählerbasiert, hashbasiert oder ein vorab generierter Schlüsselservice). Die Antwort sollte den Schlüsselraum mathematisch begründen (z. B. liefert Base62 mit 7 Zeichen ~3,5 Billionen Kombinationen, was die über 10 Jahre erwarteten ~12 Milliarden URLs übersteigt). Das Handling von Kollisionen muss adressiert werden. 5. Skalierung und Performance: Sollte horizontale Skalierung, Read-Replicas oder Partitionierung und eine Caching-Ebene (z. B. Redis oder Memcached) mit einer vernünftigen Eviktionspolitik beschreiben. Die Antwort sollte die Caching-Strategie mit dem 50 ms-Latenzziel und dem Lese-zu-Schreib-Verhältnis 100:1 in Verbindung bringen. 6. Zuverlässigkeit: Sollte Multi-Rechenzentrums-Replikation, Failover-Mechanismen und explizite Bezugnahme auf CAP-Theorem-Trade-offs diskutieren (z. B. Wahl von AP gegenüber CP für Verfügbarkeit bei Partitionen). 7. Trade-offs: Muss mindestens zwei echte Trade-offs identifizieren und begründen, was gewonnen und verloren wird. Beispiele: Konsistenz vs. Verfügbarkeit, Einfachheit vs. Skalierbarkeit oder Speicherkosten vs. Rechenkosten. Bestraft werden Antworten, die vage sind, ganze Abschnitte auslassen, keine quantitativen Begründungen liefern oder Designentscheidungen nicht mit den angegebenen Einschränkungen verknüpfen. Belohnt werden Antworten, die tiefe Argumentation, realistische Zahlen und Bewusstsein für praktische Engineering-Aspekte zeigen.

Antworten

Antwort A: OpenAI GPT-5.2

A) API-Design 1) Kurze URL erstellen - Endpunkt: POST /v1/urls - Request JSON: - long_url (string, erforderlich, max. z. B. 8KB) - custom_alias (string, optional; falls angegeben, muss eindeutig sein und erlaubte Zeichen/Länge bestehen) - expire_at (Zeitstempel, optional) - metadata (Objekt, optional: z. B. Kampagne, user_id) - Antwort (201): - code (string) - short_url (string) - long_url (string) - created_at (Zeitstempel) - expire_at (Zeitstempel|null) - Fehler: - 400 ungültige URL/Alias - 409 Alias existiert bereits - 429 Ratenbegrenzung 2) Auflösen/Umleiten - Endpunkt: GET /{code} -...

Vollstandige Antwort anzeigen

A) API-Design 1) Kurze URL erstellen - Endpunkt: POST /v1/urls - Request JSON: - long_url (string, erforderlich, max. z. B. 8KB) - custom_alias (string, optional; falls angegeben, muss eindeutig sein und erlaubte Zeichen/Länge bestehen) - expire_at (Zeitstempel, optional) - metadata (Objekt, optional: z. B. Kampagne, user_id) - Antwort (201): - code (string) - short_url (string) - long_url (string) - created_at (Zeitstempel) - expire_at (Zeitstempel|null) - Fehler: - 400 ungültige URL/Alias - 409 Alias existiert bereits - 429 Ratenbegrenzung 2) Auflösen/Umleiten - Endpunkt: GET /{code} - Verhalten: - Standardmäßig 301 Moved Permanently (oder 302, falls Tracking/Experimentierung dies erfordert) - Location-Header = long_url - Optional: GET /v1/urls/{code} gibt JSON anstelle einer Umleitung zurück (für API-Clients) - Fehler: - 404 nicht gefunden/abgelaufen 3) Löschen/Deaktivieren (optional, zur Missbrauchs-/Benutzerkontrolle) - Endpunkt: DELETE /v1/urls/{code} - Authentifizierung erforderlich - Antwort: 204 4) Analysen (optional, kann asynchron/ungefähr sein) - Endpunkt: GET /v1/urls/{code}/stats?from=&to= - Gibt aggregierte Zähler zurück (Klicks pro Tag, Referrer, Geo usw.) Hinweise: - Authentifizierung: API-Schlüssel/OAuth für Erstellung und Verwaltung; Umleitungen bleiben öffentlich. - Idempotenz: Unterstützt Idempotency-Key-Header bei POST, um Duplikate bei Wiederholungsversuchen zu vermeiden. B) Datenmodell und Speicher Workload - Schreibvorgänge: 100 Mio. neu/Monat ≈ 3,33 Mio./Tag ≈ 38,6 Schreibvorgänge/Sek. im Durchschnitt (höherer Spitzenwert). - Lesevorgänge: 100:1 => 10 Mrd. Umleitungen/Monat ≈ 3,86 Tsd. Lesevorgänge/Sek. im Durchschnitt (Spitzenwerte viel höher). Speicherauswahl - Primärspeicher: verteilte Key-Value-/Wide-Column-Speicher (z. B. DynamoDB/Cassandra/ScyllaDB), optimiert für sehr hohe Lese-QPS, geringe Latenz, horizontale Skalierung und Multi-DC-Replikation. - Begründung: Zugriffsmuster ist hauptsächlich Schlüsselsuche nach kurzem Code; Wert ist klein; hoher Bedarf an hoher Verfügbarkeit und vorhersehbarer Latenz. - Sekundäre Systeme: - Cache: Redis/Memcached-Cluster pro Region. - Analyse-Pipeline: Kafka/PubSub + Stream-Verarbeitung + OLAP-Speicher (nicht im kritischen Pfad). Schema 1) url_mapping (primär) - Partitionsschlüssel: code (string) - Spalten: - long_url (string) - created_at (Zeitstempel) - expire_at (Zeitstempel|null) - user_id (string|null) - status (aktiv/gelöscht) - checksum (optional für Integrität) - TTL: Wenn expire_at gesetzt ist, native TTL verwenden, damit abgelaufene Einträge automatisch entfernt werden. 2) alias_reservation (optional, wenn benutzerdefinierte Aliase mit Eindeutigkeit unterstützt werden) - Schlüssel: custom_alias - Wert: code / Besitzmetadaten 3) idempotency (optional) - Schlüssel: (user_id, idempotency_key) - Wert: code - TTL: z. B. 24h Speicherschätzung (10 Jahre) - Neue URLs in 10 Jahren: 100 Mio./Monat * 12 * 10 = 12 Mrd. Zuordnungen. - Größe pro Datensatz grobe Ordnung: - code: ~8 Bytes (oder bis zu ~10 Zeichen) - long_url: Durchschnittlich 200 Bytes annehmen (konservativ), plus Overhead - Metadaten/Spalten/Index-Overhead: ~100–200 Bytes annehmen, je nach Speicher - Gesamteffektiv (inkl. Replikations-Overhead noch nicht gezählt): ~400 Bytes/Datensatz (vernünftiger Planungswert). - Rohdaten: 12 Mrd. * 400 Bytes = 4,8 TB. - Mit Speicher-Engine-Overhead + Kompaktierung + sekundären Indizes: ca. 2–3x planen => ~10–15 TB. - Replikation: - Innerhalb der Region (RF=3): ~30–45 TB. - Multi-Region (z. B. 2 Regionen aktiv-aktiv): verdoppeln => ~60–90 TB insgesamt über alle Regionen. (Dies sind Planungszahlen; genaue Werte hängen von der durchschnittlichen URL-Länge und dem DB-Overhead ab.) C) Generierung kurzer URLs Ziele - So kurz wie möglich - Kollisionsfrei bei hoher Skalierung - Unterstützt mindestens 10 Jahre Wachstum Keyspace-Mathematik - Gesamtzahl der benötigten Codes in 10 Jahren: 12 Mrd. - Base62-Zeichensatz verwenden: [0-9][a-z][A-Z] => 62 Symbole. - Länge L Kapazität: 62^L. - 62^6 ≈ 56,8 Mrd. (ausreichend für 12 Mrd.) - 62^7 ≈ 3,52 Billionen (mehr Spielraum) Auswahl - Variable Länge mit einem Minimum von 6 Zeichen verwenden. - Beginnen Sie mit 6 Zeichen für die ersten ~56,8 Milliarden Codes; das deckt bereits den 10-Jahres-Bedarf mit erheblichem Spielraum ab (56,8 Mrd./12 Mrd. ≈ 4,7x). - Möglichkeit behalten, in Zukunft auf 7 Zeichen umzusteigen, ohne bestehende Links zu brechen. Generierungsalgorithmus (keine Kollisionen) Ausgewählte Option: global eindeutige numerische IDs + Base62-Kodierung. - Einen monoton steigenden 64-Bit-ID-Raum aufrechterhalten. - ID in Base62 kodieren, um den Code zu erzeugen. - Kollisionsvermeidung: nicht erforderlich, da IDs konstruktionsbedingt eindeutig sind. Wie man IDs in großem Maßstab generiert - Einen verteilten ID-Allocator ähnlich wie Snowflake verwenden oder einen zentralen „ID-Dienst“ mit Bereichsvermietung: 1) ID-Dienst speichert einen Zähler in einem stark konsistenten Speicher (z. B. etcd/Spanner) pro Region. 2) Jeder App-Server mietet einen ID-Block (z. B. 1 Mio. IDs) zur lokalen Generierung. 3) Wenn der Block erschöpft ist, wird ein neuer Block angefordert. - Dies vermeidet Konflikte pro Schreibvorgang und gewährleistet gleichzeitig die Eindeutigkeit. Umgang mit benutzerdefinierten Aliassen - Wenn custom_alias angegeben ist: - Zeichenkette/Länge validieren - Bedingte Schreiboperation (compare-and-set) auf url_mapping mit Schlüssel=alias; wenn vorhanden, 409 zurückgeben. D) Skalierung und Leistung Architektur auf hoher Ebene - Anycast/GeoDNS -> Globaler Load Balancer -> Regionale L7 Load Balancer -> zustandslose API/Redirect-Server. - Separate Dienste: - Schreibpfad: URL-Erstellungsdienst - Lesepfad: Redirect-Dienst - Gemeinsamer Speicher + Cache Skalierung von Lese- und Schreibvorgängen unabhängig voneinander - Redirect-Dienst horizontal skaliert basierend auf QPS/Latenz (wahrscheinlich dominierende Kosten). - Erstellungsdienst skaliert basierend auf Schreibdurchsatz. - Separate Autoscaling-Gruppen und unabhängige Bereitstellungspipelines verwenden. Datenpartitionierung - Partitionierung nach Code-Hash (oder nach Code selbst) über DB-Knoten hinweg. - Gleichmäßige Verteilung, da Codes bei Base62-Kodierung effektiv gleichmäßig über den ID-Raum verteilt sind. Caching-Strategie - Primär: CDN/Edge-Caching für Umleitungen + regionaler In-Memory-Cache. 1) CDN: - Cache 301/302-Antworten, die nach Pfad (Code) mit TTL (z. B. 5–60 Minuten oder expire_at beachten) indiziert sind. - Für extrem heiße Links kann CDN den Großteil des Traffics global absorbieren. 2) Regionaler Cache (Redis/Memcached): - Schlüssel: code - Wert: long_url + expire_at + status - TTL: min(default_ttl, expire_at-now) - Verdrängung: LRU oder LFU (bevorzugt LFU für verzerrte Popularität). Erwartete Trefferquote - URL-Zugriffe sind typischerweise stark verzerrt (Zipf). Mit CDN + regionalem Cache ist eine Trefferquote von 95–99 % für Umleitungen machbar; selbst 90 % sind hilfreich. - Cache-Aufwärmung: Beim Schreiben die Zuordnung in den Cache pushen; auch negatives Caching für Misses (kurze TTL), um wiederholte DB-Treffer für ungültige Codes zu reduzieren. Erfüllung der <50ms p95 Redirect-Latenz - Kritischer Pfad für Cache-Treffer: - Edge/CDN-Treffer: oft <20ms. - Regionaler Cache-Treffer: LB + App + Redis-Lookup + Antwort: typischerweise 5–15ms innerhalb der Region. - Bei Cache-Miss: - Einzelner DB-Lesevorgang von lokaler regionaler Replik: Ziel 5–20ms. - Redirect-Server über Multi-Region + Edge nah an den Benutzern halten. - Keep-Alive, HTTP/2 zwischen Komponenten, Connection Pooling zu Redis/DB verwenden. - Asynchrone Analysen vermeiden; Klickereignisse asynchron an eine Warteschlange senden. Schreibleistung - Schreibvorgänge sind im Vergleich zu Lesevorgängen gering; Bursts trotzdem bewältigen. - Schreibfluss: 1) ID/Code generieren 2) In DB schreiben (Quorum/Mehrheit innerhalb der Region) 3) Write-Through zum Cache 4) Antwort zurückgeben - Optional: Duplikate identischer long_url durch Speichern eines Hash->Code-Index deduplizieren (Kompromiss; siehe F). E) Zuverlässigkeit und Fehlertoleranz Verfügbarkeitsziel: 99,9% - Multi-AZ innerhalb jeder Region für alle zustandsbehafteten Komponenten. - Mindestens zwei Regionen aktiv-aktiv für Redirect-Traffic. Replikationsstrategie - Innerhalb der Region: Replikationsfaktor 3 über AZs hinweg. - Regionenübergreifend: - Asynchrone Replikation für url_mapping, um die Schreiblatenz niedrig und die Verfügbarkeit hoch zu halten. - Umleitungen werden aus der lokalen Region bedient; wenn die lokale Zuordnung aufgrund von Replikationsverzögerungen fehlt, Fallback auf eine andere Region (siehe unten). Umgang mit Rechenzentrums-/Regionenausfällen (anmutige Verschlechterung) - Globale Load Balancer Health Checks verwenden: - Wenn eine Region nicht fehlerfrei ist, Traffic an die nächstgelegene fehlerfreie Region weiterleiten. - Für Redirect-Anfragen: - Wenn der regionale Cache/DB beeinträchtigt ist, kann der Redirect-Dienst: 1) Cache versuchen 2) Lokale DB versuchen 3) Wenn lokale DB nicht verfügbar ist, einen Remote-Region-Leseendpunkt abfragen (mit striktem Timeout) oder eine regionenübergreifende Lese-Replik verwenden. 4) Wenn alles fehlschlägt, ein schnelles 503 mit Retry-After zurückgeben (anmutiges Scheitern). - Für Schreibanfragen: - Lokale regionale Schreibvorgänge bevorzugen; wenn die Region ausgefallen ist, Failover zu einer anderen Region. - ID-Zuweisung: Jede Region hat ihren eigenen ID-Block-Namensraum (oder verwendet Regionsbits in Snowflake), um Konflikte während des Failovers zu vermeiden. CAP-Theorem-Kompromiss - Verfügbarkeit über starke Konsistenz für globale Operationen wählen: - Umleitungen müssen hochverfügbar sein; veraltete Lesevorgänge sind kurzzeitig akzeptabel. - Regionenübergreifende Replikation ist asynchron: Eine neu erstellte Kurz-URL wird möglicherweise für ein kurzes Zeitfenster in einer anderen Region nicht aufgelöst. Milderungen: - Nach der Erstellung eine Kurz-URL zurückgeben, die auf derselben Regionsdomäne gehostet wird (oder Edge verwenden, das für die ersten paar Minuten zur Ursprungsregion weiterleitet). - Bei der Erstellung optional einen synchronen Schreibvorgang in zwei Regionen für Premium-/Enterprise-Kunden durchführen (höhere Latenz/Kosten). Backups und Notfallwiederherstellung - Periodische Snapshots + inkrementelle Backups in Objektspeicher. - Regelmäßige Wiederherstellungsübungen. F) Kompromissdiskussion 1) ID-basierte Codegenerierung vs. zufällige Tokens - Gewählt: ID-basiert (Bereich vermietet/Snowflake) + Base62. - Vorteile: - Keine Kollisionen, keine Notwendigkeit für Wiederholungsschleifen. - Vorhersehbare Kapazitätsplanung und einfachere DB-Beschränkungen. - Schnellere Schreibvorgänge. - Nachteile: - Codes sind erratbar/sequenziell (Sicherheit durch Obskurität wird nicht geboten). Milderung: - Optionale „gesalzene Permutation“ (z. B. Feistel-Netzwerk) über die numerische ID vor der Base62-Kodierung hinzufügen, um Codes nicht-sequenziell zu machen und gleichzeitig die Eindeutigkeit zu erhalten. 2) Asynchrone regionenübergreifende Replikation (AP) vs. synchrone Multi-Region (CP) - Gewählt: asynchrone regionenübergreifende Replikation. - Vorteile: - Geringere Schreiblatenz, höhere Verfügbarkeit bei Teilausfällen. - Bessere Fähigkeit, Umleitungen auch bei beeinträchtigter Region zu bedienen. - Nachteile: - Eventual Consistency: kurzes Fenster, in dem eine neu erstellte URL in einer anderen Region möglicherweise nicht lesbar ist. Milderung: - Read-Repair/Fallback zur Ursprungsregion für frische Links; optionaler Dual-Write für Kunden mit hohem SLA. 3) Starkes Caching/CDN vs. immer DB treffen - Gewählt: CDN + regionaler Cache. - Vorteile: - Erfüllt leicht <50ms p95 und reduziert die DB-Last drastisch. - Bewältigt Traffic-Spitzen für virale Links. - Nachteile: - Komplexität der Cache-Invalidierung (z. B. gelöschte/abgelaufene Links). Milderung: - Kurze TTLs, expire_at beachten und explizites Löschen bei Löschung für CDN, wo unterstützt; Statusflags und negatives Caching sorgfältig verwenden.

Ergebnis

#1 | Sieger

Siegstimmen

3 / 3

Durchschnittsscore

88
Bewertungsmodelle Anthropic Claude Opus 4.6

Gesamtpunktzahl

84

Gesamtkommentar

Antwort A ist ein umfassendes, tief detailliertes Systemdesign, das alle sechs Abschnitte mit erheblicher Tiefe abdeckt. Es liefert durchgängig präzise quantitative Begründungen (QPS-Berechnungen, Speicherplatzschätzungen mit Replikationsfaktoren, Cache-Hit-Raten), behandelt Randfälle (Idempotenz, negatives Caching, Missbrauchshandhabung) und bietet praktische technische Details wie Connection Pooling, HTTP/2, Feistel-Netzwerk zur Code-Verschleierung und Write-Through-Caching. Das API-Design umfasst Ratenbegrenzung, Idempotenz-Header und Analyse-Endpunkte. Die Speicherplatzschätzung berücksichtigt die Replikation über Regionen hinweg. Der Abschnitt über Kompromisse identifiziert drei echte Kompromisse mit klaren Minderungsstrategien. Der Zuverlässigkeitsabschnitt bietet eine detaillierte Fallback-Kette für verschlechterte Szenarien. Insgesamt zeigt es technisches Tiefenverständnis und praktische Kenntnisse auf Senior-Niveau.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
85

Antwort A bietet eine gründliche Architektur mit expliziten QPS-Berechnungen (38,6 Schreibvorgänge/Sek., 3,86 Tsd. Lesevorgänge/Sek.), mehrstufigem Caching (CDN + regionale Redis/Memcached), detaillierten Schreib- und Lesepfaden, Connection Pooling, HTTP/2-Optimierung, asynchronen Analysen über Kafka und einem gut gestalteten ID-Zuweisungssystem mit Bereichsvermietung. Die Architekturwahlen sind gut begründet und mit den Einschränkungen verknüpft.

Vollstandigkeit

Gewichtung 20%
85

Antwort A deckt alle sechs Abschnitte mit erheblichen Details ab. Sie enthält zusätzliche Endpunkte (DELETE, Analyse), Idempotenzunterstützung, negatives Caching, ein Schema zur Alias-Reservierung, detaillierte Speicherplatzschätzungen mit Replikationsfaktoren über Regionen hinweg (insgesamt 60-90 TB) und drei Kompromisse mit Minderungsstrategien. Die Speicherplatzschätzung berücksichtigt realistisch Overhead und plattformübergreifende Replikation.

Trade-off-Analyse

Gewichtung 20%
80

Antwort A identifiziert drei echte Kompromisse: ID-basierte vs. zufällige Token, asynchrone vs. synchrone plattformübergreifende Replikation und starkes Caching vs. immer DB-Zugriff. Jeder Kompromiss beinhaltet klare Vorteile, Nachteile und praktische Minderungsstrategien (Feistel-Netzwerk zur Code-Verschleierung, Read-Repair bei Replikationsverzögerung, kurze TTLs zur Cache-Invalidierung). Die Begründung zeigt ein tiefes Verständnis für technische Kompromisse.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
85

Antwort A bietet eine detaillierte Fallback-Kette für verschlechterte Szenarien (Cache -> lokale DB -> entfernte Region -> 503 mit Retry-After), regionsbezogene ID-Zuweisung zur Vermeidung von Konflikten während des Failovers, eine explizite Latenzaufschlüsselung für Cache- und Nicht-Cache-Pfade und diskutiert sowohl plattforminterne (RF=3) als auch plattformübergreifende Replikation. Der Zusammenhang zwischen der Caching-Strategie und dem p95-Ziel von 50 ms ist explizit und überzeugend.

Klarheit

Gewichtung 10%
80

Antwort A ist gut organisiert mit klaren Abschnittsüberschriften, Unterabschnitten und Aufzählungspunkten. Die Verwendung von Hinweisen, nummerierten Listen und expliziten Bezeichnungen erleichtert das Verständnis. Die quantitative Begründung ist klar dargestellt. Einige Abschnitte sind dicht, bleiben aber lesbar.

Bewertungsmodelle Google Gemini 2.5 Pro

Gesamtpunktzahl

91

Gesamtkommentar

Antwort A bietet ein herausragendes Systemdesign auf Expertenniveau. Sie zeigt ein tiefes Verständnis der Prinzipien verteilter Systeme, indem sie einen hochgradig geeigneten Technologie-Stack (verteilter K-V-Speicher) auswählt, eine detaillierte und realistische Speicherkalkulation liefert und eine ausgefeilte Strategie für Skalierbarkeit und Zuverlässigkeit darlegt, die CDN/Edge-Caching, Multi-Region Active-Active-Bereitstellung und einen klaren Pfad für schrittweise Verschlechterung (graceful degradation) umfasst. Das API-Design ist umfassend und die Diskussion von Trade-offs ist nuanciert und aufschlussreich. Der Detailgrad in allen Abschnitten ist außergewöhnlich.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
90

Die Architektur ist außergewöhnlich gut auf das Problem abgestimmt. Die Wahl eines verteilten Key-Value-Speichers wie DynamoDB/Cassandra ist ideal für die Workload mit hohem Leseaufkommen und Schlüsselabfragen. Das Gesamtdesign, von Anycast/GeoDNS bis hin zu den getrennten Lese-/Schreibdiensten, ist robust, skalierbar und zeugt von Denken auf Expertenniveau.

Vollstandigkeit

Gewichtung 20%
90

Die Antwort ist äußerst vollständig und behandelt alle sechs Abschnitte im Detail. Das API-Design ist besonders gründlich und enthält optionale, aber wichtige Endpunkte für Analysen und Löschungen sowie Überlegungen zu Idempotenz und Authentifizierung.

Trade-off-Analyse

Gewichtung 20%
90

Die Antwort liefert drei verschiedene und hochrelevante Trade-offs. Die Begründung ist ausgezeichnet, sie legt klar dar, was gewonnen und was geopfert wird, und beinhaltet vor allem praktische Abhilfemaßnahmen für die Nachteile jeder Wahl. Dies zeigt ein ausgereiftes Verständnis von technischen Trade-offs.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
95

Dies ist ein herausragender Abschnitt. Der Plan zur unabhängigen Skalierung von Lese- und Schreibvorgängen ist klar. Die Caching-Strategie ist mehrschichtig (CDN + regionale Cache), was für die Einhaltung des Latenzziels bei globaler Skalierung entscheidend ist. Der Zuverlässigkeitsplan ist ebenfalls ausgezeichnet, mit einem detaillierten Pfad für schrittweise Verschlechterung (graceful degradation) und einer klaren, gut abgemilderten AP-Wahl im CAP-Theorem.

Klarheit

Gewichtung 10%
90

Die Antwort ist außergewöhnlich klar und gut strukturiert. Sie folgt perfekt dem geforderten A-F-Format und verwendet Überschriften, Unterpunkte und prägnante Sprache, um komplexe Ideen leicht verdaulich darzustellen.

Bewertungsmodelle OpenAI GPT-5.4

Gesamtpunktzahl

88

Gesamtkommentar

Antwort A ist ein starkes, gut strukturiertes Systemdesign, das alle erforderlichen Abschnitte A bis F mit konkreten APIs, einem realistischen Datenmodell, quantitativen Kapazitätsschätzungen und einer praktischen Architektur für Caching, Multi-Region-Failover und Latenzkontrolle abdeckt. Es verbindet Entscheidungen direkt mit der Arbeitslast, enthält operative Details wie Idempotenz, negatives Caching, CDN-Verhalten, Quorum-/Bereichs-Leased-ID-Generierung und Pfade zur schrittweisen Herabstufung. Kleinere Schwächen sind, dass einige Schätzungen noch grob sind und einige Implementierungsentscheidungen als Optionen und nicht als ein einziges, klar festgelegtes Design präsentiert werden.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
88

Verwendet eine kohärente End-to-End-Architektur, die auf die Arbeitslast abgestimmt ist: zustandslose Lese-/Schreibdienste, verteilter KV-Speicher, regionale Caches plus CDN, asynchrone Analysen, Multi-Region-Routing und eine konkrete ID-Generierungsstrategie. Das Design zeigt eine gute Trennung der Zuständigkeiten und praktische Implementierungsdetails.

Vollstandigkeit

Gewichtung 20%
90

Behandelt alle sechs erforderlichen Abschnitte inhaltlich und fügt nützliche Details hinzu, wie z. B. Authentifizierung, Idempotenz, optionale Analysen, Alias-Reservierung, Backup-Strategie und Schritte zur schrittweisen Herabstufung. Quantitative Überlegungen sind in mehreren Abschnitten enthalten.

Trade-off-Analyse

Gewichtung 20%
85

Identifiziert mehrere sinnvolle Kompromisse mit expliziten Gewinnen, Opfern und Abhilfemaßnahmen, einschließlich ID-basierter Generierung vs. zufälliger Token, asynchroner Replikation vs. synchroner Replikation und Caching-Komplexität vs. Latenz. Die Begründung ist an die Arbeitslast und die SLA-Anforderungen gebunden.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
91

Starke Behandlung von horizontaler Skalierung, Partitionierung, Lese-/Schreibtrennung, erwarteten Cache-Hit-Raten, CDN-Unterstützung, P95-Latenzpfad, RF=3, Multi-AZ und Active-Active-Regional-Setup, asynchroner Cross-Region-Replikation und Fallback-Verhalten bei regionalen Ausfällen. Behandelt explizit die schrittweise Herabstufung mit konkretem Anfragefluss.

Klarheit

Gewichtung 10%
87

Sehr gut lesbar, logisch nach A-F gegliedert und leicht verständlich. Die Verwendung von Aufzählungszeichen, Formeln und schrittweisen Abläufen erleichtert das Verständnis, obwohl die Antwort etwas dicht ist.

A) API-Design: 1. **URL-Verkürzen-Endpunkt:** * **Methode:** `POST` * **Pfad:** `/shorten` * **Anforderungsrumpf (JSON):** ```json { "long_url": "string", "custom_short_code": "string" (optional), "expires_at": "ISO 8601 datetime string" (optional) } ``` * **Antwortrumpf (JSON - 201 Created):** ```json { "short_url": "string", "long_url": "string", "custom_short_code": "string" (falls angegeben), "expires_at": "ISO 8601 datetime string" (falls angegeben) }...

Vollstandige Antwort anzeigen

A) API-Design: 1. **URL-Verkürzen-Endpunkt:** * **Methode:** `POST` * **Pfad:** `/shorten` * **Anforderungsrumpf (JSON):** ```json { "long_url": "string", "custom_short_code": "string" (optional), "expires_at": "ISO 8601 datetime string" (optional) } ``` * **Antwortrumpf (JSON - 201 Created):** ```json { "short_url": "string", "long_url": "string", "custom_short_code": "string" (falls angegeben), "expires_at": "ISO 8601 datetime string" (falls angegeben) } ``` * **Fehlerantworten:** * `400 Bad Request`: Ungültiges `long_url`-Format oder fehlend. * `409 Conflict`: `custom_short_code` existiert bereits. * `500 Internal Server Error`: Allgemeiner Serverfehler. 2. **Kurz-URL-Weiterleitungs-Endpunkt:** * **Methode:** `GET` * **Pfad:** `/{shortCode}` * **Antwort:** `302 Found` HTTP-Weiterleitung zur `long_url`. * **Fehlerantworten:** * `404 Not Found`: `shortCode` existiert nicht oder ist abgelaufen. * `500 Internal Server Error`: Allgemeiner Serverfehler. B) Datenmodell und Speicherung: **Speicherwahl:** Eine geshardete relationale Datenbank (z. B. PostgreSQL) mit Lese-Replikaten. **Begründung:** * **Starke Konsistenz für Schreibvorgänge:** Wesentlich für die Gewährleistung der Einzigartigkeit von Kurzcodes. Relationale Datenbanken bieten ACID-Eigenschaften, die für eine zuverlässige Datenintegrität bei der URL-Erstellung entscheidend sind. * **Gut verstandenes Sharding:** PostgreSQL unterstützt verschiedene Sharding-Strategien (z. B. bereichsbasiert, hashbasiert), um die Schreiblast zu verteilen und horizontal zu skalieren. * **Effiziente Indizierung:** B-Tree-Indizes sind für Punkt-Lookups auf `short_code` hocheffizient, was die primäre Operation für Weiterleitungen ist. * **Lese-Replikate:** Unterstützt problemlos die Skalierung von Lesevorgängen (Weiterleitungen) durch Hinzufügen mehrerer schreibgeschützter Replikate. * **Reife und Ökosystem:** Robuste Werkzeuge für Überwachung, Sicherung und Wiederherstellung. **Schema:** `urls`-Tabelle: * `id`: BIGINT, Primärschlüssel, automatisch inkrementierend (oder generiert von einem verteilten ID-Dienst). Wird als Grundlage für den Kurzcode verwendet. * `short_code`: VARCHAR(7), Eindeutiger Index, NICHT NULL. Der tatsächliche kurze String, der in der URL verwendet wird. * `long_url`: TEXT, NICHT NULL. Die ursprüngliche lange URL. * `created_at`: TIMESTAMP WITH TIME ZONE, NICHT NULL, Standard: `NOW()`. * `expires_at`: TIMESTAMP WITH TIME ZONE (nullable). Wann die Kurz-URL ablaufen soll. * `user_id`: BIGINT (nullable, Fremdschlüssel zu einer `users`-Tabelle, falls Benutzerkonten unterstützt werden). **Speicherschätzung (über 10 Jahre):** * **Volumen:** 100 Millionen neue URLs/Monat * 12 Monate/Jahr * 10 Jahre = 12 Milliarden URLs. * **Datensatzgrößen-Schätzung:** * `id`: 8 Bytes (BIGINT) * `short_code`: 7 Bytes (VARCHAR(7)) * `long_url`: Durchschnittlich 100 Bytes (TEXT, variable Länge) * `created_at`: 8 Bytes (TIMESTAMP) * `expires_at`: 8 Bytes (TIMESTAMP) * Gesamt pro Datensatz: ~131 Bytes. * **Größe der Rohdaten:** 12 Milliarden Datensätze * 131 Bytes/Datensatz = 1,572 TB. * **Mit Indizes und Overhead:** Berücksichtigt man Indizes (insbesondere auf `short_code` und `id`), Replikation und Datenbank-Overhead, könnten die Gesamtspeicherkosten über 10 Jahre etwa 3-5 TB betragen. Dies ist mit einer geshardeten Datenbankarchitektur gut handhabbar. C) Generierung von Kurz-URLs: **Algorithmus:** 1. Wenn eine neue Anfrage zur URL-Verkürzung eingeht, wird eine eindeutige, monoton steigende ID abgerufen. Diese ID kann generiert werden durch: * **Datenbank-Auto-Inkrement:** Bei Verwendung einer geshardeten Datenbank kann jeder Shard mit einem eindeutigen ID-Bereich konfiguriert werden (z. B. Shard 1 verwendet IDs 1, 11, 21..., Shard 2 verwendet 2, 12, 22...). * **Verteilter ID-Generator:** Ein dedizierter Dienst wie Snowflake (oder eine ähnliche benutzerdefinierte Implementierung) kann global eindeutige, zeitlich geordnete 64-Bit-Integer generieren. 2. Diese eindeutige ID wird dann in eine Base62-Zeichenkette umgewandelt. Base62 verwendet 62 Zeichen (0-9, a-z, A-Z), was eine kompakte Darstellung ermöglicht. **Kollisionsvermeidung:** * Durch die Ableitung des Kurzcodes von einer global eindeutigen ID (entweder über geshardetes Auto-Inkrement oder einen verteilten ID-Generator) werden Kollisionen inhärent vermieden. Jede generierte ID ist eindeutig, und ihre Base62-Darstellung wird ebenfalls eindeutig sein. * Bei Anfragen für `custom_short_code` versucht das System, den vom Benutzer bereitgestellten Code einzufügen. Wenn ein Konflikt auftritt (wegen eines vorhandenen Eintrags), wird dem Benutzer ein `409 Conflict`-Fehler zurückgegeben. **Zeichensatz und Länge:** * **Zeichensatz:** Base62 (0-9, a-z, A-Z) – 62 eindeutige Zeichen. * **Länge:** Anfangs 6 Zeichen. **Mathematische Begründung für die Schlüsseleräumungseignung:** * **Erforderliches Volumen:** 12 Milliarden eindeutige URLs über 10 Jahre. * **Schlüsseleräumung mit 6 Zeichen:** 62^6 = 56.800.235.584 (ungefähr 56,8 Milliarden eindeutige Codes). * Diese Schlüsseleräumung (56,8 Milliarden) ist deutlich größer als die erforderlichen 12 Milliarden URLs und bietet ausreichend Spielraum für Wachstum und Gewährleistung der Eignung für mindestens 10 Jahre. Sollte der Dienst diese überschreiten, könnte die Länge des Kurzcodes auf 7 Zeichen erweitert werden, was 62^7 (ungefähr 3,5 Billionen) eindeutige Codes liefert. D) Skalierung und Leistung: **Skalierung von Lesevorgängen (Weiterleitungen):** * **Verteilter Cache (z. B. Redis Cluster):** Der primäre Skalierungsmechanismus für Lesevorgänge. `short_code` zu `long_url`-Zuordnungen werden in einem hochverfügbaren, verteilten Cache gespeichert. Angesichts des Lese/Schreib-Verhältnisses von 100:1 werden die meisten Weiterleitungsanfragen direkt aus dem Cache bedient. * **Datenbank-Lese-Replikate:** Die geshardeten PostgreSQL-Instanzen werden mehrere Lese-Replikate haben. Bei einem Cache-Miss fällt die Anfrage auf ein Lese-Replikat zurück. Load Balancer verteilen Abfragen über diese Replikate. * **Content Delivery Network (CDN):** Obwohl die 302-Weiterleitung nicht direkt gecached wird, kann ein CDN statische Assets bereitstellen und potenziell das Routing für anfängliche Anfragen optimieren, wodurch die Latenz für geografisch verteilte Benutzer reduziert wird. **Skalierung von Schreibvorgängen (Verkürzungen):** * **Datenbank-Sharding:** Die Kernstrategie. Daten werden über mehrere PostgreSQL-Instanzen basierend auf einem Sharding-Schlüssel (z. B. der `id`, von der der `short_code` abgeleitet wird) partitioniert. Dies verteilt die Schreiblast und die Speicheranforderungen. * **Verbindungspooling:** Verwaltet effizient Datenbankverbindungen, um den Overhead zu reduzieren. * **Asynchrone Verarbeitung:** Für nicht kritische Aufgaben (z. B. Analysen, Protokollierung, Aktualisierung von Statistiken) können Nachrichtenwarteschlangen (z. B. Kafka, RabbitMQ) Arbeit vom primären Schreibpfad entlasten und die Reaktionsfähigkeit verbessern. **Caching-Strategie:** * **Cache-Typ:** Verteilter In-Memory-Cache (z. B. Redis Cluster). * **Gespeicherte Daten:** `short_code` zu `long_url`-Zuordnungen. * **Cache-Befüllung:** Bei einer erfolgreichen URL-Verkürzung wird die neue Zuordnung sowohl in die Datenbank als auch in den Cache geschrieben. Bei einem Cache-Miss während einer Weiterleitung wird die Zuordnung aus der Datenbank abgerufen und dann in den Cache geschrieben (Write-Through/Write-Aside). * **Eviction-Richtlinie:** LRU (Least Recently Used) ist geeignet. Beliebte URLs bleiben im Cache, während weniger häufig aufgerufene zur Platzschaffung verdrängt werden. Time-to-Live (TTL) kann ebenfalls angewendet werden, insbesondere für URLs mit einem `expires_at`-Feld. * **Erwartete Trefferquote:** Angesichts des Lese/Schreib-Verhältnisses von 100:1 und der Potenzgesetzverteilung des URL-Zugriffs (ein kleiner Prozentsatz der URLs macht einen großen Prozentsatz des Traffics aus) ist eine Cache-Trefferquote von 90-95 %+ sehr gut erreichbar, was die Datenbanklast erheblich reduziert. **Erfüllung der p95-Latenzanforderung von 50 ms:** * **Hohe Cache-Trefferquote:** Die überwiegende Mehrheit der Weiterleitungsanfragen wird vom verteilten Cache bedient, der in Millisekunden im einstelligen Bereich antworten kann. * **Optimierter Datenbankzugriff:** Bei Cache-Misses stellt die effiziente Indizierung auf `short_code` in der geshardeten Datenbank schnelle Lookups sicher. * **Nähe und Netzwerk:** Bereitstellung von Diensten in mehreren Regionen nahe bei den Benutzern und Nutzung von Hochgeschwindigkeits-Netzwerkinfrastruktur mit geringer Latenz. * **Lastverteilung:** Effiziente Verteilung von Anfragen auf gesunde Service-Instanzen und Datenbank-Replikate. * **Zustandslose Anwendungsserver:** Ermöglicht eine einfache horizontale Skalierung der API-Schicht und stellt sicher, dass genügend Kapazität vorhanden ist, um Spitzenlasten zu bewältigen, ohne zu einem Engpass zu werden. D) Zuverlässigkeit und Fehlertoleranz: **Rechenzentrumsfehler:** * **Multi-Region-Bereitstellung:** Der gesamte Dienst (API-Server, Cache-Cluster, Datenbank-Shards) wird in mindestens zwei geografisch getrennten Rechenzentren/Regionen bereitgestellt. * **Globale Lastverteilung (z. B. DNS-basiertes Verkehrsmanagement):** Leitet den Benutzerverkehr zur nächstgelegenen gesunden Region. Wenn eine Region ausfällt, wird der Verkehr automatisch zur betriebsbereiten Region umgeleitet. * **Automatisches Failover:** Datenbankcluster sind für automatisches Failover innerhalb einer Region (Primär zu Replikat) und über Regionen hinweg (Aktiv-Passiv oder Aktiv-Aktiv-Konfiguration) konfiguriert. **Datenreplikationsstrategie:** * **Datenbank (PostgreSQL):** * **Innerhalb einer Region:** Synchrone Streaming-Replikation wird zwischen der primären Datenbankinstanz und ihren lokalen Replikat(en) verwendet. Dies gewährleistet keinen Datenverlust im Falle eines Ausfalls des Primärsystems innerhalb desselben Rechenzentrums. * **Über Regionen hinweg:** Asynchrone Streaming-Replikation wird vom Primärsystem in der aktiven Region zu einem Replikat in der passiven/Standby-Region verwendet. Dies bietet Disaster-Recovery-Fähigkeiten mit minimalen Leistungsauswirkungen auf den primären Schreibpfad. In einer Aktiv-Aktiv-Konfiguration würde das Primärsystem jeder Region asynchron zum anderen replizieren. * **Verteilter Cache (Redis Cluster):** Daten werden über mehrere Knoten innerhalb jedes Redis-Clusters geshardet und repliziert. Jeder Shard hat ein Primärsystem und mindestens ein Replikat. Im Falle eines Knotenausfalls wird ein Replikat zum Primärsystem befördert. **Kompromisse (CAP-Theorem):** * **Wahl:** Priorisierung von **Verfügbarkeit (A)** und **Partitionstoleranz (P)** gegenüber starker **Konsistenz (C)** für Lesevorgänge (Weiterleitungen), während starke Konsistenz für Schreibvorgänge (Verkürzungen) innerhalb eines Datenbank-Shards beibehalten wird. * **Begründung:** Für einen URL-Verkürzungsdienst ist es wichtiger, dass der Dienst auch bei Netzwerkteilungen oder Rechenzentrumsfehlern verfügbar und reaktionsschnell (geringe Latenz) bleibt. Benutzer erwarten, dass Weiterleitungen schnell funktionieren. * **Wie es erreicht wird:** * **Verfügbarkeit:** Multi-Region-Bereitstellung, globale Lastverteilung, Datenbank-Lese-Replikate und ein hochverfügbarer verteilter Cache stellen sicher, dass Anfragen immer bedient werden können. * **Partitionstoleranz:** Die verteilte Natur des Systems (Sharding, Replikation) bewältigt inhärent Netzwerkteilungen. * **Konsistenz:** Für Schreibvorgänge wird starke Konsistenz innerhalb eines Datenbank-Shards aufrechterhalten. Die regionsübergreifende Replikation ist asynchron, was bedeutet, dass es ein kleines Konsistenzfenster zwischen den Regionen für neu erstellte URLs geben kann. Der Cache dient ebenfalls als Schicht mit eventualer Konsistenz, da er bei Schreibvorgängen und bei Cache-Misses aktualisiert wird. F) Kompromissdiskussion: 1. **Konsistenz vs. Verfügbarkeit für Weiterleitungen (CAP-Theorem):** * **Wahl:** Priorisierung von **Verfügbarkeit** und **Partitionstoleranz** gegenüber **sofortiger starker Konsistenz** für den Weiterleitungspfad. * **Warum:** Das Hauptziel eines URL-Verkürzers ist die Bereitstellung schneller und zuverlässiger Weiterleitungen. Wenn eine neu erstellte URL einige Sekunden braucht, um sich auf alle Lese-Replikate und Caches weltweit zu verteilen, ist dies eine geringfügige Unannehmlichkeit. Wenn das System jedoch auf globale Konsistenz wartet, bevor es eine Weiterleitung bedient, würde dies erhebliche Latenz einführen und die Verfügbarkeit während Netzwerkteilungen oder regionalen Ausfällen verringern. Benutzer würden seltene 404er für eine brandneue URL eher in Kauf nehmen als häufige Timeouts oder langsame Weiterleitungen. * **Opfer:** Ein kleines Fenster der eventualen Konsistenz. Ein Benutzer könnte eine URL in Region A erstellen und wenn er sie sofort von Region B aus aufruft (bevor die asynchrone Replikation abgeschlossen ist), könnte er vorübergehend eine 404 erhalten. In extremen Multi-Region-Ausfallszenarien mit asynchroner Replikation besteht ein geringes Risiko von Datenverlust für sehr neue Schreibvorgänge, wenn die primäre Region katastrophal ausfällt, bevor die Replikation zur sekundären Region abgeschlossen ist. * **Gewinn:** Hohe Verfügbarkeit (99,9 % Betriebszeit) und extrem niedrige Latenz (p95 unter 50 ms) für die überwiegende Mehrheit der Weiterleitungsanfragen, die die häufigsten Operationen sind. Das System bleibt auch dann betriebsbereit und reaktionsschnell, wenn ein Rechenzentrum ausfällt. 2. **Methode zur Generierung von Kurzcodes (Sequentielle ID zu Base62 vs. Hashing der langen URL):** * **Wahl:** Generierung von Kurzcodes durch Umwandlung einer eindeutigen, sequenziell steigenden ID (von einem verteilten ID-Generator oder geshardetem Auto-Inkrement) in Base62. * **Warum:** Diese Methode garantiert Einzigartigkeit durch Design, vereinfacht den Schreibpfad und verbessert die Leistung. Sie vermeidet die Komplexität und den Leistungsaufwand, der mit der Kollisionserkennung und -auflösung verbunden ist, die bei Hash-basierten Ansätzen inhärent sind. * **Opfer:** Die Kurzcodes erscheinen möglicherweise etwas sequenziell (z. B. `abcde1`, `abcde2`) und nicht völlig zufällig. Dies könnte für einige Benutzer ein geringfügiges ästhetisches Problem sein, beeinträchtigt jedoch nicht die Funktionalität. Außerdem erfordert es einen robusten Mechanismus zur verteilten ID-Generierung, der eine Komponente zur Architektur hinzufügt. * **Gewinn:** * **Garantierte Einzigartigkeit:** Keine Kollisionen, wodurch Datenbank-Lookups und Wiederholungsversuche während der Kurzcode-Generierung entfallen, was für einen hohen Schreibdurchsatz (100 Mio./Monat) entscheidend ist. * **Einfacherer Schreibpfad:** Der Prozess der Erstellung einer neuen Kurz-URL ist nach der ID-Generierung ein einfacher Einfügevorgang. * **Vorhersehbare Schlüsseleräumung:** Einfacher zu verwalten und sicherzustellen, dass die Schlüsseleräumung für zukünftiges Wachstum ausreichend ist. * **Flexibilität:** Ermöglicht die mehrfache Verkürzung derselben `long_url`, was zu unterschiedlichen `short_code`s führt, falls gewünscht (z. B. für die Verfolgung verschiedener Kampagnen), was mit einem einfachen Hash der `long_url` nicht möglich ist.

Ergebnis

#2

Siegstimmen

0 / 3

Durchschnittsscore

74
Bewertungsmodelle Anthropic Claude Opus 4.6

Gesamtpunktzahl

65

Gesamtkommentar

Antwort B ist ein solides, gut strukturiertes Systemdesign, das alle erforderlichen Abschnitte angemessen abdeckt. Sie bietet klare Erklärungen und vernünftige Begründungen für Designentscheidungen. Allerdings fehlt es im Vergleich zu Antwort A an Tiefe: Die Speicherschätzung verwendet eine niedrige durchschnittliche URL-Länge (100 Bytes gegenüber realistischeren 200 Bytes), die CDN-Diskussion ist schwächer (behauptet, CDN cachet 302-Weiterleitungen nicht direkt, was ungenau ist), der Zuverlässigkeitsabschnitt ist falsch als Abschnitt D statt E beschriftet und der Abschnitt über Kompromisse identifiziert nur zwei Kompromisse (das Minimum erforderliche), ohne Abhilfemaßnahmen anzubieten. Die Diskussion der Caching-Strategie ist angemessen, aber weniger detailliert. Die QPS-Berechnungen für Schreib- und Lesevorgänge werden nicht explizit angegeben. Die Fallback-Kette für Rechenzentrumsfehler ist weniger detailliert als in Antwort A.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
65

Antwort B präsentiert eine vernünftige Architektur mit sharded PostgreSQL, Redis Cluster und Read Replicas. Es fehlen jedoch explizite QPS-Berechnungen, die CDN-Diskussion legt fälschlicherweise nahe, dass CDN keine 302-Weiterleitungen cachen kann, und die Architektur ist in Bezug auf Optimierungstechniken weniger detailliert. Die Wahl von PostgreSQL gegenüber einer NoSQL-Lösung für diese Arbeitslast ist vertretbar, aber für das beschriebene Zugriffsmuster weniger optimal.

Vollstandigkeit

Gewichtung 20%
65

Antwort B deckt alle sechs Abschnitte ab, jedoch mit geringerer Tiefe. Die Speicherschätzung verwendet eine niedrige durchschnittliche URL-Länge (100 Bytes) und ergibt 3-5 TB, ohne die Multi-Region-Replikation zu berücksichtigen. Abschnitt E ist fälschlicherweise als Abschnitt D beschriftet. Das API-Design fehlt Ratenbegrenzung und Idempotenz. Es werden nur zwei Kompromisse (das Minimum erforderliche) ohne Abhilfemaßnahmen bereitgestellt.

Trade-off-Analyse

Gewichtung 20%
60

Antwort B identifiziert zwei Kompromisse: Konsistenz vs. Verfügbarkeit und sequentielle ID vs. Hashing. Die Begründung ist solide, aber oberflächlicher. Der erste Kompromiss wiederholt weitgehend die CAP-Diskussion aus Abschnitt E. Für die identifizierten Opfer werden keine Abhilfemaßnahmen angeboten. Die Diskussion über sequentielle Codes als ästhetisches Anliegen unterschätzt die Sicherheitsimplikationen.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
65

Antwort B diskutiert Multi-Region-Bereitstellung, synchrone Intra-Region- und asynchrone Cross-Region-Replikation sowie automatisiertes Failover. Die Fallback-Kette für Fehler ist jedoch weniger detailliert, der Latenzanalyse fehlen spezifische Zahlen für jeden Hop, und die Diskussion, wie genau 50ms p95 erreicht werden, ist allgemeiner. Die Unterscheidung zwischen Active-Passive und Active-Active wird erwähnt, aber nicht vollständig aufgelöst.

Klarheit

Gewichtung 10%
70

Antwort B ist klar strukturiert und lesbar mit guter Formatierung. Die falsche Beschriftung von Abschnitt E als Abschnitt D ist jedoch ein bemerkenswerter organisatorischer Fehler. Die Verwendung von Markdown-Codeblöcken für JSON-Beispiele erhöht die Klarheit des API-Abschnitts. Die Gesamtpräsentation ist sauber, aber in ihrer Organisation etwas weniger detailliert.

Bewertungsmodelle Google Gemini 2.5 Pro

Gesamtpunktzahl

81

Gesamtkommentar

Antwort B präsentiert ein sehr starkes und kompetentes Systemdesign. Sie deckt alle erforderlichen Abschnitte mit solider Begründung ab und schlägt eine praktikable Architektur vor, die auf einer geshardeten relationalen Datenbank basiert. Die Erklärungen zu Skalierbarkeit, Zuverlässigkeit und Kompromissen sind klar und korrekt. Im Vergleich zu Antwort A fehlen jedoch einige der feineren Details und fortgeschrittenen Überlegungen, wie eine umfassende CDN-Strategie, eine detailliertere API mit Idempotenz und eine gründlichere Speicherschätzung, die den Overhead für die Multi-Region-Replikation berücksichtigt. Obwohl es eine sehr gute Antwort ist, ist sie etwas weniger detailliert und ausgefeilt als ihr Gegenstück.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
75

Die Architektur, die auf einer geshardeten relationalen Datenbank basiert, ist praktikabel und gut begründet. Für diese spezielle Arbeitslast (100:1 Lese-/Schreibverhältnis, einfache Key-Value-Lookups) ist eine NoSQL-Lösung jedoch im Allgemeinen besser geeignet. Die vorgeschlagene Architektur ist solide, aber im Vergleich zu Antwort A weniger für die spezifischen Einschränkungen des Problems optimiert.

Vollstandigkeit

Gewichtung 20%
85

Die Antwort ist sehr vollständig und behandelt alle sechs erforderlichen Abschnitte. Das API-Design deckt die Kernanforderungen ab, ist jedoch weniger detailliert als Antwort A und lässt Aspekte wie Idempotenz, Löschung oder Analyseendpunkte aus.

Trade-off-Analyse

Gewichtung 20%
85

Die Antwort liefert zwei gut ausgewählte und klar erklärte Kompromisse. Die Begründung ist stark, identifiziert korrekt die Gewinne und Opfer bei der Wahl von Verfügbarkeit über Konsistenz und der Verwendung einer ID-basierten Generierungsmethode. Die Qualität der Begründung ist hoch, obwohl Antwort A einen zusätzlichen relevanten Kompromiss lieferte.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
80

Die Diskussion über Skalierbarkeit und Zuverlässigkeit ist stark. Sie identifiziert korrekt wichtige Strategien wie Lese-Replikate, Datenbank-Sharding, Caching und Multi-Region-Bereitstellung. Es fehlt jedoch die Betonung einer CDN/Edge-Schicht, die eine wichtige Komponente für einen globalen Dienst mit einer strengen Latenzanforderung darstellt. Der Plan für die schrittweise Herabstufung ist ebenfalls weniger detailliert als in Antwort A.

Klarheit

Gewichtung 10%
85

Die Antwort ist sehr klar und gut organisiert und folgt der Struktur der Aufgabenstellung. Die Verwendung von JSON-Snippets für das API-Design ist hilfreich. Die allgemeine Darstellung ist leicht zu verfolgen und zu verstehen.

Bewertungsmodelle OpenAI GPT-5.4

Gesamtpunktzahl

77

Gesamtkommentar

Antwort B ist solide und im Allgemeinen vollständig, mit klaren APIs, vernünftigem Schema, Base62-Mathematik, Caching, Sharding und einer CAP-Diskussion. Sie ist jedoch weniger rigoros und weniger auf die angegebenen Einschränkungen zugeschnitten als Antwort A. Die Wahl von sharded PostgreSQL ist für diese Skalierung und das Ziel der globalen Verfügbarkeit nicht überzeugend begründet, die Speicherschätzung erscheint optimistisch und der Zuverlässigkeitsabschnitt weist einige Inkonsistenzen und Kennzeichnungsprobleme auf. Außerdem liefert sie weniger konkrete operative Details für Degradation, Cache-Invalidierung und das Verhalten über Regionen hinweg.

Bewertungsdetails anzeigen

Architekturqualitat

Gewichtung 30%
72

Präsentiert eine sinnvolle High-Level-Architektur mit sharded relationaler DB, Replikaten, Cache und Multi-Region-Bereitstellung, aber die Datenbankwahl ist für dieses Zugriffsmuster und diese globale Skalierung weniger überzeugend. Mehrere Teile bleiben auf generischer Ebene und sind operativ weniger präzise.

Vollstandigkeit

Gewichtung 20%
82

Behandelt alle erforderlichen Abschnitte und enthält die wichtigsten erwarteten Elemente, aber einige Abschnitte sind dünner und weniger spezifisch. Die Zuverlässigkeit ist fälschlicherweise als zweiter D-Abschnitt gekennzeichnet, und die reibungslose Degradation und Fehlerbehandlung werden nicht so konkret wie in Antwort A untersucht.

Trade-off-Analyse

Gewichtung 20%
78

Enthält zwei legitime Kompromisse mit klaren Vor- und Nachteilen, insbesondere in Bezug auf CAP und ID-basierte Generierung. Die Diskussion ist jedoch enger und weniger nuanciert, mit weniger Abhilfemaßnahmen und weniger Untersuchung der nachgelagerten operativen Konsequenzen.

Skalierbarkeit und Zuverlassigkeit

Gewichtung 20%
74

Enthält die Hauptelemente für Skalierung und Zuverlässigkeit, einschließlich Cache, Replikaten, Sharding und Multi-Region-Failover, ist aber beim Verhalten über Regionen hinweg und bei der Degradation weniger überzeugend. Das auf PostgreSQL basierende Design in diesem Maßstab wird weniger robust verteidigt, und einige Aussagen zu Active-Passive vs. Active-Active-Replikation und Verfügbarkeitskompromissen bleiben vage oder intern gemischt.

Klarheit

Gewichtung 10%
81

Klar und strukturiert, mit geradliniger Prosa und guter Formatierung. Sie ist leicht zu lesen, aber einige Abschnitte sind repetitiv und etwas weniger präzise, und der Fehler bei der Abschnittsbezeichnung beeinträchtigt die Ausgereiftheit geringfügig.

Vergleichsuebersicht

Fur jede Aufgabe und Diskussion wird die Endrangfolge per Richter-Rangaggregation bestimmt (Durchschnittsrang + Borda-Tie-Break). Der Durchschnittsscore wird als Referenz angezeigt.

Bewerter: 3

Siegstimmen

3 / 3

Durchschnittsscore

88
Diese Antwort ansehen

Siegstimmen

0 / 3

Durchschnittsscore

74
Diese Antwort ansehen

Bewertungsergebnisse

Bewertungsmodelle OpenAI GPT-5.4

Warum diese Seite gewann

Antwort A gewinnt, da sie bei den am stärksten gewichteten Kriterien, insbesondere Architekturqualität und Skalierbarkeit/Zuverlässigkeit, höher abschneidet. Sie bietet ein produktionsreiferes Design für einen Lese-intensiven, global verteilten URL-Shortener: eine besser abgestimmte Speicherwahl für schlüsselbasierten Zugriff, detailliertere Multi-Region-Fehlerbehandlung, eine klarere Latenzstrategie und stärkere quantitative Begründungen für Durchsatz, Speicher und Caching. Antwort B ist kompetent, aber ihre Architektur ist für die angegebenen Einschränkungen weniger robust und weist eine schwächere operative Tiefe und einige Zuverlässigkeitsunklarheiten auf.

Bewertungsmodelle Google Gemini 2.5 Pro

Warum diese Seite gewann

Antwort A ist der Gewinner aufgrund ihrer überlegenen Tiefe, Detailgenauigkeit und der Wahl einer passenderen Architektur für einen webbasierten, leselastigen Dienst. Die Wahl eines verteilten Key-Value-Speichers in Antwort A ist besser für die Einschränkungen des Problems geeignet als die relationale Datenbank in Antwort B. Darüber hinaus ist die Skalierungsstrategie von Antwort A robuster, mit einem entscheidenden Schwerpunkt auf CDN/Edge-Caching, was für die Erfüllung globaler Latenzanforderungen von entscheidender Bedeutung ist. Ihre Speicher-Schätzungen sind gründlicher und ihr API-Design ist umfassender. Obwohl beide Antworten ausgezeichnet sind, zeigt Antwort A ein höheres Maß an Fachwissen im Design von großen verteilten Systemen.

Bewertungsmodelle Anthropic Claude Opus 4.6

Warum diese Seite gewann

Antwort A gewinnt aufgrund der überlegenen Tiefe über alle Kriterien hinweg, insbesondere bei der Architekturqualität (detailliertes mehrschichtiges Caching mit CDN + regionalem Cache, explizite QPS-Berechnungen, Connection Pooling, asynchrone Analysen), Vollständigkeit (zusätzliche Endpunkte, Idempotenzunterstützung, negatives Caching, Feistel-Netzwerk-Minderung), Begründung von Kompromissen (drei gut formulierte Kompromisse mit Minderungsmaßnahmen gegenüber zwei grundlegenden) und Skalierbarkeit/Zuverlässigkeit (detaillierte Fallback-Kette, regionsabhängige ID-Zuweisung, explizite Latenzaufschlüsselung). Die gewichtete Bewertung bevorzugt Antwort A signifikant beim Kriterium mit dem höchsten Gewicht (Architekturqualität mit 30 %) und bedeutsam bei allen anderen Kriterien.

X f L