Orivel Orivel
Ouvrir le menu

Concevoir un service mondial de raccourcissement d'URL

Comparez les reponses des modeles pour cette tache benchmark en Conception de systèmes et consultez scores, commentaires et exemples lies.

Connectez-vous ou inscrivez-vous pour utiliser les likes et favoris. Inscription

X f L

Sommaire

Vue d ensemble de la tache

Genres de comparaison

Conception de systèmes

Modele createur de la tache

Modeles participants

Modeles evaluateurs

Consigne de la tache

Concevez un service public de raccourcissement d'URL similaire à Bitly. Les utilisateurs peuvent soumettre une URL longue et recevoir un alias court, puis n'importe qui peut utiliser le lien court pour être redirigé vers l'URL d'origine. Votre conception doit prendre en charge les exigences et contraintes suivantes : Exigences fonctionnelles : - Créer des liens courts pour des URL valides arbitraires. - Rediriger les liens courts avec une faible latence. - Prendre en charge des alias personnalisés facultatifs lor...

Afficher plus

Concevez un service public de raccourcissement d'URL similaire à Bitly. Les utilisateurs peuvent soumettre une URL longue et recevoir un alias court, puis n'importe qui peut utiliser le lien court pour être redirigé vers l'URL d'origine. Votre conception doit prendre en charge les exigences et contraintes suivantes : Exigences fonctionnelles : - Créer des liens courts pour des URL valides arbitraires. - Rediriger les liens courts avec une faible latence. - Prendre en charge des alias personnalisés facultatifs lorsqu'ils sont disponibles. - Fournir des analyses de clics de base par lien : clics totaux, clics au cours des dernières 24 heures et top 5 des pays par nombre de clics. - Autoriser des dates d'expiration des liens. Hypothèses d'échelle : - 120 millions de nouveaux liens courts par jour. - 8 milliards de requêtes de redirection par jour. - Charge en lecture prédominante avec forte concentration du trafic : une petite fraction des liens reçoit un trafic très élevé. - Utilisateurs mondiaux répartis entre Amérique du Nord, Europe et Asie. Contraintes : - Objectif de disponibilité de 99.99% pour les redirections. - Latence de redirection P95 inférieure à 80 ms pour les utilisateurs dans les principales régions. - Les liens nouvellement créés doivent être utilisables dans un délai de 2 secondes au niveau mondial. - Les analyses peuvent être éventuellement cohérentes, mais les redirections doivent être correctes. - Le budget compte : justifiez où vous dépenseriez pour une cohérence plus forte ou une réplication multi-région et où vous l'éviteriez. - N'utilisez pas de produit d'analyse géré tiers ; concevez le système de base vous-même. Veuillez fournir : - Une architecture de haut niveau avec les composants principaux et le flux de données. - Choix de stockage pour les mappings de liens, les événements d'analyse et les liens chauds en cache. - Stratégie de génération d'identifiants ou d'alias, y compris la gestion des collisions et les vérifications d'alias personnalisés. - Conception d'API pour create-link, redirect et récupération des analyses. - Approche de mise à l'échelle pour les hot keys, la mise en cache, le partitionnement et le trafic multi-régions. - Stratégie de fiabilité couvrant le basculement, la réplication des données, les sauvegardes et le comportement en dégradation. - Principaux compromis et au moins deux choix de conception alternatifs que vous avez envisagés et rejetés.

Informations complementaires

Supposez que le service n'a besoin que de clients web et d'API, pas de SDKs mobiles. Vous pouvez supposer que des primitives cloud standard telles que des équilibres de charge, des files d'attente, du stockage d'objets, des CDN et des bases de données régionales sont disponibles. Vous n'avez pas besoin d'estimer des nombres exacts de machines, mais votre conception doit être suffisamment concrète pour qu'un ingénieur puisse commencer la planification de la mise en œuvre.

Politique d evaluation

Une bonne réponse doit présenter une architecture cohérente de bout en bout qui correspond aux objectifs d'échelle et de latence déclarés, séparer clairement le chemin de redirection du pipeline d'analytique, et justifier les choix de stockage et de réplication en termes de cohérence, coût et disponibilité. Elle doit aborder le déploiement global, la stratégie de cache pour les liens très populaires, la génération d'alias et la gestion des collisions, ainsi que le comportement pratique des API. Les meilleures répon...

Afficher plus

Une bonne réponse doit présenter une architecture cohérente de bout en bout qui correspond aux objectifs d'échelle et de latence déclarés, séparer clairement le chemin de redirection du pipeline d'analytique, et justifier les choix de stockage et de réplication en termes de cohérence, coût et disponibilité. Elle doit aborder le déploiement global, la stratégie de cache pour les liens très populaires, la génération d'alias et la gestion des collisions, ainsi que le comportement pratique des API. Les meilleures réponses discutent des goulets d'étranglement probables, des modes de défaillance et de la dégradation progressive, et expliquent les compromis entre les options plutôt que de simplement énumérer des composants sans raisonnement. Les réponses faibles ignorent l'échelle du trafic, traitent les analyses et la correction des redirections de façon identique, omettent les préoccupations multi-régions ou ne parviennent pas à expliquer pourquoi des choix architecturaux spécifiques conviennent aux contraintes.

Reponses

### 1. Architecture de haut niveau Le système est conçu comme un service mondialement distribué et multi-régions pour garantir une faible latence et une haute disponibilité. Chaque région majeure (par exemple, US-East, EU-West, AP-Southeast) héberge une pile complète de Point of Presence (PoP). **Composants :** 1. **Répartiteur de charge mondial (GLB) :** Utilise un routage DNS basé sur la latence pour diriger les utilisateurs vers le PoP régional sain le plus proche. 2. **Pile PoP régionale :** * **Passerelle API :** Termine le TLS, authentifie les requêtes et les achemine vers le service backend appro...

Afficher la reponse complete

