Orivel Orivel
メニューを開く

グローバルなURL短縮サービスの設計

このシステム設計ベンチマークに対する各AIの回答と比較結果を確認できます。

いいね・お気に入り機能を使うにはログインまたは新規登録が必要です。 新規登録

X f L

目次

お題概要

比較ジャンル

システム設計

お題作成モデル

回答モデル

採点モデル

お題本文

Bitlyに類似した公開URL短縮サービスを設計してください。ユーザーは長いURLを送信して短いエイリアスを受け取り、誰でも短縮リンクを使って元のURLへリダイレクトできるようにします。 あなたの設計は次の要件と制約を満たす必要があります: 機能要件: - 任意の有効なURLに対して短縮リンクを作成すること。 - 低レイテンシで短縮リンクをリダイレクトすること。 - 利用可能な場合に任意のカスタムエイリアスをサポートすること。 - リンクごとの基本的なクリック解析を提供すること:総クリック数、過去24時間のクリック数、およびクリック数上位5か国。 -...

さらに表示

Bitlyに類似した公開URL短縮サービスを設計してください。ユーザーは長いURLを送信して短いエイリアスを受け取り、誰でも短縮リンクを使って元のURLへリダイレクトできるようにします。 あなたの設計は次の要件と制約を満たす必要があります: 機能要件: - 任意の有効なURLに対して短縮リンクを作成すること。 - 低レイテンシで短縮リンクをリダイレクトすること。 - 利用可能な場合に任意のカスタムエイリアスをサポートすること。 - リンクごとの基本的なクリック解析を提供すること:総クリック数、過去24時間のクリック数、およびクリック数上位5か国。 - リンクの有効期限を設定可能にすること。 スケール想定: - 1日あたり1億2,000万件の新規短縮リンク作成。 - 1日あたり80億件のリダイレクト要求。 - 読み取り中心のワークロードで強いトラフィックスキュー:リンクのごく一部が非常に高いトラフィックを受ける。 - ユーザーは北米、ヨーロッパ、アジアにまたがるグローバルな分布。 制約: - リダイレクトに対して99.99%の可用性目標。 - 主要地域のユーザーに対するP95リダイレクトレイテンシを80 ms未満。 - 新規作成されたリンクはグローバルに2秒以内に利用可能になること。 - 解析は最終的整合性で構わないが、リダイレクトは正確でなければならない。 - 予算は重要:どこにより強い整合性やマルチリージョン複製に費用をかけるか、どこを避けるかを正当化すること。 - サードパーティのマネージド解析製品は利用しないものとし、コアシステムを設計すること。 以下を提供してください: - 主要コンポーネントとデータフローを含む高レベルのアーキテクチャ。 - リンクマッピング、解析イベント、およびホットリンクのキャッシュに関するストレージの選択。 - 衝突処理やカスタムエイリアスのチェックを含むID生成またはエイリアス戦略。 - create-link、redirect、and analytics retrieval のAPI設計。 - ホットキー、キャッシュ、パーティショニング、およびマルチリージョントラフィックに対するスケーリング手法。 - フェイルオーバー、データ複製、バックアップ、および劣化時の振る舞いを含む信頼性戦略。 - 主要なトレードオフと、検討して却下した少なくとも2つの代替設計選択肢。

補足情報

コンテキスト: サービスはWebクライアントとAPIクライアントのみを必要とし、モバイルSDKは不要であると仮定してください。ロードバランサ、キュー、オブジェクトストレージ、CDN、およびリージョン別データベースなどの標準的なクラウドプリミティブが利用可能であると仮定してよいです。正確なハードウェア台数を見積もる必要はありませんが、設計はエンジニアが実装計画を開始できる程度に具体的であるべきです。

採点方針

評価方針: 強い回答は、示されたスケールとレイテンシ目標に合致する一貫したエンドツーエンドのアーキテクチャを提示し、リダイレクト経路と解析パイプラインを明確に分離し、整合性、コスト、可用性の観点からストレージと複製の選択を正当化します。グローバル展開、非常にホットなリンクに対するキャッシュ戦略、エイリアス生成と衝突処理、および実用的なAPI動作について対処している必要があります。より良い回答は、発生しうるボトルネック、障害モード、および優雅な劣化の方法を議論し、単にコンポーネントを列挙するだけでなく選択肢間のトレードオフを説明します。 弱い回答は、トラフィックスケールを無視する、解析とリダイレクトの正確さを同じ方法で扱う、マルチリージョンの懸念を省略する、または特定のアーキテクチャ選択が制約にどのように適合するかを説明しないものです。

回答

### 1. ハイレベルアーキテクチャ システムは、低レイテンシーと高可用性を確保するために、グローバルに分散されたマルチリージョンサービスとして設計されています。主要な各リージョン(例:US-East、EU-West、AP-Southeast)に完全なPoint of Presence(PoP)がホストされます。 **コンポーネント:** 1. **グローバルロードバランサー(GLB):** レイテンシーベースのDNSルーティングを使用して、ユーザーを最も近い正常なリージョンPoPに誘導します。 2. **リージョナルPoPスタック:** * **APIゲートウェイ:** TLSを終端し、リクエストを認証し、適切なバックエンドサービスにルーティングします。 * **リダイレクトサービス:** `GET /{short_al...

全文を表示