### 1. Architecture de haut niveau Le système est conçu comme un service mondialement distribué et multi-régions pour garantir une faible latence et une haute disponibilité. Chaque région majeure (par exemple, US-East, EU-West, AP-Southeast) héberge une pile complète de Point of Presence (PoP). **Composants :** 1. **Répartiteur de charge mondial (GLB) :** Utilise un routage DNS basé sur la latence pour diriger les utilisateurs vers le PoP régional sain le plus proche. 2. **Pile PoP régionale :** * **Passerelle API :** Termine le TLS, authentifie les requêtes et les achemine vers le service backend approprié. * **Service de redirection :** Un service léger et hautement évolutif qui gère les requêtes `GET /{alias_court}`. Il est optimisé pour la vitesse. * **Service d'écriture :** Gère la création de liens (`POST /api/v1/links`), y compris la validation d'alias personnalisés et la génération d'identifiants uniques. * **Service d'analyse :** Fournit l'accès aux statistiques des liens via `GET /api/v1/links/{alias_court}/stats`. 3. **Infrastructure de données :** * **Base de données mondiale :** Une base de données distribuée et fortement cohérente pour la cartographie principale des liens. * **Cache régional :** Un cache en mémoire dans chaque région pour les liens populaires. * **Pipeline d'analyse :** Une file d'attente de messages pour l'ingestion d'événements, un processeur de flux pour l'agrégation et une base de données NoSQL pour le stockage et la diffusion des données d'analyse. **Flux de données :** * **Création de lien :** La requête `POST` d'un utilisateur est acheminée vers le service d'écriture le plus proche. Le service génère ou valide un alias et écrit le mappage `alias_court -> URL_longue` dans la base de données mondiale. L'écriture est répliquée de manière synchrone dans toutes les régions en moins de 2 secondes. * **Redirection :** Une requête `GET` est acheminée vers le service de redirection le plus proche. Il vérifie d'abord le cache régional. En cas de succès du cache, il émet immédiatement une redirection 301 et envoie de manière asynchrone un événement de clic à la file d'attente d'analyse. En cas d'échec, il interroge la réplique locale de la base de données mondiale, remplit le cache, puis effectue la redirection et l'enregistrement de l'événement. * **Analyse :** Les événements de clic de toutes les régions sont publiés dans une file d'attente de messages centrale. Un processeur de flux consomme ces événements, les agrège en statistiques par fenêtre temporelle (clics totaux, clics sur 24h, pays), et écrit les résultats dans la base de données d'analyse. ### 2. Choix de stockage * **Mappages de liens (Stockage principal) :** * **Technologie :** Une base de données SQL distribuée mondialement comme Google Cloud Spanner ou CockroachDB. * **Justification :** Ce choix est motivé par le besoin de cohérence forte sur les redirections et l'exigence de propagation des écritures mondiales inférieure à 2 secondes. Ces bases de données fournissent une réplication synchrone et des lectures régionales à faible latence, justifiant leur coût plus élevé pour la fonction commerciale principale. L'`alias_court` sert de clé primaire pour des recherches rapides. * **Liens populaires mis en cache :** * **Technologie :** Un cache distribué régional en mémoire comme Redis Cluster. * **Justification :** Avec 8 milliards de lectures quotidiennes et un trafic fortement déséquilibré, un cache est essentiel pour atteindre la cible de latence P95 <80 ms et protéger la base de données. Chaque région maintient son propre cache en utilisant un modèle de cache-aside. * **Données d'analyse :** * **File d'attente d'ingestion :** Apache Kafka ou AWS Kinesis. Cela découple le chemin de redirection à haut débit du traitement analytique et fournit un tampon durable pour les événements de clic. * **Base de données de service :** Un magasin NoSQL à colonnes larges comme Apache Cassandra ou ScyllaDB. Il est optimisé pour la charge de travail d'agrégation de séries temporelles à forte écriture de l'analyse et est plus rentable à grande échelle pour ces modèles de requête qu'une base de données relationnelle. ### 3. Génération d'identifiants et stratégie d'alias Nous utiliserons un alias de 7 caractères de l'alphabet `[a-zA-Z0-9]`, fournissant `62^7` (plus de 3,5 billions) combinaisons uniques. * **Génération d'identifiants :** Un service d'arrière-plan pré-génère un grand pool d'identifiants uniques aléatoires et les stocke dans une file d'attente dédiée (par exemple, une liste Redis). Le service d'écriture récupère simplement un identifiant pré-généré de ce pool lors de la création d'un nouveau lien. Cette approche est rapide, évolutive et évite les vérifications de collision à la volée lors d'une requête utilisateur. * **Gestion des alias personnalisés :** Lorsqu'un utilisateur soumet un alias personnalisé, le service d'écriture tente de l'`INSERT` dans la base de données mondiale. La colonne `alias_court` est la clé primaire avec une contrainte d'unicité. Cela gère atomiquement l'opération de vérification et de définition ; si l'alias est déjà pris, la base de données rejette l'écriture, et le service renvoie une erreur `409 Conflict` à l'utilisateur. ### 4. Conception de l'API * **Créer un lien :** `POST /api/v1/links` * **Corps :** `{ "long_url": "...", "custom_alias": "..." (optionnel), "expires_at": "..." (optionnel) }` * **Réponse :** `201 Created` avec `{ "short_url": "...", "long_url": "..." }` * **Redirection :** `GET /{alias_court}` * **Réponse :** `301 Moved Permanently` avec l'en-tête `Location: {url_longue}` pour les liens permanents. `404 Not Found` si l'alias n'existe pas ou a expiré. * **Obtenir les analyses :** `GET /api/v1/links/{alias_court}/stats` * **Réponse :** `200 OK` avec `{ "total_clicks": ..., "clicks_last_24h": ..., "top_countries": [...] }` ### 5. Approche de mise à l'échelle * **Clés chaudes :** Une stratégie de mise en cache à plusieurs niveaux est employée. Pour les liens extrêmement viraux, la réponse de redirection `301` peut être mise en cache au niveau du CDN. La défense principale est le cache Redis régional, qui absorbera la majorité du trafic déséquilibré. * **Partitionnement :** La base de données mondiale (Spanner/CockroachDB) gère automatiquement le partitionnement des données de liens par sa clé primaire (`alias_court`). La base de données d'analyse (Cassandra) sera partitionnée par `alias_court` pour co-localiser toutes les statistiques d'un lien donné, permettant des requêtes efficaces. * **Trafic multi-régions :** Le GLB garantit que les utilisateurs sont dirigés vers le PoP le plus proche pour une faible latence. L'architecture est active-active, car les écritures peuvent être gérées par n'importe quelle région et sont répliquées mondialement par la base de données. Cette conception maximise l'utilisation des ressources et la disponibilité. ### 6. Stratégie de fiabilité * **Basculement :** Le GLB effectue des vérifications de santé et redirigera automatiquement le trafic loin de toute région non saine. Au sein d'une région, les répartiteurs de charge achemineront le trafic autour des instances de service défaillantes. * **Réplication des données :** La base de données mondiale est configurée pour répliquer les données sur plusieurs zones de disponibilité et régions, offrant une résilience contre les défaillances d'instances et de régions. Le cluster Cassandra pour l'analyse sera également déployé dans plusieurs régions. * **Sauvegarde :** Des instantanés automatisés et périodiques des bases de données primaires et d'analyse sont effectués et stockés dans un stockage d'objets durable (par exemple, AWS S3) pour la reprise après sinistre. * **Dégradation gracieuse :** Le système est conçu de telle sorte qu'une défaillance du pipeline d'analyse non critique n'affectera pas la fonctionnalité de redirection principale. Le service de redirection continuera de traiter les requêtes même s'il ne peut pas publier d'événements dans la file d'attente de messages. ### 7. Compromis et alternatives rejetées * **Alternative 1 : Génération d'identifiants basée sur le hachage (Rejetée). * **Concept :** Générer un identifiant court en hachant l'URL longue. En cas de collision, ajouter un sel et re-hacher. * **Raison du rejet :** Cela ajoute une latence et une complexité imprévisibles au chemin d'écriture. Avec 120 millions d'écritures par jour, la probabilité de collision devient significative, nécessitant plusieurs recherches dans la base de données pour trouver un identifiant unique. La stratégie de pré-génération choisie offre des performances en temps constant pour l'acquisition d'identifiants lors d'une requête utilisateur. * **Alternative 2 : Base de données relationnelle à maître unique (Rejetée). * **Concept :** Utiliser une base de données traditionnelle comme PostgreSQL dans une région primaire unique avec des réplicas en lecture dans d'autres régions. * **Raison du rejet :** Cette conception ne peut pas répondre à l'exigence stricte de propagation des écritures mondiales inférieure à 2 secondes. Le délai de réplication vers des réplicas distants dépasserait fréquemment ce seuil, ce qui signifie qu'un lien nouvellement créé ne serait pas immédiatement disponible pour tous les utilisateurs mondiaux. Le coût plus élevé d'une base de données distribuée mondialement est justifié pour répondre à cette exigence fonctionnelle principale.

Resultat

#2

Votes gagnants

0 / 3

Score moyen

69
Modeles evaluateurs OpenAI GPT-5.2

Score total

70

Commentaire global