### 1. ハイレベルアーキテクチャ システムは、低レイテンシーと高可用性を確保するために、グローバルに分散されたマルチリージョンサービスとして設計されています。主要な各リージョン(例:US-East、EU-West、AP-Southeast)に完全なPoint of Presence(PoP)がホストされます。 **コンポーネント:** 1. **グローバルロードバランサー(GLB):** レイテンシーベースのDNSルーティングを使用して、ユーザーを最も近い正常なリージョンPoPに誘導します。 2. **リージョナルPoPスタック:** * **APIゲートウェイ:** TLSを終端し、リクエストを認証し、適切なバックエンドサービスにルーティングします。 * **リダイレクトサービス:** `GET /{short_alias}`リクエストを処理する、軽量で高度にスケーリングされたサービスです。速度に最適化されています。 * **書き込みサービス:** カスタムエイリアスの検証と一意のID生成を含む、リンク作成(`POST /api/v1/links`)を処理します。 * **アナリティクスサービス:** `GET /api/v1/links/{short_alias}/stats`経由でリンク統計へのアクセスを提供します。 3. **データインフラストラクチャ:** * **グローバルデータベース:** コアとなるリンクマッピングのための、強く一貫性のある分散データベース。 * **リージョナルキャッシュ:** 各リージョンにあるホットリンク用インメモリキャッシュ。 * **アナリティクスパイプライン:** イベント取り込み用のメッセージキュー、集計用ストリームプロセッサ、アナリティクスデータを保存および提供するためのNoSQLデータベース。 **データフロー:** * **リンク作成:** ユーザーの`POST`リクエストは、最も近い書き込みサービスにルーティングされます。サービスはエイリアスを生成または検証し、`short_alias -> long_URL`マッピングをグローバルデータベースに書き込みます。書き込みは2秒以内にすべてのリージョン間で同期的にレプリケートされます。 * **リダイレクト:** `GET`リクエストは、最も近いリダイレクトサービスにルーティングされます。まずリージョナルキャッシュを確認します。キャッシュヒットの場合、直ちに301リダイレクトを発行し、クリックイベントを非同期にアナリティクスキューに送信します。ミスの場合、グローバルデータベースのローカルレプリカにクエリを実行し、キャッシュを投入してから、リダイレクトとイベントロギングを実行します。 * **アナリティクス:** すべてのリージョンからのクリックイベントは、中央メッセージキューに発行されます。ストリームプロセッサはこれらのイベントを消費し、時間ウィンドウ化された統計(総クリック数、24時間クリック数、国別カウント)に集計し、結果をアナリティクスデータベースに書き込みます。 ### 2. ストレージの選択肢 * **リンクマッピング(プライマリストレージ):** * **テクノロジー:** Google Cloud SpannerやCockroachDBのようなグローバルに分散されたSQLデータベース。 * **正当性:** リダイレクトにおける強い一貫性と、2秒未満のグローバル書き込み伝播要件によってこの選択が推進されています。これらのデータベースは同期レプリケーションと低レイテンシーのリージョナル読み取りを提供し、コアビジネス機能に対する高いコストを正当化します。`short_alias`は高速ルックアップのプライマリキーとして機能します。 * **キャッシュされたホットリンク:** * **テクノロジー:** Redis Clusterのようなリージョナルインメモリ分散キャッシュ。 * **正当性:** 1日あたり80億回の読み取りとヘビーなトラフィックの偏りを考慮すると、キャッシュはP95レイテンシー目標の80ms未満を達成し、データベースを保護するために不可欠です。各リージョンは、キャッシュアサイドパターンを使用して独自のキャッシュを維持します。 * **アナリティクスデータ:** * **取り込みキュー:** Apache KafkaまたはAWS Kinesis。これにより、高スループットのリダイレクトパスとアナリティクス処理が分離され、クリックイベントの耐久性のあるバッファが提供されます。 * **提供データベース:** Apache CassandraやScyllaDBのようなワイドカラムNoSQLストア。アナリティクスの高書き込み、時系列集計ワークロードに最適化されており、これらのクエリパターンに対してリレーショナルデータベースよりもスケーリング時にコスト効率が高いです。 ### 3. ID生成とエイリアス戦略 アルファベット`[a-zA-Z0-9]`から7文字のエイリアスを使用し、`62^7`(3.5兆以上)の一意の組み合わせを提供します。 * **ID生成:** バックグラウンドサービスが大量の一意のランダムIDプールを事前に生成し、専用キュー(例:Redisリスト)に保存します。書き込みサービスは、新しいリンクが作成されるときに、このプールから事前に生成されたIDを単純に取得します。このアプローチは高速でスケーラブルであり、ユーザーリクエスト中のオンザフライでの衝突チェックを回避します。 * **カスタムエイリアス処理:** ユーザーがカスタムエイリアスを送信すると、書き込みサービスはそれをグローバルデータベースに`INSERT`しようとします。`short_alias`列は一意制約を持つプライマリキーです。これにより、チェックアンドセット操作がアトミックに処理されます。エイリアスが使用されている場合、データベースは書き込みを拒否し、サービスはユーザーに`409 Conflict`エラーを返します。 ### 4. API設計 * **リンク作成:** `POST /api/v1/links` * **ボディ:** `{

判定

2位

勝利票

0 / 3

平均スコア

69
採点モデル OpenAI GPT-5.2

総合点

70

総評

リダイレクトパスと分析パスの明確な分離、優れたコアストレージの選択(マッピング用のグローバルで強く一貫したDB、リージョンごとのRedisキャッシュ、非同期分析パイプライン)、および必要なAPIと2つの却下された代替案を含む、一貫したマルチリージョンアーキテクチャを提示しています。しかし、いくつかの領域は、この規模では仕様が不十分またはやや曖昧です。IDの事前生成プールの詳細と安全性(重複排除、マルチリージョン調整、補充動作)は対処されていません。分析設計は一般的であり、過去24時間と上位国を効率的に計算する方法を明確に説明していません。有効期限のセマンティクスとキャッシュ/CDNの相互作用は深くカバーされていません。マルチリージョンのレプリケーションと一貫性/予算の正当化は、「Spanner/Cockroachを使用する」以上の比較的浅いものです。信頼性/低下は合理的ですが、グローバルDBの具体的なRTO/RPOと運用上の詳細、および分析のバックプレッシャー/データ損失ポリシーが欠けています。

採点詳細を表示

設計の質

重み 30%
72

個別のリダイレクト/書き込み/分析サービスと非同期イベント処理を備えた、健全なリージョンPoPモデルですが、いくつかの主要コンポーネントは、実用的なグローバル書き込み/読み取り動作とエッジキャッシュ/TTLの相互作用を詳細化せずに、「グローバルデータベース」(すべての場所で同期レプリケーションを使用)のように一般的なレベルで説明されています。

完全性

重み 20%
68

すべての要求されたセクションをカバーしていますが、分析クエリ/集計アプローチは完全には指定されていません(特に過去24時間/上位5カ国)。有効期限の処理は薄く、IDの事前生成メカニズムには運用上の詳細(調整、競合、補充、マルチリージョン)が欠けています。

トレードオフの説明力

重み 20%
65

2つの代替案が合理的な根拠とともに却下されており、含まれています。しかし、予算/一貫性のトレードオフは、主に(グローバルな強力なDBに費用をかける)と主張されており、何が最終的になりうるか、またはキャッシュ以外でコストを最小限に抑える方法についての議論は限られています。

拡張性・信頼性

重み 20%
70

リージョンキャッシュと非同期分析は読み取り負荷の高いスキューをサポートします。信頼性にはフェイルオーバーと低下が含まれますが、CDN/Redis以外のホットキー飽和の深い処理や、マルチリージョン障害時の動作とレプリケーションモード/コストに関する詳細情報は限られています。

分かりやすさ

重み 10%
76

整理されており、読みやすく、明確な見出しとフローがありますが、一部の記述は単純化されすぎています(グローバルで2秒以内の同期レプリケーション)。これにより精度が低下しています。

総合点

73

総評

回答Aは、すべての主要な要件に対応した、堅牢で構造化されたシステム設計を提供しています。リダイレクトパスと分析パスを明確に分離し、適切なストレージを選択し、合理的なID生成とスケーリング戦略を概説しています。議論されているトレードオフは関連性があり、適切に正当化されています。しかし、マルチレイヤーキャッシュ(ホットキー向け)、より堅牢なID生成、包括的な予算の正当化といった、回答Bに見られるような深さと詳細さが一部欠けています。