Présente une architecture multi-régions cohérente avec une séparation claire entre les chemins de redirection et d'analyse, de bons choix de stockage de base (base de données globalement fortement cohérente pour les mappages, cache Redis régional, pipeline d'analyse asynchrone), et inclut les API requises ainsi que deux alternatives rejetées. Cependant, plusieurs domaines sont sous-spécifiés ou quelque peu vagues pour cette échelle : les détails du pool de pré-génération d'ID et la sécurité (déduplication, coordination multi-régions, comportement de remplissage) ne sont pas abordés ; la conception de l'analyse est générique et n'explique pas clairement comment calculer efficacement les 24 dernières heures et les pays les plus populaires ; les sémantiques d'expiration et l'interaction cache/CDN ne sont pas traitées en profondeur ; la réplication multi-régions et la justification de la cohérence/du budget sont relativement superficielles au-delà de « utiliser Spanner/Cockroach ». La fiabilité/dégradation est raisonnable mais manque de RTO/RPO concrets et de détails opérationnels pour la base de données globale et la politique de backpressure/perte de données d'analyse.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
72

Modèle PoP régional solide avec des services de redirection/écriture/analyse séparés et une gestion asynchrone des événements, mais certains composants clés sont décrits à un niveau générique ("Base de données globale" avec réplication synchrone partout) sans détailler le comportement pratique des écritures/lectures globales et l'interaction cache périphérique/TTL.

Completude

Poids 20%
68

Couvre toutes les sections demandées, mais l'approche de requête/agrégation d'analyse n'est pas entièrement spécifiée (en particulier les 24 dernières heures/les 5 pays principaux), la gestion de l'expiration est mince, et le mécanisme de pré-génération d'ID manque de détails opérationnels (coordination, collisions, remplissage, multi-régions).

Analyse des compromis

Poids 20%
65

Inclut deux alternatives rejetées avec une justification raisonnable, mais les compromis budget/cohérence sont principalement affirmés (payer pour une base de données globale forte) avec une discussion limitée sur ce qui peut être éventuel ou comment minimiser les coûts au-delà de la mise en cache.

Scalabilite et fiabilite

Poids 20%
70

La mise en cache régionale et l'analyse asynchrone prennent en charge la dissymétrie des lectures intensives ; la fiabilité inclut le basculement et la dégradation, mais manque d'une gestion plus approfondie de la saturation des clés chaudes au-delà du CDN/Redis et fournit peu de détails sur le comportement en cas de défaillance multi-régions et les modes/coûts de réplication.

Clarte

Poids 10%
76

Organisé et lisible avec des titres et des flux clairs ; certaines affirmations sont simplifiées à l'excès (réplication synchrone dans le monde entier en moins de 2 secondes), ce qui réduit la précision.

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

73

Commentaire global

La réponse A fournit une conception de système solide et bien structurée qui répond à toutes les exigences clés. Elle sépare clairement les chemins de redirection et d'analyse, fait des choix de stockage appropriés et décrit une stratégie raisonnable de génération et de mise à l'échelle des identifiants. Les compromis discutés sont pertinents et bien justifiés. Cependant, il manque une partie de la profondeur et du détail trouvés dans la réponse B, en particulier dans des domaines tels que la mise en cache multicouche pour les clés fréquemment consultées, une génération d'identifiants plus robuste et une justification budgétaire complète.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
75

L'architecture est bien définie avec une séparation claire des responsabilités (services de redirection, d'écriture, d'analyse) et une utilisation appropriée des points de présence régionaux et d'une base de données mondiale. Le flux de données est logique et répond aux exigences principales.

Completude

Poids 20%
70

La réponse A couvre toutes les sections demandées, fournissant une conception générale complète. Cependant, certaines sections, comme la génération d'identifiants et la conception d'API, pourraient bénéficier de plus de détails et de considérations supplémentaires.

Analyse des compromis

Poids 20%
70

La réponse identifie deux alternatives pertinentes et fournit des justifications claires pour leur rejet, en se concentrant principalement sur les exigences de latence et de cohérence. Le raisonnement est solide mais limité dans sa portée.

Scalabilite et fiabilite

Poids 20%
75

La réponse décrit une bonne stratégie pour la mise à l'échelle des clés fréquemment consultées (CDN, cache régional) et du trafic multi-régions. Les aspects de fiabilité tels que le basculement, la réplication des données et la dégradation progressive sont mentionnés, fournissant une base solide.

Clarte

Poids 10%
75

La réponse est bien organisée avec des titres et des puces clairs, ce qui la rend facile à lire et à comprendre. Le langage est précis et évite toute ambiguïté.

Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

64

Commentaire global

La réponse A présente une conception de système cohérente et bien structurée qui couvre tous les composants majeurs. Elle sépare correctement le chemin de redirection du pipeline d'analyse, choisit des technologies appropriées (Spanner/CockroachDB, Redis, Kafka, Cassandra) et fournit une conception d'API claire. La stratégie de génération d'ID utilisant des pools pré-générés est raisonnable. Cependant, la réponse manque de profondeur dans plusieurs domaines : elle n'aborde pas le problème des clés chaudes au-delà de la mention du CDN et de la mise en cache Redis, ne fournit aucune estimation de capacité, n'aborde pas le compromis 301 vs 302 (par défaut à 301, ce qui casserait l'analyse et l'expiration des liens), manque de détails sur les stratégies d'invalidation de cache, ne mentionne pas la mise en cache en mémoire, ne fournit que deux alternatives rejetées, et la section fiabilité est relativement mince sans scénarios de défaillance spécifiques ni détails RTO/RPO. La justification du budget est absente. La conception est correcte mais ressemble plus à un résumé qu'à un plan d'implémentation détaillé.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
70

La réponse A présente une architecture propre et cohérente avec une séparation appropriée des préoccupations entre les chemins de redirection, d'écriture et d'analyse. Le choix de Spanner/CockroachDB pour le magasin de liens et de Kafka pour l'ingestion d'analyses est judicieux. Cependant, elle manque d'une stratégie de mise en cache multi-niveaux (pas de cache en mémoire) et l'utilisation des redirections 301 par défaut est un défaut de conception important qui casserait le suivi analytique et l'expiration des liens. L'architecture est correcte à un niveau élevé mais manque de nuances importantes.

Completude

Poids 20%
60

La réponse A couvre les sept sections requises mais avec une profondeur limitée. Elle manque d'estimations de capacité, n'aborde pas la limitation de débit, omet la considération 301 vs 302, ne fournit aucun détail de schéma, n'a aucune justification budgétaire et ne présente que deux alternatives rejetées. La conception de l'API est minimale sans codes d'erreur pour la limitation de débit ou l'autorisation. La stratégie d'invalidation de cache n'est pas discutée. La section fiabilité manque de détails temporels spécifiques pour le basculement ou la dégradation par composant.

Analyse des compromis

Poids 20%
55

La réponse A ne présente que deux alternatives rejetées : génération d'ID basée sur le hachage et base de données relationnelle à maître unique. Les deux sont raisonnables mais le raisonnement est quelque peu superficiel. La réponse n'aborde pas le compromis critique 301 vs 302, ne compare pas les options de stockage d'analyses et n'aborde pas le compromis entre l'analyse synchrone et asynchrone. La justification budgétaire pour savoir où dépenser en matière de cohérence par rapport aux économies est entièrement absente malgré les exigences explicites des contraintes.

Scalabilite et fiabilite

Poids 20%
60

La réponse A mentionne la mise en cache CDN et Redis régional pour les clés chaudes mais manque de spécificité. Il n'y a pas d'estimations de capacité, pas de discussion sur la mise à l'échelle automatique, et l'atténuation des clés chaudes est limitée à deux couches. La section fiabilité couvre le basculement, la réplication, la sauvegarde et la dégradation progressive à un niveau élevé mais sans détails temporels spécifiques, cibles RTO/RPO, ou analyse des défaillances par composant. L'objectif de disponibilité de 99,99 % n'est pas explicitement abordé en termes de la manière dont l'architecture l'atteint.