採点詳細を表示

設計の質

重み 30%
75

アーキテクチャは、懸念事項(リダイレクト、書き込み、分析サービス)の明確な分離と、リージョナルPoPおよびグローバルデータベースの適切な使用により、よく定義されています。データフローは論理的であり、コア要件に対応しています。

完全性

重み 20%
70

回答Aは要求されたすべてのセクションを網羅しており、包括的なハイレベル設計を提供しています。しかし、ID生成やAPI設計などの一部のセクションは、より詳細な情報と追加の検討事項があればさらに良くなるでしょう。

トレードオフの説明力

重み 20%
70

2つの関連する代替案を特定し、主にレイテンシと一貫性の要件に焦点を当てて、それらを却下する明確な根拠を提供しています。その理由は妥当ですが、範囲は限定的です。

拡張性・信頼性

重み 20%
75

ホットキー(CDN、リージョナルキャッシュ)とマルチリージョントラフィックのスケーリングに関する良好な戦略を概説しています。フェイルオーバー、データレプリケーション、段階的縮退などの信頼性に関する側面も言及されており、堅固な基盤を提供しています。

分かりやすさ

重み 10%
75

回答は明確な見出しと箇条書きで整理されており、読みやすく理解しやすいです。言語は正確で、曖昧さを避けています。

総合点

64

総評

回答Aは、主要なコンポーネントをすべて網羅した、首尾一貫した構造化されたシステム設計を提示しています。リダイレクトパスと分析パイプラインを正しく分離し、適切なテクノロジー(Spanner/CockroachDB、Redis、Kafka、Cassandra)を選択し、クリーンなAPI設計を提供しています。プリジェネレートされたプールを使用したID生成戦略も合理的です。しかし、いくつかの領域で深みに欠けています。CDNとRedisキャッシングに言及する以外はホットキー問題について議論しておらず、容量の見積もりを提供しておらず、301と302のトレードオフに対処しておらず(分析とリンクの有効期限を壊す301をデフォルトにしている)、キャッシュ無効化戦略の詳細を提供しておらず、インプロセスキャッシングに言及しておらず、却下された代替案を2つしか提示しておらず、信頼性セクションは特定の障害シナリオやRTO/RPOの詳細なしに比較的薄いです。予算の正当化が欠けています。設計は正しいですが、詳細な実装計画というよりは概要のように読めます。

採点詳細を表示

設計の質

重み 30%
70

回答Aは、リダイレクト、書き込み、分析パス間の関心の適切な分離を備えた、クリーンで首尾一貫したアーキテクチャを提示しています。リンクストアにSpanner/CockroachDB、分析取り込みにKafkaを選択したのは妥当です。しかし、マルチティアキャッシング戦略(インプロセスキャッシュなし)が欠けており、デフォルトで301リダイレクトを使用することは、分析追跡とリンクの有効期限を壊す重大な設計上の欠陥です。アーキテクチャは高レベルでは正しいですが、重要なニュアンスが欠けています。

完全性

重み 20%
60

回答Aは、すべての7つの必須セクションを網羅していますが、深さは限定的です。容量見積もり、レート制限の議論、301と302の考慮事項の省略、スキーマ詳細の欠如、予算の正当化の欠如、却下された代替案の提示は2つのみです。API設計は、レート制限または承認のエラーコードなしでは最小限です。キャッシュ無効化戦略については議論されていません。信頼性セクションには、フェイルオーバーの特定のタイミングや、コンポーネントごとの劣化の詳細が欠けています。

トレードオフの説明力

重み 20%
55

回答Aは、ハッシュベースのID生成と単一マスターリレーショナルデータベースという2つの却下された代替案しか提示していません。どちらも妥当ですが、理由はやや表面的です。回答は、重要な301と302のトレードオフを議論しておらず、分析ストレージオプションを比較しておらず、同期分析と非同期分析のトレードオフに対処していません。制約によって明示的に要求されているにもかかわらず、整合性に費やすべき点と節約すべき点の予算の正当化が完全に欠落しています。

拡張性・信頼性

重み 20%
60

回答Aは、ホットキーのためにCDNキャッシングとリージョナルRedisに言及していますが、具体性に欠けています。容量見積もり、自動スケーリングの議論はなく、ホットキー緩和策は2つのレイヤーに限定されています。信頼性セクションは、フェイルオーバー、レプリケーション、バックアップ、および段階的な劣化を高レベルでカバーしていますが、特定のタイミング、RTO/RPOターゲット、またはコンポーネントごとの障害分析はありません。99.99%の可用性ターゲットは、アーキテクチャがそれをどのように達成するかという点で明示的に対処されていません。

分かりやすさ

重み 10%
75

回答Aは、明確なセクションヘッダーと簡潔な文章でよく整理されています。データフローの説明は理解しやすいです。太字と箇条書きの使用は可読性を高めています。しかし、簡潔さが重要な詳細の犠牲になることがあります。文章はクリーンでプロフェッショナルです。

グローバルURL短縮サービス — システム設計 ───────────────────────────────────────── 1. ハイレベルアーキテクチャとデータフロー ───────────────────────────────────────── システムは3つのプレーンで構成されています:ライトパス(リンク作成)、リードパス(リダイレクト)、アナリティクスパス(イベント取り込みとクエリ)。 主要コンポーネント: - グローバルAnycastロードバランサー / CDNエッジ(例:CloudflareまたはLambda@Edgeを備えたAWS CloudFront) - APIゲートウェイ + 認証レイヤー(レート制限、不正利用防止) - リンク作成サービス(ステートレス、水平スケーラブル) - リダイレクトサービス(ステートレス、極めてレイテンシに敏感)...

全文を表示

グローバルURL短縮サービス — システム設計 ───────────────────────────────────────── 1. ハイレベルアーキテクチャとデータフロー ───────────────────────────────────────── システムは3つのプレーンで構成されています:ライトパス(リンク作成)、リードパス(リダイレクト)、アナリティクスパス(イベント取り込みとクエリ)。 主要コンポーネント: - グローバルAnycastロードバランサー / CDNエッジ(例:CloudflareまたはLambda@Edgeを備えたAWS CloudFront) - APIゲートウェイ + 認証レイヤー(レート制限、不正利用防止) - リンク作成サービス(ステートレス、水平スケーラブル) - リダイレクトサービス(ステートレス、極めてレイテンシに敏感) - ID生成サービス(分散型、ユニークなショートコード生成器) - プライマリリンクストア(グローバルにレプリケートされたリレーショナルDB、例:CockroachDBまたはAWS Aurora Global) - ホットリンクキャッシュ(Redis Cluster、リージョンごと) - アナリティクス取り込みキュー(KafkaまたはAWS Kinesis、リージョンごと) - アナリティクス集計ワーカー(ストリームプロセッサ、例:FlinkまたはKafka Streams) - アナリティクスストア(カラムナストア、例:ClickHouseまたはApache Druid) - アナリティクスクエリサービス(読み取り専用API) - コールドバックアップ用オブジェクトストレージ(S3互換) ライトパス(リンク作成): 1. クライアントが最寄りのリージョナルAPIゲートウェイにPOSTリクエストを送信します。 2. APIゲートウェイがリクエストを認証し、レート制限を適用した後、リンク作成サービスに転送します。 3. リンク作成サービスがID生成サービスを呼び出し、ユニークなショートコードを取得します(またはカスタムエイリアスを検証します)。 4. レコードはローカルリージョンで強力な一貫性をもってプライマリリンクストアに書き込まれます。グローバルDBレプリケーションにより、約1〜2秒以内にレコードが他のリージョンに伝播され、「2秒以内にグローバルで利用可能」というSLAを満たします。 5. 同時に、そのリージョンでの最初のリダイレクトがキャッシュミスしないように、新しいマッピングがリージョナルRedisキャッシュにプッシュされます(ライトスルーまたはパブ/サブ無効化)。 6. ショートURLと共に201レスポンスがクライアントに返されます。 リードパス(リダイレクト): 1. クライアントが最寄りのエッジノードにGET /{shortCode} を発行します。 2. エッジノードが自身のCDNキャッシュを確認します(極めてホットなリンクの場合、TTLは約5〜10秒で、有効期限のセマンティクスを尊重します)。 3. CDNミスの場合、リクエストはリージョナルリダイレクトサービスに到達します。 4. リダイレクトサービスがリージョナルRedisキャッシュを確認します(ホットリンクの期待ヒット率 > 99%)。 5. Redisミスの場合、リダイレクトサービスはプライマリリンクストアのローカルリードレプリカにクエリします。 6. リンクが期限切れまたは見つからない場合は、404/410を返します。 7. それ以外の場合は、HTTP 301(パーマネント)または302(テンポラリ)リダイレクトを発行します。デフォルトで302を使用するのは、ブラウザが無期限にキャッシュしないようにし、アナリティクスの精度を維持するためです。 8. クリックイベント(shortCode、タイムスタンプ、IPから派生した国、ユーザーエージェント)を非同期にリージョナルアナリティクス取り込みキューに発行します。これはファイアアンドフォーゲットであり、リダイレクトレスポンスをブロックしません。 アナリティクスパス: 1. リージョナルKafkaトピックがクリックイベントを受信します。 2. Flink/Kafka Streamsジョブがイベントを消費し、ローリング集計を維持します:総クリック数(カウンター)、過去24時間のクリック数(スライディングウィンドウ)、上位国(近似ヘビーヒッター スケッチ、例:Count-Min SketchまたはSpaceSaving)。 3. 集計結果は30〜60秒ごとにClickHouse(追記最適化カラムナストア)に書き込まれます。 4. アナリティクスクエリサービスはClickHouseから読み取り、事前に集計された結果を返します。生のイベントもアドホッククエリのためにClickHouseに保持されます。 5. クロスリージョンアナリティクス集計:各リージョンのKafkaクラスタは、Kafka MirrorMaker 2またはKinesisクロスリージョンレプリケーションを介して、中央アナリティクスリージョンにイベントをミラーリングします。中央ClickHouseクラスタがグローバルビューを保持します。 ───────────────────────────────────────── 2. ストレージの選択肢 ───────────────────────────────────────── リンクマッピング — CockroachDB(またはAurora Global DB): 理由:書き込みの一貫性(重複エイリアスの防止)とグローバルでの低レイテンシ読み取りが必要です。CockroachDBは、マルチリージョンアクティブアクティブサポート、シリアライザブル分離、自動フェイルオーバーを備えた分散SQLデータベースです。Aurora Global DBは、単一のプライマリライターと、約1秒のレプリケーションラグを持つ異なるリージョンの最大5つのリードレプリカを持つ代替手段です。どちらも2秒のグローバル伝播SLAを満たします。 スキーマ(簡略化): links(short_code VARCHAR(12) PK, long_url TEXT NOT NULL, owner_id BIGINT, created_at TIMESTAMPTZ, expires_at TIMESTAMPTZ, is_custom BOOLEAN) インデックス:short_code (PK, クラスタ化), owner_id + created_at (ユーザーダッシュボード用)。 推定サイズ:120Mリンク/日 × 365日 × 約300バイト/行 ≈ 年間約13TB。created_atによるパーティショニングで管理可能。 ホットリンクキャッシュ — Redis Cluster(リージョンごと): 各リージョンは3〜6シャードとレプリカを持つRedis Clusterを実行します。キャッシュエントリ:short_code → {long_url, expires_at}。TTLはmin(リンク有効期限, 24時間)に設定されます。期待されるワーキングセット:上位1%のリンク(約120万)がトラフィックの約80%を占めます。エントリあたり約500バイトで、120万エントリ ≈ リージョンあたり600MB — 非常に手頃です。リンク作成時のライトスルー戦略と、最初のリダイレクトミス時の遅延ロードを使用します。 アナリティクスイベント — Kafka + ClickHouse: Kafkaは生のクリックイベントを7日間保持します(再生可能)。ClickHouseは、生のイベント(日付でパーティション化、short_codeでシャード化)と事前に集計されたマテリアライズドビューの両方を格納します。ClickHouseのカラムナストレージとベクトル化実行は、必要な集計クエリ(SUM、COUNT、GROUP BY国、スライディングウィンドウ)に理想的です。 コールドバックアップ — S3互換オブジェクトストレージ: リンクストアのスナップショットとClickHouseの週次エクスポートは、バージョン管理とクロスリージョンレプリケーションを備えたオブジェクトストレージに保存され、災害復旧に使用されます。 ───────────────────────────────────────── 3. ID生成とエイリアス戦略 ───────────────────────────────────────── ショートコード形式: Base62アルファベット(a-z、A-Z、0-9)から7文字を使用します。Base62^7 = 約3.5兆の組み合わせで、予見可能なニーズ(120M/日 × 10年 = 約438Bリンク)をはるかに超えています。 ID生成戦略 — 分散カウンタ + エンコーディング: スケールでの衝突ストームを回避するために、ランダム生成ではなく分散カウンタアプローチを使用します。 ステップ1:各リンク作成サービスインスタンスは、軽量なコーディネーションサービス(例:ZooKeeperをバックエンドとするRedis INCRBYまたは専用IDサービス)からIDブロックを取得します。各インスタンスは一度に10,000 IDのブロックを要求し、コーディネーションオーバーヘッドを削減します。 ステップ2:数値IDをBase62エンコードしてショートコードを生成します。7文字のBase62コードは最大約3.5兆のIDを表すことができます。 ステップ3:列挙攻撃を防ぎ、予測不可能性を追加するために、数値IDを秘密のソルトとXORするか、双対性スクランブル関数(ID空間に対するFeistel暗号)を使用します。 カスタムエイリアス: 1. クライアントが希望するエイリアス(英数字3〜20文字)を送信します。 2. リンク作成サービスは、DBのユニーク制約を使用して、カスタムエイリアスをshort_codeとしてINSERTを試みます。 3. ユニーク制約違反によりINSERTが失敗した場合、HTTP 409 Conflictを返し、別のエイリアスを試すように提案します。 4. カスタムエイリアスはID生成サービスを完全にバイパスします。 5. カスタムエイリアスは、DB書き込み前に別の名前空間チェック(不適切表現リスト、「api」、「admin」、「health」などの予約語)で予約されます。 生成されたコードの衝突処理: 単調増加カウンタと双対性エンコーディングを使用しているため、生成されたコードの衝突は構造的に不可能です。生成されたコードがカスタムエイリアスと一致する場合にのみ衝突が発生する可能性があります — これはユニーク制約によって処理されます。ID生成サービスは単に次のIDにインクリメントして再試行します(極めてまれ)。 ───────────────────────────────────────── 4. API設計 ───────────────────────────────────────── すべてのAPIはHTTPS上のRESTfulです。レート制限はAPIゲートウェイレイヤーで適用されます(例:認証済みユーザーあたり毎分100件の作成、匿名ユーザーあたり毎分10件の作成)。 POST /v1/links — ショートリンクの作成 リクエストボディ(JSON): long_url: string (必須、有効なURLであること、最大2048文字) custom_alias: string (オプション、英数字3〜20文字) expires_at: ISO 8601 datetime (オプション) owner_id: string (オプション、認証トークンから取得) レスポンス 201 Created: short_code: string short_url: string (例:「https://sho.rt/aB3xY7z」) long_url: string expires_at: string または null created_at: string レスポンス 400: 無効なURLまたはエイリアス形式 レスポンス 409: カスタムエイリアスが既に使用されています レスポンス 429: レート制限を超過しました GET /{shortCode} — リダイレクト リクエストボディなし。パスパラメータ:shortCode。 レスポンス 302 Found、Locationヘッダーにlong_urlを設定。 レスポンス 404: ショートコードが見つかりません。 レスポンス 410 Gone: リンクが期限切れました。 このエンドポイントは、URLを最小限にするために、ルートドメイン(例:sho.rt/{shortCode})で提供されます。 GET /v1/links/{shortCode}/analytics — アナリティクスの取得 認証必須(オーナーまたは管理者)。 クエリパラメータ: なし(デフォルトの概要を返します) レスポンス 200: short_code: string total_clicks: integer clicks_last_24h: integer top_countries: オブジェクトの配列、各オブジェクトはcountry_code(ISO 3166-1 alpha-2)とclick_countを持ち、降順にソートされ、最大5エントリ last_updated: ISO 8601 datetime(アナリティクスの鮮度を示す) レスポンス 404: リンクが見つかりません。 レスポンス 403: 認可されていません。 GET /v1/links/{shortCode} — リンクメタデータの取得(オプションのユーティリティエンドポイント) 認証必須。 レスポンス 200: long_url、created_at、expires_at、is_customを含む完全なリンクオブジェクト。 DELETE /v1/links/{shortCode} — リンクの削除/無効化 認証必須(オーナーまたは管理者)。 レスポンス 204 No Content。 レコードをソフト削除(deleted_atタイムスタンプを設定)し、パブ/サブ経由でキャッシュエントリを無効化します。 ───────────────────────────────────────── 5. スケーリングアプローチ ───────────────────────────────────────── ホットキー問題: 少数のリンク(バイラルURL、マーケティングキャンペーン)は、毎分数百万のリダイレクトを受け取ります。単純なRedisシャーディングでは、1つのキーのすべてのトラフィックが1つのシャードに配置されます。 緩和策: - 各リダイレクトサービスインスタンス内のローカルインプロセスキャッシュ(例:10,000エントリのLRUを備えたCaffeine、TTL 5秒)。これにより、最もホットなキーをプロセス内で完全に吸収し、Redisへのラウンドトリップを排除します(上位約0.1%のリンク)。 - 短いTTL(5〜10秒)を持つCDNエッジキャッシュ。リダイレクトレスポンス自体に適用されます。1日あたり80億リダイレクトの場合、90%のCDNヒット率でもオリジンからのリクエストを72億件オフロードします。 - Redisリードレプリカ:ホットキーシャードをより多くのレプリカに昇格させ、ラウンドロビンで読み取りをルーティングします。 キャッシュ戦略: 3層キャッシュ:CDNエッジ → インプロセスLRU → Redis Cluster → DBリードレプリカ。 キャッシュのポピュレーション:作成時のライトスルー、最初のミス時の遅延ロード。 キャッシュの無効化:リンクの削除または有効期限切れ時に、Redisパブ/サブチャネルに無効化メッセージを発行します。すべて のリダイレクトサービスインスタンスが購読し、ローカルLRUからキーを削除します。CDNエントリはTTLにより自然に期限切れになります。 パーティショニング: - リンクストア:short_codeハッシュでパーティション化します(CockroachDBは範囲ベースのシャーディングを通じてこれを自動的に処理します)。双対性スクランブル後のショートコードは均一に分散されるため、ホットパーティションはありません。 - Kafka:short_codeハッシュでクリックイベントをパーティション化します。これにより、特定のリンクのすべてのイベントが同じパーティションに送信され、シャッフルなしでリンクごとのステートフル集計が可能になります。 - ClickHouse:short_codeでシャード化し、日付でパーティション化します。単一リンクのアナリティクスに対するクエリは1つのシャードにヒットします。時間範囲クエリはパーティションプルーニングの恩恵を受けます。 マルチリージョントラフィック: 3つのリージョンにデプロイします:US-East、EU-West、AP-Southeast(北米、ヨーロッパ、アジアをカバー)。 - DNSベースのGeoDNSまたはAnycastがユーザーを最寄りのリージョンにルーティングします。 - 各リージョンは、読み取り(リダイレクトサービス + Redis + DBリードレプリカ)に対して完全に独立しています。 - 書き込み(リンク作成)は、最寄りのリージョンのリンク作成サービスに送信され、グローバルに分散されたDBのローカルノードに書き込まれます。CockroachDBは約1〜2秒以内に他のリージョンにレプリケートします。 - アナリティクスイベントはリージョンごとに処理され、グローバル集計のために中央アナリティクスクラスタにミラーリングされます。 容量スケッチ: - 1日あたり80億リダイレクト = 平均約92,500 req/s、ピーク時約300,000 req/s(3倍の係数)。 - 90%のCDNヒット率の場合:オリジンへのリクエストは約30,000 req/s(3リージョン全体)= リージョンあたり約10,000 req/s。 - 各リダイレクトサービスインスタンスは、約5,000 req/sを処理できます(主にキャッシュヒット、最小限のCPU)。平均負荷ではリージョンあたり約2〜4インスタンス、ピーク時には20以上に自動スケーリングします。 - 1日あたり1億2000万件の書き込み = 平均約1,400件/s。リンク作成サービスはボトルネックではありません。 ───────────────────────────────────────── 6. 信頼性戦略 ───────────────────────────────────────── 可用性目標:99.99% = 年間約52分のダウンタイム。 フェイルオーバー: - 各リージョンは、ヘルスチェックを備えたリージョナルロードバランサーの後ろで、複数のステートレスサービスインスタンスを実行します(フェイルオープン:10秒以内に異常なインスタンスを削除)。 - Redis Clusterは自動フェイルオーバーを使用します:プライマリシャードが失敗した場合、約15秒以内にレプリカが昇格されます。このウィンドウ中、リダイレクトサービスはDBリードレプリカにフォールバックします(レイテンシはわずかに高くなりますが、正しいです)。 - リージョン全体が失敗した場合、GeoDNSはヘルスプローブを通じて障害を検出し、約30〜60秒以内に次の最も近いリージョンにトラフィックをリダイレクトします。残りのリージョンは負荷を吸収する必要があります。自動スケーリングがこれを処理します。 - CockroachDB / Aurora Global DB:プライマリリージョンが利用できない場合、別のリージョンのノードに自動フェイルオーバーします。Auroraの場合、これはプライマリへのリードレプリカの手動または自動昇格を含みます(自動化によるRTOは約1分)。 データレプリケーション: - リンクストア:リージョン内では同期レプリケーション(少なくとも2ノード)、クロスリージョンレプリケーションは非同期(CockroachDBのコンセンサスがリージョンをまたぐ、またはAurora Global DBは約1秒のラグ)。2秒の伝播SLAが満たされるため、クロスリージョン読み取りの最終的な一貫性を受け入れます。 - Redis:各シャードは同じリージョンに少なくとも1つのレプリカを持ちます。クロスリージョンRedisレプリケーションはありません(Redisはキャッシュであり、DBが真実の情報源です)。 - Kafka:各リージョン内でレプリケーション係数3。 - ClickHouse:ClickHouse Keeper(ZooKeeperの代替)を使用して、アナリティクスリージョン内でレプリケートされます。アナリティクスは最終的に一貫性があるため、マルチリージョンClickHouseレプリケーションは不要です。 バックアップ: - リンクストアの毎日の論理バックアップをオブジェクトストレージ(S3)に保存し、30日間保持します。 - ClickHouseの週次フルエクスポートをオブジェクトストレージに保存し、90日間保持します。 - Kafkaトピックデータは7日間保持されます(アナリティクス復旧のための再生バッファとして機能します)。 - バックアップ復元のテストは、ステージング環境での自動復元ドリルを通じて毎月実施されます。 劣化時の動作: - Redisが利用できない場合:リダイレクトサービスはDBリードレプリカにフォールバックします。レイテンシは増加しますが、正しさは維持されます。DBリードレプリカのアラートと自動スケーリング。 - アナリティクスキューが利用できない場合:クリックイベントはドロップされます(アナリティクスは最終的に一貫性があるため、この損失は許容されます)。リダイレクトがアナリティクス障害によってブロックされることはありません。キューが正常でない場合、リダイレクトサービス内のサーキットブレーカーがイベント発行を無効にします。 - リンクストアプライマリが利用できない場合:新規リンク作成が失敗します(503を返します)。リダイレクトはキャッシュデータとリードレプリカを使用して継続されます。作成はリダイレクトの可用性よりも重要度が低いため、これは許容されます。 - リージョン全体がダウンした場合:GeoDNSフェイルオーバーが隣接リージョンに切り替わります。ユーザーはレイテンシの増加を経験しますが、サービスは利用可能なままです。 - APIゲートウェイでのレート制限と不正利用検出により、DDoS攻撃がシステムを圧倒するのを防ぎます。 ───────────────────────────────────────── 7. 主要なトレードオフと却下された代替案 ───────────────────────────────────────── トレードオフ1:302 vs. 301リダイレクト デフォルトとして302(一時リダイレクト)を選択しました。301(パーマネント)は、ブラウザが無期限にリダイレクトをキャッシュできるようにし、オリジン負荷を削減します。しかし、301では同じブラウザからの繰り返しクリックの追跡が不可能になり、アナリティクスが壊れ、リンクの更新や期限切れができなくなります(ブラウザはキャッシュされたリダイレクトを永久に提供します)。302のコストはオリジントラフィックの増加ですが、これはCDNとインプロセスキャッシュで緩和します。オーナーによって明示的にパーマネントとしてマークされたリンク(期限切れなし)については、オプトインとして301を提供できますが、デフォルトは302です。 トレードオフ2:ランダムショートコード vs. カウンタベースエンコーディング 却下:ランダムな7文字のBase62文字列を生成し、DBでの衝突を確認する。 却下理由:1日あたり1億2000万リンク、3.5兆コード空間で、衝突確率は低く始まりますが時間とともに増加します。さらに重要なのは、各作成で衝突を確認するためのDB読み取り、次に書き込みが必要になることです — 競合状態下では2回のラウンドトリップです。カウンタベースのアプローチでは、IDは構築によって一意であることが保証されており、衝突チェックは不要です。カウンタサービスはマイナーなコーディネーションオーバーヘッドですが、スケールでのDB衝突チェックよりもはるかに安価です。双対性スクランブルステップは、ランダムコードの予測不可能性の利点を維持します。 トレードオフ3:同期アナリティクス vs. 非同期キュー 却下:リダイレクトリクエスト中にクリックイベントをアナリティクスDBに同期的に書き込む。 却下理由:これにより、すべてのリダイレクトに10〜50ミリ秒のレイテンシが追加されます(クリティカルパスでのClickHouseまたはアナリティクスDBの書き込み)。これはP95 < 80ミリ秒のSLAに違反します。また、リダイレクトの可用性とアナリティクスの可用性の間にハードな依存関係が生じます。非同期キューアプローチは、これらの懸念を完全に分離します。コストは、アナリティクスが最終的に一貫性があること(30〜60秒の遅延)ですが、これは要件に従って明示的に許容されます。 トレードオフ4:単一グローバルDB vs. マルチリージョンアクティブアクティブDB 単一リージョンプライマリとグローバルリードレプリカの代わりに、グローバルに分散されたDB(CockroachDBまたはAurora Global)を選択しました。単一リージョンプライマリは、よりシンプルな一貫性セマンティクスを提供しますが、すべての書き込みが1つのリージョンに送信されることになります(他のリージョンのユーザーがリンクを作成する際の高レイテンシ、および書き込みの単一障害点)。グローバルに分散されたDBはコストが高く、運用上の複雑さが増しますが、リンク作成のレイテンシと書き込みの可用性はユーザーエクスペリエンスと99.99%の可用性目標にとって重要であるため、正当化されます。 トレードオフ5:アナリティクスのためのClickHouse vs. 時系列DB(例:InfluxDB) 却下:アナリティクスストレージのためのInfluxDBまたはTimescaleDB。 却下理由:時系列データベースは、固定タグセットを持つメトリクスに最適化されています。私たちのアナリティクスクエリは、柔軟なGROUP BY国、任意の時間ウィンドウ、およびリンクメタデータとの結合の可能性を必要とします。ClickHouseのカラムナストレージ、SQLインターフェース、およびマテリアライズドビューは、これらのパターンをより自然に、より高いスケールで処理します。ClickHouseはまた、近似集計(分位数、ヘビーヒッター)をネイティブにサポートしており、スケールでの上位5カ国クエリに役立ちます。 ───────────────────────────────────────── 予算正当化の概要 ───────────────────────────────────────── より多くを費やすべき点: - マルチリージョンRedisクラスタ:リダイレクトレイテンシはコアSLAであり、キャッシュミスは高コストです。 - グローバルに分散されたリンクストア(CockroachDB / Aurora Global):リダイレクトの正確性と2秒のグローバル伝播にはこれが不可欠です。 - CDNエッジ容量:リダイレクトレイテンシと可用性にとって最もレバレッジの高い単一投資です。 - リダイレクトサービスのための自動スケーリング:トラフィックは非常に変動し、スパイクが発生します。 より少なく費やすべき点: - アナリティクスインフラストラクチャ:最終的な一貫性は許容されるため、レプリケーションを備えた単一の中央ClickHouseクラスタで十分です。マルチリージョンアナリティクスレプリケーションは不要です。 - リンク作成サービス:書き込み量は約1,400/秒であり、数インスタンスで容易に処理できます。 - コールドストレージ/バックアップ:オブジェクトストレージは安価です。保持期間は過剰にプロビジョニングする方が、不足するより良いです。 - クロスリージョンRedisレプリケーション:RedisはDBをバックエンドとするキャッシュであり、DBは既にレプリケートされているため、クロスリージョンレプリケーションはコストと複雑さを増加させるだけで、メリットは最小限です。

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

87
採点モデル OpenAI GPT-5.2

総合点

86

総評

エンドツーエンドの実装指向型グローバル設計で、書き込み/読み取り/分析プレーンの強力な分離、明示的なマルチティアキャッシュ(CDN、インプロセス、Redis、DB)、ウィンドウ集計やトップカントリーのヘビーヒッターアプローチを含む詳細な分析パイプラインを備えています。ホットキーの動作に具体的に対処し、DB/Kafka/ClickHouse全体でのパーティショニングの選択、およびマルチリージョントラフィックとフェイルオーバーを劣化モードで扱います。ID/エイリアス戦略は堅牢(ブロック割り当て + Base62 + スクランブル)で、カスタムエイリアスの予約と衝突処理も明確です。予算の正当化と、理由を添えた複数の明示的なトレードオフ/代替案も含まれています。軽微な問題点としては、Aurora Global DBのアクティブアクティブ書き込みに関する記述がやや楽観的であり、一部のキャパシティ数値は推測的ですが、全体として指定された制約と規模に最もよく適合しています。

採点詳細を表示

設計の質

重み 30%
86

明確なデータフローを持つ構造化されたプレーン(書き込み/読み取り/分析)、エッジおよびインプロセスレイヤーを含むマルチティアキャッシュ、具体的な分析ストレージ/処理の選択。全体的なアーキテクチャは、レイテンシ、可用性、スキューの制約によく適合しています。

完全性

重み 20%
89

要求されたすべての項目に対応:アーキテクチャ、マッピング/イベント/キャッシュのストレージ、IDとカスタムエイリアス、API、ホットキー/キャッシュ/パーティショニング、マルチリージョンルーティング、信頼性/劣化、予算、および理由付きで却下された複数の代替案。

トレードオフの説明力

重み 20%
87

要件に基づいた明示的なトレードオフ(302 vs 301、ランダム vs カウンターID、非同期分析、DBトポロジー、分析DBの選択)と、明確な予算の使用/回避計画。正確性とコストに関する良好な認識を示しています。

拡張性・信頼性

重み 20%
85

強力なスケーラビリティ:ホットキー緩和策(CDN + インプロセスキャッシュ + Redisレプリカ)、システム間のパーティショニング、明示的なマルチリージョンルーティング/フェイルオーバー/劣化動作。リダイレクトの正確性と分析の損失とのトレードオフを認識し、実用的なフォールバックパスを提供します。

分かりやすさ

重み 10%
83

ステップバイステップのフローと具体的なAPI/動作定義により、非常に明確な構造。密だが読みやすく、実装タスクにマッピングしやすいです。

総合点

92

総評

回答Bは、例外的に詳細かつ包括的なシステム設計を提供しています。キャッシュの多層アプローチ、衝突処理と列挙防止を備えた洗練されたID生成戦略、そして明確な予算の正当化を含むトレードオフの非常に徹底的な議論において優れています。API設計はより完全であり、スケーラビリティと信頼性のセクションは非常に詳細で、具体的なフェイルオーバーメカニズム、RTO、および優雅な劣化シナリオを驚くほど明確かつ深くカバーしています。容量スケッチは貴重な定量的次元を追加します。

採点詳細を表示

設計の質

重み 30%
90

アーキテクチャは例外的に構造化されており、3つの主要パス(書き込み、読み取り、分析)を明確に区別しています。CDNエッジとLambda@Edge、専用のID生成サービスなどのよりニュアンスのあるコンポーネントが含まれており、より洗練された堅牢な全体設計を示しています。データフローの説明は非常に詳細かつ正確です。

完全性

重み 20%
95

回答Bは驚くほど完全であり、すべてのプロンプト要件を広範な詳細で満たしています。追加のAPIエンドポイント(メタデータ、削除)、容量スケッチ、非常に詳細なID生成戦略、および包括的な予算の正当化が含まれており、基本的な要件を超えて、真に本番稼働可能な設計計画を提供しています。

トレードオフの説明力

重み 20%
90

回答Bは5つの異なるトレードオフを提供しており、それぞれが代替案に対する選択されたアプローチの明確な正当化とともに徹底的に分析されています。302対301リダイレクト、カウンターベース対ランダムID、同期対非同期分析に関する議論は特に強力です。予算の正当化セクションは、設計上の選択をコストへの影響に明示的に関連付けることにより、トレードオフの推論をさらに強化します。

拡張性・信頼性

重み 20%
95

回答Bは、多層ホットキー緩和戦略(CDN、インプロセスキャッシュ、Redisレプリカ)と詳細なパーティショニングスキームでこの分野で優れています。信頼性のセクションは例外的に徹底しており、具体的なフェイルオーバーメカニズム、RTO、データレプリケーション戦略(クリティカルと非クリティカルの区別)、包括的なバックアップ計画、および具体的なフォールバックを備えた幅広い優雅な劣化シナリオをカバーしています。容量スケッチはスケーラビリティの定量的検証を追加します。

分かりやすさ

重み 10%
85

回答Bは例外的に明確で構造化されており、明確なセクションと詳細な箇条書きを使用しています。広範なコンテンツにもかかわらず、情報は論理的かつ簡潔に提示されており、複雑な概念を理解しやすくしています。言語の精度と各トピックの体系的な分解が、その高い明瞭さに貢献しています。

総合点

84

総評

回答Bは、例外的に徹底的で、非常によく練られたシステム設計を提供しています。3層キャッシュ戦略(CDN、インプロセスLRU、Redis)、列挙攻撃を防ぐための双射スクランブリングを伴うカウンターベースのID生成、詳細な容量スケッチ、劣化動作を伴う特定の障害モード分析、明確な理由付けを伴う5つのよく説明されたトレードオフなど、必要なコンポーネントすべてをかなりの深さでカバーしています。分析の正確性とリンクの有効期限のために302を選択したことは、301よりも正しく正当化されています。分析パイプラインはClickHouseとマテリアライズドビューでうまく設計されています。カスタムエイリアスのための冒涜フィルタリング、レート制限の詳細、ソフトデリートセマンティクス、パブ/サブを介したキャッシュ無効化、明確な予算正当化セクションなど、実践的な詳細が含まれています。マルチリージョン戦略は、特定のリージョン選択とフェイルオーバー時間の推定値とともに具体的です。唯一のわずかな弱点は、回答がかなり長く、場所によってはもう少し簡潔にできたことです。

採点詳細を表示

設計の質

重み 30%
85

回答Bは、優れた3層キャッシュアーキテクチャ(CDN、インプロセスLRU、Redis)を提供し、明確な正当化を伴う302リダイレクトをデフォルトで正しく選択し、クロスリージョン分析ミラーリングを含み、パブ/サブを介したキャッシュ無効化の詳細を説明しています。アーキテクチャはより完全で本番環境に対応可能であり、複数のレイヤーでのホットキー問題に特に注意が払われています。データフローの説明は徹底しており、作成時のキャッシュウォーミングなどのエッジケースも考慮されています。

完全性

重み 20%
85

回答Bは驚くほど完全です。容量スケッチ、サイズ推定値を含むスキーマの詳細、レート制限の詳細、詳細な理由付けを伴う5つのトレードオフ、専用の予算正当化セクション、ソフトデリートセマンティクス、カスタムエイリアスのための冒涜フィルタリング、特定のフェイルオーバー時間の推定値、コンポーネントごとの劣化動作、バックアップテスト手順、ユーティリティDELETEエンドポイントが含まれています。オプションのリンクメタデータエンドポイントも含まれています。プロンプトのほぼすべての側面が具体的な詳細で対処されています。

トレードオフの説明力

重み 20%
85

回答Bは、5つのよく説明された代替案(302 vs 301リダイレクト、ランダム vs カウンターベースのコード、同期 vs 非同期分析、単一 vs マルチリージョンDB、ClickHouse vs 時系列DB)でトレードオフの理由付けに優れています。各トレードオフには、制約(レイテンシSLA、分析の正確性、可用性目標)に関連付けられた具体的な理由が含まれています。予算正当化セクションは、どこに多く費やすべきか、どこに少なく費やすべきかを明示的に説明しており、一貫性とレプリケーションコストの正当化に関する制約に直接応答しています。

拡張性・信頼性

重み 20%
85

回答Bは、詳細な容量スケッチ(平均92,500リクエスト/秒、ピーク300,000リクエスト/秒、CDNオフロード90%)、特定の自動スケーリング数値、3層ホットキー緩和策、およびコンポーネントごとの障害分析とタイミング(Redisフェイルオーバー15秒、GeoDNSフェイルオーバー30〜60秒)を提供しています。信頼性セクションは、99.99%の目標(年間52分)を明示的に対象とし、サーキットブレーカーを含み、各コンポーネント障害に対する特定の劣化動作を説明しています。バックアップ復元テストが言及されており、これは成熟した運用プラクティスです。

分かりやすさ

重み 10%
75

回答Bは、明確なセクションヘッダーと詳細なサブセクションでよく整理されています。文章は徹底的かつ正確です。ASCIIセクション区切り文字と一貫したフォーマットの使用がナビゲーションを助けています。しかし、回答はかなり長く、主要な決定事項を迅速に抽出するのが難しくなる可能性があります。容量スケッチセクションは具体性を高める良い追加点です。長さにもかかわらず、全体的に非常に明確です。

比較結果サマリー

最終順位は、採点者ごとの順位集約(平均順位 + ボルダ方式の同点処理)で決定します。平均点は参考表示です。

採点者数: 3

勝利票

0 / 3

平均点

69
この回答を見る

勝利票

3 / 3

平均点

87
この回答を見る

採点結果

勝者理由

回答Bが、あらゆる側面において、より深いレベルと厳密さで優れているため、勝利します。回答Aが見落としている重要な詳細に対処しています。具体的には、301と302のリダイレクトのトレードオフ(回答Aは分析とリンクの有効期限切れを壊す可能性のある301を誤ってデフォルトにしています)、ホットキーのインプロセスキャッシング、容量の見積もり、具体的なフェイルオーバータイミング、パブリッシュ/サブスクライブによるキャッシュ無効化、列挙型攻撃の防止、および包括的な予算の正当化です。回答Bは、回答Aの2つに対して5つの十分に根拠のあるトレードオフを提示しており、各トレードオフには制約に関連付けられた具体的な理由が含まれています。信頼性のセクションは回答Bの方が大幅に詳細であり、各障害モードの具体的な劣化動作が含まれています。全体として、回答Bは、エンジニアが実装計画を開始できるような深さを示しており、それがタスクの明示的な目標です。

勝者理由

回答Bは、設計のあらゆる側面において、著しく深い、詳細かつ堅牢であるため、優れています。ホットキーのスケーリングやID生成といった複雑な問題に対してより洗練されたソリューションを提供し、より包括的なAPIを提供し、トレードオフや信頼性戦略に関する、明確な予算の正当性を含む、はるかに徹底した分析を提示しています。回答Bの詳細レベルは、グローバル規模のサービスにおける実践的な課題とソリューションに対する深い理解を示しています。

採点モデル OpenAI GPT-5.2

勝者理由

回答Bは、グローバル規模に対してより完全で運用上具体的です。マルチレイヤーキャッシングとホットキー緩和を備えた、より明確な低遅延リダイレクトパス、ラスト24時間およびトップカ国クエリに対応できる詳細な分析アーキテクチャ、そしてより強力な信頼性/低下および予算のトレードオフに関する考慮事項を提供します。回答Aは堅実ですが、より高レベルにとどまり、IDプール調整、分析集計の具体性、キャッシュ/有効期限/CDNセマンティクスといった重要なスケールクリティカルな詳細が不明確なままです。

X f L