Clarte

Poids 10%
75

La réponse A est bien organisée avec des en-têtes de section clairs et une écriture concise. Les descriptions du flux de données sont faciles à suivre. L'utilisation du texte en gras et des puces facilite la lecture. Cependant, la brièveté se fait parfois au détriment de détails importants. L'écriture est propre et professionnelle.

SERVICE GLOBAL DE RACCOURCISSEMENT D'URL — CONCEPTION DU SYSTÈME ───────────────────────────────────────── 1. ARCHITECTURE DE HAUT NIVEAU ET FLUX DE DONNÉES ───────────────────────────────────────── Le système est organisé en trois plans : le Plan d'Écriture (création de liens), le Plan de Lecture (redirection) et le Plan d'Analyse (ingestion et interrogation d'événements). Composants majeurs : - Équilibreur de charge Anycast Global / Bord CDN (par ex., Cloudflare ou AWS CloudFront avec Lambda@Edge) - API Gateway + Couche d'authentification (limitation de débit, prévention des abus) - Service de Création de Li...

Afficher la reponse complete

SERVICE GLOBAL DE RACCOURCISSEMENT D'URL — CONCEPTION DU SYSTÈME ───────────────────────────────────────── 1. ARCHITECTURE DE HAUT NIVEAU ET FLUX DE DONNÉES ───────────────────────────────────────── Le système est organisé en trois plans : le Plan d'Écriture (création de liens), le Plan de Lecture (redirection) et le Plan d'Analyse (ingestion et interrogation d'événements). Composants majeurs : - Équilibreur de charge Anycast Global / Bord CDN (par ex., Cloudflare ou AWS CloudFront avec Lambda@Edge) - API Gateway + Couche d'authentification (limitation de débit, prévention des abus) - Service de Création de Liens (sans état, évolutif horizontalement) - Service de Redirection (sans état, extrêmement sensible à la latence) - Service de Génération d'ID (producteur distribué de codes courts uniques) - Magasin de Liens Principal (base de données relationnelle répliquée mondialement, par ex., CockroachDB ou AWS Aurora Global) - Cache de Liens Actifs (Redis Cluster, par région) - File d'attente d'Ingestion d'Analyses (Kafka ou AWS Kinesis, par région) - Travailleurs d'Agrégation d'Analyses (processeurs de flux, par ex., Flink ou Kafka Streams) - Magasin d'Analyses (magasin de données colonnaires, par ex., ClickHouse ou Apache Druid) - Service d'Interrogation d'Analyses (API en lecture seule) - Stockage d'Objets pour les sauvegardes à froid (compatible S3) Plan d'Écriture (création de liens) : 1. Le client POSTe vers l'API Gateway régionale la plus proche. 2. L'API Gateway authentifie et limite le débit de la requête, puis la transmet au Service de Création de Liens. 3. Le Service de Création de Liens appelle le Service de Génération d'ID pour obtenir un code court unique (ou valide un alias personnalisé). 4. L'enregistrement est écrit dans le Magasin de Liens Principal avec une forte cohérence dans la région locale ; la réplication globale de la base de données propage l'enregistrement aux autres régions en environ 1 à 2 secondes, satisfaisant le SLA « utilisable dans les 2 secondes à l'échelle mondiale ». 5. Simultanément, le nouveau mappage est poussé vers le cache Redis régional (écriture directe ou invalidation pub/sub) afin que la première redirection dans cette région ne manque pas le cache. 6. Une réponse 201 avec l'URL courte est renvoyée au client. Plan de Lecture (redirection) : 1. Le client émet une requête GET /{codeCourt} vers le nœud périphérique le plus proche. 2. Le nœud périphérique vérifie son propre cache CDN (pour les liens extrêmement actifs, TTL ~5–10 secondes pour respecter la sémantique d'expiration). 3. En cas de manque dans le cache CDN, la requête atteint le Service de Redirection régional. 4. Le Service de Redirection vérifie le cache Redis régional (taux de succès attendu > 99 % pour les liens actifs). 5. En cas de manque dans Redis, le Service de Redirection interroge la réplique de lecture locale du Magasin de Liens Principal. 6. Si le lien est expiré ou introuvable, renvoyer 404/410. 7. Sinon, émettre une redirection HTTP 301 (permanente) ou 302 (temporaire). Utiliser 302 par défaut afin que les navigateurs ne mettent pas en cache indéfiniment, préservant ainsi la précision des analyses. 8. Émettre de manière asynchrone un événement de clic (codeCourt, horodatage, pays dérivé de l'IP, user-agent) vers la File d'attente d'Ingestion d'Analyses régionale. Ceci est un « fire-and-forget » ; cela ne bloque pas la réponse de redirection. Plan d'Analyse : 1. Les sujets Kafka régionaux reçoivent les événements de clic. 2. Les tâches Flink/Kafka Streams consomment les événements et maintiennent des agrégats roulants : clics totaux (compteur), clics dans les dernières 24 heures (fenêtre glissante) et top 5 des pays (esquisse approximative des éléments les plus fréquents, par ex., Count-Min Sketch ou SpaceSaving). 3. Les résultats agrégés sont écrits dans ClickHouse (magasin de données colonnaires optimisé pour l'ajout) toutes les 30 à 60 secondes. 4. Le Service d'Interrogation d'Analyses lit depuis ClickHouse et renvoie les résultats pré-agrégés. Les événements bruts sont également conservés dans ClickHouse pour des requêtes ad hoc. 5. Agrégation des analyses inter-régionales : le cluster Kafka de chaque région reflète les événements vers une région d'analyse centrale via Kafka MirrorMaker 2 ou la réplication inter-régionale Kinesis. Le cluster ClickHouse central détient la vue globale. ───────────────────────────────────────── 2. CHOIX DE STOCKAGE ───────────────────────────────────────── Mappages de liens — CockroachDB (ou Aurora Global DB) : Justification : Nous avons besoin d'une forte cohérence pour les écritures (pour éviter les alias dupliqués) et de lectures à faible latence à l'échelle mondiale. CockroachDB est une base de données SQL distribuée avec prise en charge active-active multi-régions, isolation sérialisable et basculement automatique. Aurora Global DB est une alternative avec un seul écrivain principal et jusqu'à 5 répliques de lecture dans différentes régions avec un décalage de réplication d'environ 1 seconde. L'un ou l'autre satisfait le SLA de propagation globale de 2 secondes. Schéma (simplifié) : liens(codeCourt VARCHAR(12) PK, urlLongue TEXT NOT NULL, idProprietaire BIGINT, creeLe TIMESTAMPTZ, expireLe TIMESTAMPTZ, estPersonnalise BOOLEAN) Index : codeCourt (PK, groupé), idProprietaire + creeLe (pour les tableaux de bord utilisateur). Taille estimée : 120M liens/jour × 365 jours × ~300 octets/ligne ≈ ~13 To/an. Gérable avec partitionnement par creeLe. Cache de Liens Actifs — Redis Cluster (par région) : Chaque région exécute un Redis Cluster avec 3 à 6 shards et réplicas. Entrées du cache : codeCourt → {urlLongue, expireLe}. TTL défini sur min(expiration du lien, 24 heures). Ensemble de travail attendu : les 1 % de liens les plus actifs (~1,2M) représentent ~80 % du trafic. À ~500 octets par entrée, 1,2M d'entrées ≈ 600 Mo par région — très abordable. Nous utilisons une stratégie d'écriture directe lors de la création du lien et une population paresseuse lors de la première absence du cache en redirection. Événements d'Analyse — Kafka + ClickHouse : Kafka conserve les événements de clic bruts pendant 7 jours (rejouabilité). ClickHouse stocke à la fois les événements bruts (partitionnés par date, shardés par codeCourt) et les vues matérialisées pré-agrégées. Le stockage en colonnes et l'exécution vectorisée de ClickHouse le rendent idéal pour les requêtes d'agrégation nécessaires (SOMME, COMPTE, GROUP BY pays, fenêtre glissante). Sauvegardes à Froid — Stockage d'objets compatible S3 : Des instantanés quotidiens du magasin de liens et des exportations hebdomadaires de ClickHouse sont stockés dans le stockage d'objets avec versionnement et réplication inter-régionale pour la reprise après sinistre. ───────────────────────────────────────── 3. STRATÉGIE DE GÉNÉRATION D'ID ET D'ALIAS ───────────────────────────────────────── Format du Code Court : Utiliser 7 caractères d'un alphabet Base62 (a-z, A-Z, 0-9). Base62^7 = ~3,5 billions de combinaisons, dépassant largement tout besoin prévisible (120M/jour × 10 ans = ~438 milliards de liens). Stratégie de Génération d'ID — Compteur Distribué + Encodage : Nous utilisons une approche de compteur distribué plutôt qu'une génération aléatoire pour éviter les tempêtes de collisions à grande échelle. Étape 1 : Chaque instance du Service de Création de Liens acquiert un bloc d'ID auprès d'un service de coordination léger (par ex., un INCRBY Redis ou un service d'ID dédié basé sur ZooKeeper). Chaque instance revendique un bloc de 10 000 ID à la fois, réduisant la surcharge de coordination. Étape 2 : L'ID numérique est encodé en Base62 pour produire le code court. Un code Base62 de 7 caractères peut représenter des ID jusqu'à ~3,5 billions. Étape 3 : Pour empêcher les attaques par énumération et ajouter de l'imprévisibilité, XOR l'ID numérique avec un sel secret avant l'encodage, ou utilisez une fonction de brouillage bijective (chiffrement de Feistel sur l'espace d'ID). Alias Personnalisés : 1. Le client soumet l'alias souhaité (3 à 20 caractères alphanumériques). 2. Le Service de Création de Liens tente une INSERTION avec l'alias personnalisé comme codeCourt en utilisant une contrainte d'unicité dans la base de données. 3. Si l'INSERTION échoue en raison d'une violation de contrainte d'unicité, renvoyer HTTP 409 Conflict avec une suggestion d'essayer un autre alias. 4. Les alias personnalisés contournent entièrement le service de génération d'ID. 5. Les alias personnalisés sont réservés dans une vérification d'espace de noms distincte (liste de grossièretés, mots réservés comme « api », « admin », « health ») avant l'écriture dans la base de données. Gestion des Collisions pour les Codes Générés : Étant donné que nous utilisons un compteur monotone avec un encodage bijectif, les collisions sont structurellement impossibles pour les codes générés. Les collisions ne peuvent se produire que si un code généré correspond par hasard à un alias personnalisé — ceci est géré par la contrainte d'unicité ; le service de génération d'ID incrémente simplement vers l'ID suivant et réessaie (extrêmement rare). ───────────────────────────────────────── 4. CONCEPTION DE L'API ───────────────────────────────────────── Toutes les API sont RESTful sur HTTPS. La limitation de débit est appliquée au niveau de la couche API Gateway (par ex., 100 créations/minute par utilisateur authentifié, 10 créations/minute pour les utilisateurs anonymes). POST /v1/links — Créer un Lien Court Corps de la requête (JSON) : urlLongue: chaîne (obligatoire, doit être une URL valide, max 2048 caractères) aliasPersonnalise: chaîne (facultatif, 3–20 caractères alphanumériques) expireLe: date/heure ISO 8601 (facultatif) idProprietaire: chaîne (facultatif, à partir du jeton d'authentification) Réponse 201 Created : codeCourt: chaîne urlCourte: chaîne (par ex., « https://sho.rt/aB3xY7z ») urlLongue: chaîne expireLe: chaîne ou null creeLe: chaîne Réponse 400 : URL ou format d'alias invalide Réponse 409 : alias personnalisé déjà pris Réponse 429 : limite de débit dépassée GET /{codeCourt} — Redirection Pas de corps de requête. Paramètre de chemin : codeCourt. Réponse 302 Found avec l'en-tête Location défini sur urlLongue. Réponse 404 : code court introuvable. Réponse 410 Gone : lien expiré. Ce point de terminaison est servi au domaine racine (par ex., sho.rt/{codeCourt}) pour une longueur d'URL minimale. GET /v1/links/{codeCourt}/analytics — Récupérer les Analyses Authentification requise (propriétaire ou administrateur). Paramètres de requête : aucun requis (renvoie le résumé par défaut) Réponse 200 : codeCourt: chaîne totalClics: entier clicsDernieres24h: entier topPays: tableau d'objets, chacun avec codePays (ISO 3166-1 alpha-2) et nombreClics, trié par ordre décroissant, max 5 entrées derniereMiseAJour: date/heure ISO 8601 (indique la fraîcheur des analyses) Réponse 404 : lien introuvable. Réponse 403 : non autorisé. GET /v1/links/{codeCourt} — Obtenir les Métadonnées du Lien (point de terminaison utilitaire facultatif) Authentification requise. Réponse 200 : objet de lien complet incluant urlLongue, creeLe, expireLe, estPersonnalise. DELETE /v1/links/{codeCourt} — Supprimer / Désactiver un Lien Authentification requise (propriétaire ou administrateur). Réponse 204 No Content. Supprime logiquement l'enregistrement (définit un horodatage deleted_at) et invalide l'entrée du cache via pub/sub. ───────────────────────────────────────── 5. APPROCHE DE MISE À L'ÉCHELLE ───────────────────────────────────────── Problème des Clés Actives : Une petite fraction de liens (URL virales, campagnes marketing) recevra des millions de redirections par minute. Le sharding Redis naïf place tout le trafic pour une clé sur un seul shard. Atténuation : - Cache local en mémoire dans chaque instance du Service de Redirection (par ex., Caffeine avec un LRU de 10 000 entrées, TTL de 5 secondes). Ceci absorbe les clés les plus actives entièrement dans le processus, éliminant les allers-retours Redis pour les 0,1 % de liens les plus importants. - Mise en cache en périphérie CDN avec un court TTL (5–10 secondes) pour la réponse de redirection elle-même. Avec 8 milliards de redirections/jour, même un taux de succès CDN de 90 % décharge 7,2 milliards de requêtes de l'origine. - Réplicas de lecture Redis : promouvoir les shards de clés actives pour avoir plus de réplicas et router les lectures en mode round-robin. Stratégie de Mise en Cache : Cache à trois niveaux : bord CDN → LRU en mémoire → Redis Cluster → réplique de lecture DB. Population du cache : écriture directe à la création, population paresseuse à la première absence du cache. Invalidation du cache : lors de la suppression ou de l'expiration d'un lien, publier un message d'invalidation sur un canal Redis pub/sub ; toutes les instances du Service de Redirection s'y abonnent et suppriment la clé de leur LRU local. Les entrées CDN expirent naturellement via TTL. Partitionnement : - Magasin de Liens : partitionner par hachage de codeCourt (CockroachDB gère cela automatiquement via le sharding basé sur les plages). Aucune partition active car les codes courts sont uniformément distribués après brouillage bijectif. - Kafka : partitionner les événements de clic par hachage de codeCourt. Ceci garantit que tous les événements pour un lien donné vont dans la même partition, permettant une agrégation d'état par lien sans mélanges. - ClickHouse : shard par codeCourt, partition par date. Les requêtes pour l'analyse d'un seul lien atteignent un seul shard ; les requêtes par plage de temps bénéficient de l'élagage des partitions. Trafic Multi-Régions : Déployer dans trois régions : US-East, EU-West, AP-Southeast (couvre l'Amérique du Nord, l'Europe, l'Asie). - GeoDNS basé sur DNS ou Anycast route les utilisateurs vers la région la plus proche. - Chaque région est entièrement indépendante pour les lectures (Service de Redirection + Redis + réplique de lecture DB). - Les écritures (création de liens) vont au Service de Création de Liens de la région la plus proche, qui écrit dans le nœud local de la base de données distribuée mondialement. CockroachDB se réplique vers d'autres régions en environ 1 à 2 secondes. - Les événements d'analyse sont traités régionalement et reflétés vers un cluster d'analyse central pour l'agrégation mondiale. Esquisse de Capacité : - 8 milliards de redirections/jour = ~92 500 req/s en moyenne, ~300 000 req/s en pointe (facteur 3). - Avec un taux de succès CDN de 90 % : ~30 000 req/s vers l'origine sur 3 régions = ~10 000 req/s par région. - Chaque instance du Service de Redirection peut gérer ~5 000 req/s (principalement des succès de cache, CPU minimal). ~2–4 instances par région en charge moyenne, mise à l'échelle automatique jusqu'à 20+ en pointe. - 120 millions d'écritures/jour = ~1 400 écritures/s en moyenne. Le Service de Création de Liens n'est pas le goulot d'étranglement. ───────────────────────────────────────── 6. STRATÉGIE DE FIABILITÉ ───────────────────────────────────────── Objectif de Disponibilité : 99,99 % = ~52 minutes d'indisponibilité/an. Basculement : - Chaque région exécute plusieurs instances de chaque service sans état derrière un équilibreur de charge régional avec des vérifications de santé (fail open : supprimer les instances non saines en moins de 10 secondes). - Redis Cluster utilise le basculement automatique : si un shard primaire échoue, une réplique est promue en ~15 secondes. Pendant cette fenêtre, le Service de Redirection se rabat sur la réplique de lecture de la base de données (latence légèrement plus élevée mais correcte). - Si une région entière échoue, GeoDNS détecte l'échec via des sondes de santé et redirige le trafic vers la région adjacente la plus proche en 30 à 60 secondes. Les régions restantes doivent absorber la charge ; la mise à l'échelle automatique gère cela. - CockroachDB / Aurora Global DB : basculement automatique vers le nœud d'une autre région si la région primaire est indisponible. Pour Aurora, cela implique une promotion manuelle ou automatisée d'une réplique de lecture en primaire (RTO ~1 minute avec automatisation). Réplication des Données : - Magasin de Liens : réplication synchrone au sein d'une région (au moins 2 nœuds), réplication asynchrone inter-régionale (consensus CockroachDB entre régions, ou Aurora Global DB ~1 s de décalage). Nous acceptons la cohérence éventuelle pour les lectures inter-régionales car le SLA de propagation de 2 secondes est respecté. - Redis : chaque shard a au moins une réplique dans la même région. Pas de réplication Redis inter-régionale (Redis est un cache ; la base de données est la source de vérité). - Kafka : facteur de réplication 3 au sein de chaque région. Mise en miroir inter-régionale pour les analyses uniquement (pas pour la correction des redirections). - ClickHouse : répliqué au sein de la région d'analyse à l'aide de ClickHouse Keeper (remplacement de ZooKeeper). Aucune réplication ClickHouse multi-régionale nécessaire car les analyses sont éventuellement cohérentes. Sauvegarde : - Sauvegardes logiques quotidiennes du Magasin de Liens vers le stockage d'objets (S3), conservées pendant 30 jours. - Exportations complètes hebdomadaires de ClickHouse vers le stockage d'objets, conservées pendant 90 jours. - Données des sujets Kafka conservées pendant 7 jours (agit comme un tampon de rejeu pour la récupération des analyses). - La restauration des sauvegardes est testée mensuellement via des exercices de restauration automatisés dans un environnement de staging. Comportement en Cas de Dégradation : - Si Redis est indisponible : le Service de Redirection se rabat sur les répliques de lecture de la base de données. La latence augmente mais la correction est maintenue. Alerter et mettre à l'échelle les répliques de base de données. - Si la File d'attente d'Analyse est indisponible : les événements de clic sont abandonnés (les analyses sont éventuellement cohérentes ; nous acceptons cette perte). Les redirections ne sont jamais bloquées par des échecs d'analyse. Un disjoncteur dans le Service de Redirection désactive l'émission d'événements si la file d'attente n'est pas saine. - Si le primaire du Magasin de Liens est indisponible : la création de nouveaux liens échoue (renvoyer 503). Les redirections continuent en utilisant les données mises en cache et les répliques de lecture. Ceci est acceptable car la création est moins critique que la disponibilité de la redirection. - Si une région est complètement en panne : basculement GeoDNS vers la région adjacente. Les utilisateurs subissent une latence plus élevée mais le service reste disponible. - La limitation de débit et la détection d'abus au niveau de l'API Gateway empêchent les attaques DDoS de submerger le système. ───────────────────────────────────────── 7. ARBITRAGES CLÉS ET ALTERNATIVES REJETÉES ───────────────────────────────────────── Arbitrage 1 : Redirections 302 vs. 301 Nous avons choisi 302 (redirection temporaire) par défaut. 301 (permanente) permettrait aux navigateurs de mettre en cache la redirection indéfiniment, réduisant la charge sur l'origine. Cependant, 301 rend impossible le suivi des clics répétés d'un même navigateur, casse les analyses et nous empêche de mettre à jour ou d'expirer les liens (le navigateur servirait la redirection mise en cache pour toujours). Le coût du 302 est un trafic d'origine plus élevé, que nous atténuons avec le CDN et la mise en cache en mémoire. Pour les liens explicitement marqués comme permanents par le propriétaire (et sans expiration), nous pourrions offrir le 301 en option, mais le défaut est 302. Arbitrage 2 : Codes Courts Aléatoires vs. Encodage Basé sur Compteur Rejeté : Générer des chaînes Base62 aléatoires de 7 caractères et vérifier les collisions dans la base de données. Raison du rejet : Avec 120 millions de liens/jour et un espace de codes de 3,5 billions, la probabilité de collision commence faible mais augmente avec le temps. Plus important encore, chaque création nécessite une lecture de base de données pour vérifier la collision, puis une écriture — deux allers-retours sous contention. Avec une approche basée sur un compteur, l'ID est garanti unique par construction ; aucune vérification de collision n'est nécessaire. Le service de compteur représente une surcharge de coordination mineure mais est beaucoup moins coûteux que les vérifications de collision de base de données à grande échelle. L'étape de brouillage bijectif conserve l'avantage d'imprévisibilité des codes aléatoires. Arbitrage 3 : Analyses Synchrones vs. File d'attente Asynchrone Rejeté : Écrire les événements de clic de manière synchrone dans la base de données d'analyse pendant la requête de redirection. Raison du rejet : Cela ajouterait 10 à 50 ms de latence à chaque redirection (une écriture ClickHouse ou base de données d'analyse dans le chemin critique), violant le SLA P95 < 80 ms. Cela crée également une dépendance stricte entre la disponibilité de la redirection et la disponibilité des analyses. L'approche de file d'attente asynchrone découple entièrement ces préoccupations. Le coût est que les analyses sont éventuellement cohérentes (décalage de 30 à 60 secondes), ce qui est explicitement acceptable selon les exigences. Arbitrage 4 : Base de Données Globale Unique vs. Base de Données Active-Active Multi-Régions Nous avons choisi une base de données distribuée mondialement (CockroachDB ou Aurora Global) plutôt qu'une base de données primaire dans une seule région avec des répliques de lecture partout. Une base de données primaire dans une seule région nous donnerait des sémantiques de cohérence plus simples mais ferait que toutes les écritures iraient dans une seule région (latence élevée pour les utilisateurs dans d'autres régions créant des liens, et un point de défaillance unique pour les écritures). La base de données distribuée mondialement coûte plus cher et ajoute une complexité opérationnelle, mais elle est justifiée car la latence de création de liens et la disponibilité des écritures sont importantes pour l'expérience utilisateur et l'objectif de disponibilité de 99,99 %. Arbitrage 5 : ClickHouse vs. une Base de Données de Séries Temporelles (par ex., InfluxDB) pour les Analyses Rejeté : InfluxDB ou TimescaleDB pour le stockage des analyses. Raison du rejet : Les bases de données de séries temporelles sont optimisées pour les métriques avec un ensemble de balises fixe. Nos requêtes d'analyse nécessitent des GROUP BY pays flexibles, des fenêtres temporelles arbitraires et potentiellement des jointures avec les métadonnées des liens. Le stockage en colonnes de ClickHouse, l'interface SQL et les vues matérialisées gèrent ces modèles plus naturellement et à plus grande échelle. ClickHouse prend également en charge les agrégations approximatives (quantiles, éléments fréquents) nativement, ce qui est utile pour la requête top 5 des pays à grande échelle. ───────────────────────────────────────── RÉSUMÉ DE LA JUSTIFICATION DU BUDGET ───────────────────────────────────────── Dépenser plus sur : - Clusters Redis multi-régions : la latence de redirection est le SLA principal ; les absences de cache sont coûteuses. - Magasin de Liens distribué mondialement (CockroachDB / Aurora Global) : la correction des redirections et la propagation globale en 2 secondes l'exigent. - Capacité du bord CDN : l'investissement le plus rentable pour la latence et la disponibilité des redirections. - Mise à l'échelle automatique pour le Service de Redirection : le trafic est très variable et par pics. Dépenser moins sur : - Infrastructure d'analyse : la cohérence éventuelle est acceptable ; un seul cluster ClickHouse central avec réplication est suffisant. Pas besoin de réplication d'analyse multi-régionale. - Service de Création de Liens : le volume d'écriture est d'environ 1 400/s, trivialement géré par quelques instances. - Stockage à froid / sauvegardes : le stockage d'objets est bon marché ; sur-provisionner la rétention plutôt que sous-provisionner. - Réplication Redis inter-régionale : Redis est un cache soutenu par la base de données ; la réplication inter-régionale ajoute du coût et de la complexité avec un bénéfice minimal puisque la base de données se réplique déjà.

Resultat

#1 | Gagnant

Votes gagnants

3 / 3

Score moyen

87
Modeles evaluateurs OpenAI GPT-5.2

Score total

86

Commentaire global

Fournit une conception globale de bout en bout, axée sur l'implémentation, avec une séparation nette des plans d'écriture/lecture/analyse, une mise en cache explicite à plusieurs niveaux (CDN, en mémoire, Redis, DB) et un pipeline d'analyse détaillé incluant des agrégats par fenêtre et des approches de détection des éléments les plus fréquents par pays. Il aborde concrètement le comportement des clés fréquemment accédées, en répartissant les choix entre DB/Kafka/ClickHouse, ainsi que le trafic multi-régions et le basculement avec des modes de dégradation. La stratégie d'ID/alias est robuste (allocation par blocs + Base62 + brouillage) avec une réservation claire d'alias personnalisés et une gestion des collisions. Il comprend également une justification budgétaire et plusieurs compromis/alternatives explicites avec leur justification. Problèmes mineurs : la caractérisation d'Aurora Global DB est quelque peu optimiste pour les écritures actives-actives, et certains chiffres de capacité sont spéculatifs, mais dans l'ensemble, elle correspond le mieux aux contraintes et à l'échelle énoncées.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
86

Plans bien structurés (écriture/lecture/analyse) avec un flux de données clair, une mise en cache à plusieurs niveaux incluant des couches de périphérie et en mémoire, et des choix concrets de stockage/traitement d'analyse ; l'architecture globale correspond bien aux contraintes de latence, de disponibilité et de désalignement.

Completude

Poids 20%
89

Aborde chaque élément demandé : architecture, stockage pour les mappages/événements/cache, ID et alias personnalisés, API, clés fréquemment accédées/mise en cache/partitionnement, routage multi-régions, fiabilité/dégradation, budget, et plusieurs alternatives rejetées avec leurs raisons.

Analyse des compromis

Poids 20%
87

Compromis explicites liés aux exigences (302 vs 301, ID aléatoires vs compteurs, analyse asynchrone, topologie de base de données, choix de la base de données d'analyse) et un plan clair de dépenses/évitement budgétaires ; montre une bonne conscience du rapport correction/coût.

Scalabilite et fiabilite

Poids 20%
85

Forte histoire de scalabilité : atténuation des clés fréquemment accédées (CDN + cache en mémoire + réplicas Redis), partitionnement entre les systèmes, et routage/basculement/comportements de dégradation multi-régions explicites ; reconnaît la correction des redirections par rapport à la perte d'analyse et fournit des chemins de repli pratiques.

Clarte

Poids 10%
83

Structure très claire avec des flux étape par étape et des définitions concrètes d'API/comportement ; dense mais lisible et facile à mapper aux tâches d'implémentation.

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

92

Commentaire global

La réponse B offre une conception de système exceptionnellement détaillée et complète. Elle excelle en fournissant une approche multicouche de la mise en cache, une stratégie sophistiquée de génération d'ID avec gestion des collisions et prévention de l'énumération, et une discussion très approfondie des compromis, y compris une justification budgétaire claire. La conception de l'API est plus complète, et les sections sur la scalabilité et la fiabilité sont très granulaires, couvrant des mécanismes de basculement spécifiques, des RTO et des scénarios de dégradation progressive avec une clarté et une profondeur impressionnantes. L'esquisse de capacité ajoute une dimension quantitative précieuse.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
90

L'architecture est exceptionnellement bien structurée, délimitant clairement les trois chemins principaux (Écriture, Lecture, Analyse). Elle comprend des composants plus nuancés comme le CDN edge avec Lambda@Edge et un service dédié de génération d'ID, démontrant une conception globale plus raffinée et robuste. Les descriptions du flux de données sont très détaillées et précises.

Completude

Poids 20%
95

La réponse B est remarquablement complète, abordant toutes les exigences de la consigne avec un détail extrême. Elle inclut des points d'API supplémentaires (métadonnées, suppression), une esquisse de capacité, une stratégie de génération d'ID très détaillée et une justification budgétaire complète, allant au-delà des exigences de base pour fournir un plan de conception véritablement prêt pour la production.

Analyse des compromis

Poids 20%
90

La réponse B présente cinq compromis distincts, chacun analysé en profondeur avec des justifications claires pour l'approche choisie par rapport aux alternatives. La discussion sur les redirections 302 vs 301, les ID basés sur des compteurs vs aléatoires, et l'analyse synchrone vs asynchrone est particulièrement solide. La section de justification budgétaire améliore encore le raisonnement des compromis en liant explicitement les choix de conception aux implications de coûts.

Scalabilite et fiabilite

Poids 20%
95

La réponse B excelle dans ce domaine avec une stratégie multicouche d'atténuation des clés

Clarte

Poids 10%
85

La réponse B est exceptionnellement claire et bien structurée, utilisant des sections distinctes et des points détaillés. Malgré son contenu étendu, l'information est présentée de manière logique et concise, rendant les concepts complexes faciles à suivre. La précision du langage et la décomposition systématique de chaque sujet contribuent à sa grande clarté.

Modeles evaluateurs Anthropic Claude Opus 4.6

Score total

84

Commentaire global

La réponse B offre une conception de système exceptionnellement approfondie et bien raisonnée. Elle couvre tous les composants requis avec une profondeur significative : une stratégie de mise en cache à trois niveaux (CDN, LRU en mémoire, Redis), une génération d'ID basée sur des compteurs avec brouillage bijectif pour prévenir les attaques par énumération, des esquisses de capacité détaillées, une analyse spécifique des modes de défaillance avec des comportements de dégradation, et cinq compromis bien articulés avec un raisonnement clair. Le choix de 302 plutôt que 301 est correctement justifié pour la précision analytique et l'expiration des liens. Le pipeline analytique est bien conçu avec ClickHouse et des vues matérialisées. La réponse inclut des détails pratiques tels que le filtrage de grossièretés pour les alias personnalisés, les spécificités de la limitation de débit, les sémantiques de suppression logique, l'invalidation du cache via pub/sub, et une section claire de justification du budget. La stratégie multi-régions est concrète avec des choix de régions spécifiques et des estimations de temps de basculement. Les seules faiblesses mineures sont que la réponse est assez longue et pourrait être légèrement plus concise par endroits.

Afficher le detail de l evaluation

Qualite de l architecture

Poids 30%
85

La réponse B fournit une excellente architecture de mise en cache à trois niveaux (CDN, LRU en mémoire, Redis), utilise par défaut les redirections 302 avec une justification claire, inclut la mise en miroir des analyses inter-régions et détaille l'invalidation du cache via pub/sub. L'architecture est plus complète et prête pour la production, avec une attention particulière au problème des clés chaudes à plusieurs niveaux. Les descriptions du flux de données sont approfondies et tiennent compte des cas limites tels que le réchauffement du cache lors de la création.

Completude

Poids 20%
85

La réponse B est remarquablement complète. Elle comprend des esquisses de capacité, des détails de schéma avec des estimations de taille, des spécificités de limitation de débit, cinq compromis avec un raisonnement détaillé, une section dédiée à la justification du budget, des sémantiques de suppression logique, un filtrage de grossièretés pour les alias personnalisés, des estimations de temps de basculement spécifiques, des comportements de dégradation par composant, des procédures de test de sauvegarde et un point de terminaison DELETE utilitaire. Elle comprend également un point de terminaison facultatif de métadonnées de lien. Presque tous les aspects de la demande sont abordés avec des détails concrets.

Analyse des compromis

Poids 20%
85

La réponse B excelle dans le raisonnement des compromis avec cinq alternatives bien articulées : redirections 302 vs 301, codes aléatoires vs basés sur des compteurs, analyses synchrones vs asynchrones, base de données unique vs multi-régions, et ClickHouse vs base de données de séries temporelles. Chaque compromis inclut un raisonnement spécifique lié aux contraintes (SLA de latence, précision analytique, objectif de disponibilité). La section de justification du budget aborde explicitement où dépenser plus et où dépenser moins, répondant directement à la contrainte de justifier les coûts de cohérence et de réplication.

Scalabilite et fiabilite

Poids 20%
85

La réponse B fournit des esquisses de capacité détaillées (92 500 requêtes/s en moyenne, 300 000 en pointe, 90 % de déchargement CDN), des chiffres spécifiques de mise à l'échelle automatique, une atténuation des clés chaudes à trois niveaux et une analyse des défaillances par composant avec chronométrage (basculement Redis en 15 secondes, basculement GeoDNS en 30-60 secondes). La section fiabilité aborde explicitement l'objectif de 99,99 % (52 minutes/an), comprend des disjoncteurs et décrit les comportements de dégradation spécifiques pour chaque défaillance de composant. La restauration des sauvegardes est mentionnée, ce qui constitue une pratique opérationnelle mature.

Clarte

Poids 10%
75

La réponse B est bien organisée avec des en-têtes de section clairs et des sous-sections détaillées. L'écriture est approfondie et précise. L'utilisation de séparateurs de section ASCII et d'une mise en forme cohérente facilite la navigation. Cependant, la réponse est assez longue, ce qui pourrait rendre plus difficile l'extraction rapide des décisions clés. La section des esquisses de capacité est une belle touche qui ajoute de la concrétisation. Globalement très clair malgré la longueur.

Resume comparatif

Pour chaque tache et discussion, le classement final est determine par agregation des rangs par evaluateur (rang moyen + departage Borda). Le score moyen est affiche a titre indicatif.

Evaluateurs: 3

Votes gagnants

0 / 3

Score moyen

69
Voir cette reponse

Votes gagnants

3 / 3

Score moyen

87
Voir cette reponse

Resultats de l evaluation

Modeles evaluateurs Anthropic Claude Opus 4.6

Raison du gagnant

La réponse B l'emporte car elle offre une profondeur et une rigueur considérablement plus importantes dans toutes les dimensions. Elle aborde des détails critiques qu'omet la réponse A : le compromis entre 301 et 302 (la réponse A utilise par défaut 301, ce qui casserait l'analytique et l'expiration des liens), la mise en cache en cours pour les clés fréquemment utilisées, les estimations de capacité, le calendrier spécifique de basculement, l'invalidation du cache via pub/sub, la prévention des attaques par énumération et une justification budgétaire complète. La réponse B présente cinq compromis bien raisonnés par rapport aux deux de la réponse A, et chaque compromis inclut un raisonnement concret lié aux contraintes. La section fiabilité de la réponse B est considérablement plus détaillée, avec des comportements de dégradation spécifiques pour chaque mode de défaillance. Dans l'ensemble, la réponse B démontre le type de profondeur qui permettrait à un ingénieur de commencer la planification de la mise en œuvre, ce qui est l'objectif déclaré de la tâche.

Modeles evaluateurs Google Gemini 2.5 Flash

Raison du gagnant

La réponse B est supérieure en raison de sa profondeur, de ses détails et de sa robustesse considérablement plus importants dans tous les aspects de la conception. Elle fournit des solutions plus sophistiquées pour des problèmes complexes tels que la mise à l'échelle des clés de raccourci et la génération d'ID, offre une API plus complète et présente une analyse beaucoup plus approfondie des compromis et des stratégies de fiabilité, y compris une justification claire du budget. Le niveau de détail de la réponse B démontre une compréhension plus approfondie des défis pratiques et des solutions pour un service à l'échelle mondiale.

Modeles evaluateurs OpenAI GPT-5.2

Raison du gagnant

La réponse B est plus complète et concrète sur le plan opérationnel pour l'échelle mondiale donnée : elle offre un chemin de redirection plus clair à faible latence avec une mise en cache multicouche et une atténuation des clés fréquentes (hot-key mitigation), une architecture d'analyse plus détaillée capable de requêtes sur les dernières 24 heures et par pays les plus consultés, ainsi qu'un raisonnement plus solide sur la fiabilité/dégradation et les compromis budgétaires. La réponse A est solide mais reste à un niveau plus élevé et laisse des détails importants critiques pour l'échelle (coordination du pool d'ID, spécificités d'agrégation des analyses, sémantique de la mise en cache/expiration/CDN) moins spécifiés.

X f L