Orivel Orivel
メニューを開く

1万リクエスト/秒に対応するURL短縮サービスの設計

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

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

X f L

目次

お題概要

比較ジャンル

システム設計

お題作成モデル

回答モデル

採点モデル

お題本文

URL短縮サービス(「tiny link」に類する製品の趣旨)を、大規模でも信頼性を保って動作するように設計してください。回答は構造化されたシステム設計ドキュメントとして提示してください。

Functional requirements:

  • ユーザーは長いURLを送信し、短いリンク(例:7文字のコード)を受け取る。
  • 短いリンクにアクセスした誰でも元のURLへリダイレクトされる。
  • ユーザーが要求するカスタムエイリアスは、利用可能であれば尊重される。
  • 基本的なクリック分析:短縮リンクごとの総クリック数。

Non-functional constraints (design to these numbers exp...

さらに表示

URL短縮サービス(「tiny link」に類する製品の趣旨)を、大規模でも信頼性を保って動作するように設計してください。回答は構造化されたシステム設計ドキュメントとして提示してください。

Functional requirements:

  • ユーザーは長いURLを送信し、短いリンク(例:7文字のコード)を受け取る。
  • 短いリンクにアクセスした誰でも元のURLへリダイレクトされる。
  • ユーザーが要求するカスタムエイリアスは、利用可能であれば尊重される。
  • 基本的なクリック分析:短縮リンクごとの総クリック数。

Non-functional constraints (design to these numbers explicitly):

  • ピークトラフィック:リダイレクト要求10,000件/秒、読み取り:書き込み比率は概ね100:1。
  • リダイレクトレイテンシ目標:サーバー側で計測したp99 < 50 ms。
  • 5年間の総保存リンク数:約300億件。
  • リダイレクト可用性目標:月間99.99%。
  • 短縮コードはバルクで推測されないこと(単純な連番露出を避ける)。

あなたの設計ドキュメントは以下をカバーし、各重要な決定について受け入れるトレードオフを説明してください:

  1. 書き込み(作成)パスと読み取り(リダイレクト)パスの高レベルアーキテクチャとリクエストフロー。
  2. 短縮コード生成戦略(ユニーク性の保証方法とカスタムエイリアス衝突の処理を含む)。
  3. データモデルとデータストアの選択、および与えられた数値を正当化する概算キャパシティ/ストレージ見積もり。
  4. キャッシュ戦略とホットリンクの高速化方法、キャッシュ無効化、キャッシュミス時の挙動。
  5. スケーリング戦略:読み取りパスがレイテンシとスループット目標を満たす方法、データのパーティショニング/シャーディング方法。
  6. 信頼性と障害対応:データストアノード、キャッシュ、リージョンが故障したときの挙動;可用性目標の達成方法。
  7. クリック分析を、リダイレクトのホットパスを遅くしない形でどのように収集するか。

あなたが行う仮定を明示してください。ドキュメントは一般論に終始するのではなく、技術的に具体的で集中した内容にしてください。

採点方針

強い解答は、番号付きの要件すべてに直接対処し、決定を与えられた制約(10K RPS、読み:書き比100:1、p99 < 50 ms、300億リンク、99.99%可用性、推測困難なコード)に結びつけます。単なる一般的なシステム設計の定型ではなく、明確に制約に適合していることが求められます。

高く評価される点:適切な短縮コードスキームを選び、ユニーク性とカスタムエイリアス衝突の処理を正しく説明していること;与えられた数値から導かれたもっともらしいストレージ/容量見積もりでデータストアの選択を正当化していること;キャッシュミスと無効化の振る舞いを明示した...

さらに表示

強い解答は、番号付きの要件すべてに直接対処し、決定を与えられた制約(10K RPS、読み:書き比100:1、p99 < 50 ms、300億リンク、99.99%可用性、推測困難なコード)に結びつけます。単なる一般的なシステム設計の定型ではなく、明確に制約に適合していることが求められます。

高く評価される点:適切な短縮コードスキームを選び、ユニーク性とカスタムエイリアス衝突の処理を正しく説明していること;与えられた数値から導かれたもっともらしいストレージ/容量見積もりでデータストアの選択を正当化していること;キャッシュミスと無効化の振る舞いを明示した一貫したキャッシュ層があること;シャーディング/パーティショニングと、読み取りパスがどのようにレイテンシとスループット要件を満たすかを説明していること;ノード、キャッシュ、リージョンの障害に対する具体的な失敗対応があり99.99%の可用性を現実的に支えうること。分析は非同期に扱われ、リダイレクトパスを遅くしないことが期待されます。

各主要な選択のトレードオフを明示することが重要です:たとえば整合性対レイテンシ、ストレージコスト対読み取り速度、推測可能性対単純さなど、各選択肢の欠点を述べてください。要件の見落とし、与えられた制約と矛盾する数値、内部整合性のないアーキテクチャ、根拠のない主張、曖昧な説明は減点します。明確な仮定の提示と合理的な説明を行ってください。

回答

システム設計:スケーラブルなURL短縮サービス

前提条件

  1. リダイレクトトラフィックのピークは毎秒10,000リクエストとします。名目上の100:1の読み取り/書き込み比率を考慮すると、ピーク時には約100件の作成リクエスト/秒となります。
  2. 5年間で300億件のリンクを保存するには、平均で毎秒約190件の作成リクエストが必要となるため、この数値を調整し、バーストを吸収するために、ストレージと書き込みパスは少なくとも毎秒1,000件の作成リクエストに対応できるようにプロビジョニングします。
  3. リンクはデフォルトで不変です。後で削除や宛先編集がサポートされる場合は、明示的なバージョン管理とキャッシュ無効化を使用します。
  4. 基本的な分析は最終的に...
全文を表示

システム設計:スケーラブルなURL短縮サービス

前提条件

  1. リダイレクトトラフィックのピークは毎秒10,000リクエストとします。名目上の100:1の読み取り/書き込み比率を考慮すると、ピーク時には約100件の作成リクエスト/秒となります。

  2. 5年間で300億件のリンクを保存するには、平均で毎秒約190件の作成リクエストが必要となるため、この数値を調整し、バーストを吸収するために、ストレージと書き込みパスは少なくとも毎秒1,000件の作成リクエストに対応できるようにプロビジョニングします。

  3. リンクはデフォルトで不変です。後で削除や宛先編集がサポートされる場合は、明示的なバージョン管理とキャッシュ無効化を使用します。

  4. 基本的な分析は最終的に一貫性があり、壊滅的な障害中にごくわずかなイベントを失う可能性があります。リダイレクトの正確性は分析に依存しません。

  5. リダイレクト応答は、永続的な301リダイレクトではなくHTTP 302または307を使用し、運用上の制御を維持し、分析の可視性を向上させます。

  6. サービスは、少なくとも3つの地理的リージョンでアクティブ/アクティブで実行され、グローバルにレプリケートされたリンクデータストアを使用します。

  7. 高レベルアーキテクチャ

コンポーネントは、グローバルDNSまたはAnycastルーティング、リージョンロードバランサー、ステートレスリダイレクトサービス、ステートレス作成サービス、ローカルインプロセスキャッシュ、リージョナル分散キャッシュ、パーティション化されたリンクデータストア、耐久性のあるイベントストリーム、および分析プロセッサとストレージです。

作成パス

  1. クライアントは、最も近い正常なリージョンにロングURLとオプションのカスタムエイリアスを送信します。
  2. APIは、呼び出し元を認証またはレート制限し、URL構文を検証し、URL長を制限し、HTTPおよびHTTPSなどのサポートされているスキームのみを許可し、予約済みエイリアスをチェックします。
  3. 自動生成されたリンクの場合、サービスは暗号学的にランダムなコードを作成します。カスタムエイリアスの場合、文書化された、大文字/小文字を区別する、または区別しないポリシーに従ってエイリアスを正規化します。
  4. 作成サービスは、コードまたはエイリアスがまだ存在しない場合にのみ挿入する条件付き挿入を権威あるデータストアに対して実行します。
  5. ランダムな衝突が発生した場合、別のコードを生成して再試行します。カスタムエイリアスの衝突の場合、要求されたエイリアスをサイレントに変更せずにHTTP 409を返します。
  6. データベースが書き込みを承認した後、サービスはローカルリージョンキャッシュに新しいマッピングを挿入し、他のリージョンにキャッシュフィルまたは無効化メッセージをブロードキャストします。
  7. 短縮URLを返します。リクエストの冪等性キーは、繰り返しのクライアントリクエストを同じ結果にマッピングできます。

書き込みは、クォーラムまたはコンセンサスコミット後にのみ承認されます。これにより、ゾーン間および(データストア構成によっては)リージョン間の書き込みレイテンシが追加されますが、権威あるグローバル一意性の保証が作成されます。作成は、リダイレクトトラフィックよりもレイテンシに対する感度がはるかに低いです。

リダイレクトパス

  1. グローバルルーティングは、リクエストを最も近い正常なリージョンに送信します。
  2. リダイレクトサービスは、コードを検証して抽出します。
  3. 小さなインプロセスキャッシュをチェックします。存在しない場合は、リージョナル分散キャッシュをチェックします。
  4. キャッシュミスの場合、コードをプライマリキーとしてローカルデータストアレプリカに対してポイントルックアップを実行します。
  5. 見つかり、アクティブな場合、両方のキャッシュレベルをポップレートし、クリックイベントを非同期に発行し、宛先を含む302または307応答を直ちに返します。
  6. 存在しない場合、404を返します。否定的な結果は、繰り返しスキャンを防ぐために短時間のみキャッシュされます。

リダイレクトパスには、同期分析操作も、通常の条件下でのリージョン間ネットワークホップもありません。ステートレスサービスは、リージョンロードバランサーの後ろで水平方向にスケールします。

  1. 短縮コードの生成と一意性

7文字のbase62空間には62^7、約3.52兆の値を格納でき、技術的には300億件のリンクを保持できます。しかし、300億件のリンクが保存された場合、その名前空間の約0.85パーセントしか使用されません。したがって、ランダムなバルクスキャナーは、約117回の推測で1つの有効なリンクを発見することになり、コードがバルクで推測されにくいという要件を満たしません。

したがって、デフォルトのコードは、暗号学的に安全なランダムソースから生成された11文字のURLセーフなbase62を使用します。これにより、約65.5ビット、5.2 x 10^19の可能性が得られます。300億件のアクティブリンクがある場合、ランダムな推測が成功する確率は約5.8 x 10^-10です。レート制限と不正利用検出により、列挙がさらに制限されます。トレードオフは、リンクが4文字長くなることです。7文字のエイリアスは、ユーザーが明示的に選択した場合でも許可されることがありますが、それらは同じ非列挙可能性保証を受けません。

ランダム生成は、作成順序を公開せず、キーを均等に分散します。プライマリキーの条件付き挿入が、最終的な一意性の権威となります。ランダムシステムでは、履歴全体での誕生日衝突が予想されますが、運用上問題となるのは同時候補衝突のみです。すべての試行された挿入はチェックされ、再試行されます。11文字空間の計画された占有率では、再試行は事実上存在しません。

代替案としては、シーケンス番号の暗号化またはキー付き置換の適用が考えられます。これにより一意の生成入力が保証されますが、キーライフサイクル管理とシーケンス割り当てが必要です。ランダム生成と条件付き挿入はよりシンプルで、中央集権的なID割り当てを排除し、この名前空間サイズでは十分に効率的です。

カスタムエイリアスは、生成されたコードと同じプライマリキー名前空間を共有します。エイリアス正規化は挿入前に行われ、グローバルに一貫した条件付き挿入が同時リクエストの勝者を決定します。ヘルス、API、管理、静的などの予約済みパスは拒否されます。エイリアスが大文字/小文字を区別しない場合、正規化された小文字形式がキーとなり、要求された表示形式は別途保存される場合があります。

  1. データモデルとデータストア

権威あるリンクレコードのフィールドは次のとおりです。

code: プライマリキー
long_url: 宛先URL
created_at: タイムスタンプ
owner_id: オプションのアカウント識別子
status: active, disabled, or deleted
ttl_or_expiry: オプション
version: キャッシュ無効化のための単調増加値
custom_alias: boolean

クリック数は、人気のあるリンクが書き込みホットスポットになるのを防ぐため、リダイレクトごとにこのレコードで更新されません。

リンクストアは、DynamoDB、Bigtable、一貫性が慎重に管理されたCassandra、または同等の内部運用システムなど、プライマリキーアクセスに最適化された分散パーティションキーバリューストアです。グローバルに一意な条件付き書き込みのために、選択された実装は、ネイティブまたはシャーディングごとのコンセンサスリーダーを通じて、キーの線形化可能な条件付き作成を提供する必要があります。リダイレクトパスでは、リレーショナル結合や範囲スキャンは必要ありません。

プライマリパーティションキーは、フルコードのハッシュです。ハッシュ分散は、時系列のホットスポットを防ぎ、生成されたコードとカスタムエイリアスの両方を均等に分散します。論理キースペースは数千の仮想シャードに分割され、ノードが追加されると再割り当てされます。各シャードは、アベイラビリティゾーン全体に少なくとも3つのレプリカを持ち、さらにリージョン間レプリカがあります。

容量見積もり

平均URLを400バイト、キー、メタデータ、エンコーディング、インデックス、ストレージエンジンのオーバーヘッドを約200バイトと仮定します。レコードあたり約600バイトで、300億レコードには約18 TBの論理データが必要です。長いURL、コンパクションオーバーヘッド、トゥームストーン、運用上のヘッドルームを考慮して、30 TBの論理容量を予算計上します。3つの耐久性のあるレプリカには約90 TBが必要であり、バックアップとリージョン間コピーはフリート割り当てを約150〜250 TBに引き上げることができます。これは、水平パーティション化されたキーバリューストアの意図された範囲内にありますが、単一の従来のデータベースインスタンスには不向きです。

毎秒10,000リダイレクトの場合、完全なキャッシュ障害でも、毎秒10,000件のランダムポイントリードしか発生しません。データストアは、サービングリージョンあたり少なくとも20,000〜30,000リード/秒(フェイルオーバー時)および少なくとも1,000件の条件付き作成/秒(作成時)に対応できるようにプロビジョニングされます。容量は、通常の要求スループットよりも、データセットサイズ、レプリケーション、フェイルオーバーリザーブによってより多く制御されます。

分析は別のストレージを使用します。ストリームプロセッサは、コードごと、時間バケットごとのカウントを、コードと日または時間の組み合わせをキー、カウントを値とするモデルで、分析キーバリューストアまたはカラムナストアに書き込みます。コンパクトな合計を非同期に維持できます。分析を分離することで、ホットリンクカウンターがリダイレクトルックアップと競合するのを防ぎます。

  1. キャッシュ戦略

各リダイレクトプロセスには、最もホットなマッピングのための、制限付きLRUまたはTinyLFUインメモリキャッシュがあります。リージョナルRedisまたはMemcached互換クラスターが2番目のレベルを形成します。キャッシュされた値には、宛先、ステータス、有効期限、レコードバージョンが含まれます。

代表的なターゲットは、リージョンキャッシュヒット率95〜99%です。Zipf分布のURL人気は、コーパス全体が非常に大きいにもかかわらず、通常これを可能にします。キャッシュは、300億件のリンクすべてではなく、ホットオブジェクトを格納します。たとえば、約600バイトのエントリが1億件あっても、キャッシュオーバーヘッドを考慮すると約60 GB、実際には100〜150 GB程度で、リージョンキャッシュクラスターに分散されます。

マッピングはデフォルトで不変であるため、肯定的なエントリは6〜24時間(ジッター付き)などの長いTTLを持つことができます。編集、無効化、または削除がサポートされている場合、権威ある書き込みが最初にコミットされ、次にコードと新しいバージョンを含む無効化メッセージをすべてのリージョンに発行します。短いTTLは、無効化メッセージが失われた場合の古い値の提供時間を制限します。安全性が重要な無効化操作は、すべてのリダイレクトプロセスにグローバルな拒否リストを短時間配置することもできます。

否定的な結果は、繰り返しスキャンを防ぐために約5〜30秒間キャッシュされます。作成パスは、コードの取得に成功した後、否定的なキャッシュエントリを無効化します。短い否定的なTTLは、別のリージョンがレプリケーションまたは無効化が到着する前にミスを短時間キャッシュしたレースを制限します。

キャッシュミスの場合、リダイレクトサービスはリージョナルデータストアレプリカを読み取り、両方のキャッシュレベルをフィルします。リクエストの合算により、新しく人気が出たコードに対する同時ミスが、数千ではなく1回のデータベースリクエストで処理されるようになります。TTLジッターは同期的な有効期限切れを防ぎます。データストアは、分散キャッシュが失敗した場合に、毎秒10,000リクエストの全負荷を処理できるようにサイズ設定されており、若干高いレイテンシを受け入れつつも機能し続けます。

長いキャッシュTTLのトレードオフは、編集後の潜在的な陳腐化です。不変性、バージョン付き無効化、および制限付きTTLにより、そのトレードオフが明示されます。新しく作成されたリンクのリダイレクトの正確性は、作成リージョンを同期的にフィルし、必要に応じてそのリージョンに即時読み取りをルーティングすることで向上させることができます。

  1. スケーリングとレイテンシ

リダイレクトサービスはステートレスであり、リクエスト/秒、CPU、p99レイテンシに基づいて水平方向にスケールします。1つのインスタンスが安全に毎秒1,000リクエストを処理できる場合、各リージョンは、毎秒10,000リクエストのリージョンフェイルオーバー負荷に対応するために、少なくとも15〜20インスタンスを実行し、さらにデプロイメントとゾーン障害のヘッドルームを確保する可能性があります。実際のサイジングは負荷テストによって確立されます。

通常のキャッシュヒットレイテンシ予算は約2〜5ミリ秒(ロードバランシングとアプリケーション処理)、1〜3ミリ秒(インプロセスルックアップ)または2〜8ミリ秒(リージョナル分散キャッシュルックアップ)、および応答構築に数ミリ秒です。キャッシュミスの予算は、ローカルレプリケートデータストアのポイントルックアップに約10〜25ミリ秒を割り当てます。これらの予算により、オリジンサーバーサイドのp99を50ミリ秒未満に抑えることができます。

厳密なホップごとのタイムアウトは、破損したキャッシュまたはレプリカがレイテンシ予算全体を消費するのを防ぎます。キャッシュアクセスは約8ミリ秒、データストアアクセスは約25〜30ミリ秒に制限され、十分な予算が残っている場合にのみ再試行されます。遅延してレート制限されたヘッジリードを2番目のローカルレプリカに対して使用して、通常の負荷の倍増を避けることができます。

キーは仮想シャード全体にハッシュパーティション化されます。ランダムに生成されたコードは自然にトラフィックをバランスさせますが、例外的にホットな個々のリンクは、インプロセスおよびリージョナルキャッシュによって吸収されます。ホットキーがデータストアに到達した場合、リクエストの合算とレプリケートリードにより、1つのストレージノードがボトルネックになるのを防ぎます。

オートスケーリングは、完全なアベイラビリティゾーン損失と、少なくとも1つのリージョンが障害のあるピアからのリダイレクトトラフィックを受信するのに十分な容量を維持します。リージョンは、ピーク容量の約50〜60%未満で実行されます。トレードオフは、99.99%の可用性目標のために、より高いアイドルコストです。

  1. 信頼性と障害処理

可用性目標

月間99.99%の目標は、30日間の月で約4.4分間の利用不可を許容します。単一のキャッシュノード、アプリケーションインスタンス、アベイラビリティゾーン、またはリージョンがリダイレクトに必要とされることはありません。

アプリケーションインスタンスまたはゾーン障害

ヘルスチェックは失敗したインスタンスを削除し、ロードバランサーは少なくとも3つのゾーンにリクエストを分散します。サービスは、ローリングまたはカナリアデプロイメント、コネクションドレイン、および自動ロールバックを使用します。リージョン容量は、1つのゾーンの損失に耐えます。

キャッシュノードまたはキャッシュクラスター障害

キャッシュノードは、リージョン内でシャーディングおよびレプリケートされます。個々のノードが失敗した場合、そのレプリカが引き継ぎます。キャッシュ全体が利用できない場合、リダイレクトサービスはサーキットブレーカーを使用し、キャッシュ呼び出しをスキップし、データストアを直接クエリします。データベース容量とアプリケーション接続プールは、このモードのために明示的にプロビジョニングされています。アドミッションコントロールは、データストアを無制限のスキャナートラフィックから保護します。

データストアノード障害

各シャードは、クォーラムまたはコンセンサスを使用してゾーン全体でレプリケートされます。失敗したリーダーは自動的に置き換えられ、読み取りは別の正常なローカルレプリカを使用します。条件付き作成は、重複所有権のリスクを回避するために、短い選挙期間中、シャードに対して利用できなくなります。レプリカとキャッシュからリダイレクトを継続できます。これは、作成の正確性を優先しつつ、読み取りの可用性を維持します。

リージョン障害

グローバルなヘルスベースルーティングは、失敗したリージョンを削除し、トラフィックを最も近い正常なリージョンに送信します。各サービングリージョンには、リンクデータのレプリケートコピーと独立したリダイレクト、キャッシュ、イベント取り込みインフラストラクチャがあります。フェイルオーバー後のキャッシュヒット率は最初は低くなります。そのため、スタンバイリージョンはグローバルにホットなリンクのウォームキャッシュと、コールドキャッシュの急増に対応できる十分なデータストア/読み取り容量を保持します。

生成されたコードの場合、データストアアーキテクチャが各キーをホームシャードにルーティングする場合、グローバルレプリケーションはコンセンサスバックの権威ある挿入後に非同期になる可能性があります。カスタムエイリアスの場合、権威ある条件付き挿入はグローバルにシリアル化される必要があります。新しく作成されたリンクが壊滅的な損失の前に生き残ったリージョンに到達していない場合、サービスは不正確なマッピングの代わりに、一時的に再試行可能なエラーを返す可能性があります。より強力な同期マルチリージョンレプリケーションは、このリカバリポイントウィンドウを短縮しますが、作成レイテンシを増加させます。推奨される構成では、書き込みは比較的低量であるため、少なくとも2つのリージョンにわたるレプリカにリンク作成をコミットします。

バックアップと破損

データストアは、チェックサム、ポイントインタイムリカバリ、不変スナップショット、および定期的にテストされた復元手順を使用します。削除は、物理的な即時削除ではなく、トゥームストーンと保持期間を使用します。バックアップは論理的な破損から保護しますが、通常のredirectフェイルオーバーの一部ではありません。

過負荷時の動作

レート制限は、ソース、アカウント、および疑わしいコードスキャンパターンに適用されます。作成および分析トラフィックは、リダイレクトよりも優先度が低くなります。ロードシェディングは、リダイレクト容量に影響を与える前に、不正または過剰な作成リクエストを拒否します。サーキットブレーカー、制限付きキュー、およびデッドラインは、カスケード障害を防ぎます。

  1. クリック分析

リダイレクト先を選択した後、サービスはイベントID、コード、タイムスタンプ、リージョン、およびオプションで大まかなリファラーまたはユーザーエージェントフィールドを含むコンパクトなイベントを作成します。イベントを制限付きのローカル非同期バッファに配置し、分析の承認を待たずにリダイレクトを返します。

リージョンコレクターは、イベントをバッチ処理して、Kafka、Pulsar、またはKinesisなどの耐久性のあるレプリケートストリームに書き込みます。ストリームプロセッサは、イベントをコードと時間バケットごとに集計し、バッチ処理されたインクリメントを分析ストアに書き込みます。定期的なコンパクションにより、合計クリック数が生成されます。ダッシュボードとAPIは、権威あるリダイレクトテーブルではなく、分析ストアを読み取ります。

イベントIDにより、コレクターが再試行した場合のダウンストリームの重複排除が可能になります。ストリームをコードで直接パーティション化すると、バイラルリンクが1つのパーティションに集中するため、取り込みキーはコードとランダムなストライプの組み合わせにすることができます。プロセッサは最初にストライプ化されたカウンターを集計し、次にそれらをマージします。これにより、ホットリンク分析を水平方向にスケールできます。

完全にインメモリの非同期バッファは、リダイレクトプロセスがクラッシュした場合にイベントを失う可能性があります。より強力な耐久性が必要な場合は、各ホストまたはサイドカーがバッチをローカルのライトアヘッドログに追記してから転送できますが、リダイレクト応答は中央ストリームを待つべきではありません。基本的な分析で受け入れられるトレードオフは、最終的な一貫性と、リダイレクトレイテンシと可用性を維持することと引き換えに、深刻な障害中のわずかな、測定されたアンダーカウントです。

結果

通常のredirectパスは、ローカルキャッシュルックアップと、ミスの場合のみローカルパーティションキーバリュールックアップです。ランダムな11文字のコードは、シーケンシャルな露出を防ぎ、成功したバルク推測を非現実的にします。条件付き挿入は一意性を提供し、ハッシュパーティション化は300億レコードのコーパスをサポートし、アクティブ/アクティブなリージョンサービングはリージョンの単一障害点を排除し、非同期ストライプ化分析はカウンター書き込みをレイテンシクリティカルパスから完全にオフに保ちます。

判定

1位 | 勝者

勝利票

3 / 3

平均スコア

90

総合点

86

総評

回答Aは、例外的に徹底的かつ技術的に厳密な設計文書です。主要な決定事項はすべて、明記された制約に結び付けられています。100:1の比率と30B/5年の両方の数値から書き込みレートを導き出し、その不一致を解消しています。7文字のスペースが0.85%の占有率(約117回の推測で1回のヒット)で列挙可能であることを明示的に計算し、それゆえ11文字のランダムコードに移行しています。防御可能なレコード単位およびフリート単位のストレージ見積もり(論理値約18TB、レプリケート値90TB、バックアップ込みで150〜250TB)を提供し、ホップごとの割り当てとタイムアウト、ヘッジリードを含む具体的なp99レイテンシ予算を提示しています。また、99.99%を月あたり4.4分に換算し、インスタンス、キャッシュ、データストアシャード、およびリージョン全体のレイヤー化された障害処理を行っています。トレードオフは、コードの長さと列挙可能性、クロスリージョン書き込みレイテンシとグローバル一意性、アイドル容量とフェイルオーバーヘッドルーム、分析のカウント不足とリダイレクトレイテンシなど、全体を通して正直に述べられています。弱点は些細なもので、回答が長く密であり、一部のサイジング数値は導出ではなく主張されており、図形式の要約があればスキャンしやすくなるでしょう。全体として、ほぼすべての側面でベンチマークの期待を上回っています。

採点詳細を表示

設計の質

重み 30%
87

一貫性のあるアクティブ/アクティブマルチリージョンアーキテクチャで、作成/リダイレクトパスが明確に分離されており、一意性を確保するための条件付き挿入、リクエスト集約を伴う2レベルキャッシュ、および7文字コードの正しい定量的な却下(0.85%の占有率でバルク推測が可能になる)により、11文字のCSPRNGコードにつながっています。すべてのコンポーネントの決定は制約に結び付けられています。密度の高さと、導出ではなく主張されているサイジング数値がいくつかあるため、わずかに減点します。

完全性

重み 20%
90

7つの番号付き要件はすべて具体的な詳細で対処されています。仮定は最初に明記され、書き込みレートの調整、エイリアスコリジョンポリシーを備えた完全なコード生成分析、30Bレコードのストレージ計算、明示的なキャッシュミスと無効化の動作、50ms未満のp99のためのホップごとのレイテンシ予算、月あたり4.4分の予算にマッピングされたすべてのレイヤーでの障害処理、および耐久性のトレードオフを伴うストライプ化された非同期分析が含まれています。

トレードオフの説明力

重み 20%
85

トレードオフは全体を通して名前が付けられ、定量化されています。4文字の追加と列挙可能性(実際の確率計算付き)、クロスリージョンコンセンサス書き込みレイテンシとグローバル一意性、長いTTLとバージョン化された無効化によって制限される стаleness、50〜60%未満の利用率と可用性、および分析のカウント不足の許容とリダイレクトレイテンシ。代替案(シーケンスのキー付き順列)も検討され、理由とともに却下されています。

拡張性・信頼性

重み 20%
85

具体的なスケーリングストーリー:ハッシュパーティション化された仮想シャード、フェイルオーバーヘッドルームを備えたインスタンスサイジング、完全なキャッシュ障害時に10K RPS全体を吸収できるようにプロビジョニングされたデータストア、ヘッジリードとホップごとのタイムアウト、99.99%を月あたり4.4分に換算、インスタンス、ゾーン、キャッシュ、シャードリーダー選出、およびウォームスタンバイキャッシュを伴うリージョン全体の損失をカバーするレイヤー化された障害処理。クロスリージョンレプリケーションのRPOトレードオフが明示的に議論されています。

分かりやすさ

重み 10%
80

プロンプトに対応する番号付きセクション、明示的な仮定、および最後の要約により、よく整理されています。文章は密で長く、一部のセクションではテーブルや箇条書きが役立つであろう段落に多くの数値が詰め込まれていますが、議論の流れは常に追跡可能です。

採点モデル OpenAI GPT-5.5

総合点

92

総評

回答Aは非常に堅牢で具体的なシステム設計です。10K RPS、100:1の読み書き比率、p99 50ms未満、300億リンクのコーパス、99.99%の可用性目標、推測不可能性の要件に明確に結び付けられています。一貫した読み取りと書き込みフロー、強力なショートコード戦略、妥当なストレージサイジング、詳細なキャッシング動作、パーティショニング、マルチリージョン信頼性、非同期分析を提供します。主な弱点は、やや複雑であることですが、その詳細はほとんどが関連性があり、よく正当化されています。

採点詳細を表示

設計の質

重み 30%
92

回答Aは、個別の作成パスとリダイレクトパス、ローカルおよび分散キャッシング、権威のあるキーバリューストア、イベントストリーミング、アクティブアクティブリージョン、明確な通常および障害時のリクエストフローを備えた、一貫したエンドツーエンドのアーキテクチャを提供します。設計上の選択は、ワークロードとレイテンシの制約に適しています。

完全性

重み 20%
95

回答Aは、書き込み/読み取りフロー、一意性、カスタムエイリアスの衝突、データストアと容量の推定、キャッシュミスと無効化の動作、スケーリングとシャーディング、ノード/キャッシュ/リージョンの障害、非同期分析など、すべての必須セクションを詳細に扱っています。また、前提条件も明確に記載されています。

トレードオフの説明力

重み 20%
91

回答Aは、長いコードと列挙抵抗のトレードオフ、一意性とクォーラムまたはマルチリージョンの書き込みレイテンシのトレードオフ、速度とキャッシュTTLの鮮度低下のトレードオフ、可用性とスペア容量コストのトレードオフ、リダイレクトレイテンシと分析損失リスクのトレードオフなど、一貫してトレードオフを述べています。

拡張性・信頼性

重み 20%
92

回答Aは、ステートレスな水平スケーリング、仮想シャードによるハッシュパーティショニング、キャッシュサイジングとフォールバック、キャッシュ障害時のデータストアプロビジョニング、アクティブアクティブマルチリージョンデプロイメント、リージョンフェイルオーバー、クォーラム/コンセンサス動作、ホットパス書き込みを回避する非同期分析など、信頼性の高いスケーリングと信頼性の詳細を提供します。

分かりやすさ

重み 10%
90

回答Aは、必要なセクションを中心に構成されており、具体的な数値とメカニズムを使用しています。長文ですが、構造化されているため設計を理解しやすくなっています。

採点モデル Google Gemini 2.5 Pro

総合点

92

総評

回答Aは、傑出した包括的なシステム設計を提供しています。すべての制約に直接対処し、具体的で合理的な技術的選択を行っている点が優れています。短いコードの推測可能性に関する分析と、11文字のランダムコードの提案は、重要な強みです。キャパシティプランニングは詳細かつ現実的であり、マルチリージョン、アクティブアクティブアーキテクチャは、99.99%の可用性目標を達成するための信頼性の高い道筋を提供します。各レベル(ノード、キャッシュ、リージョン)での障害モードの議論は徹底しており、回復力のあるシステム構築に関する深い理解を示しています。

採点詳細を表示

設計の質

重み 30%
90

アーキテクチャは優れています。グローバルな性質と高可用性の要件に適した、マルチリージョン、アクティブアクティブ構成を最初から正しく提案しています。コンポーネントは明確に定義されており、読み取りパスと書き込みパスの両方のリクエストフローは詳細かつ論理的です。

完全性

重み 20%
95

回答は非常に包括的であり、要求された7つのセクションすべてにかなりの詳細で対処しています。すべての機能要件および非機能要件は、具体的な設計選択によってカバーされています。

トレードオフの説明力

重み 20%
90

トレードオフの推論は、この回答の大きな強みです。ほぼすべての重要な決定(例:コードの長さ、データストアの選択、キャッシュTTL、レプリケーション戦略)について、具体的なトレードオフが明示的に述べられ、要件の文脈で正当化されています。

拡張性・信頼性

重み 20%
95

これは回答の最も強力な部分です。7文字のコードが300億の規模で推測可能になることを正しく特定し、堅牢なソリューションを提案しています。キャパシティ見積もりは徹底的かつ現実的です。信頼性計画は優れており、インスタンス、ゾーン、キャッシュ、データストア、リージョンレベルでの障害をカバーし、99.99%の可用性への信頼性の高い道筋を提供します。

分かりやすさ

重み 10%
85

ドキュメントは非常に構造化されており、明確で、技術的に密度が高いです。要求された形式に正確に従っており、設計を要件に対して評価しやすくしています。

システム設計:URL短縮サービス (10K RPS)

前提条件:

  • 初期段階では単一リージョンを対象とし、マルチリージョンは将来的な拡張とします。
  • 読み書き比率が100:1であるため、リダイレクトパスを最優先します。
  • カスタムエイリアスは二次的な機能であり、標準リダイレクトと比較してわずかに高いレイテンシや一時的な利用不可に耐えうるとします。
  • クリック分析は厳密なリアルタイム性を必要とせず、わずかな遅延を許容します。

1. 高レベルアーキテクチャとリクエストフロー

書き込みパス(短縮リンクの作成):

  1. API Gateway: 長いURLとオプションのカスタムエイリアスを含むPOSTリクエストを受信します。
  2. **Load Balan...
全文を表示

システム設計:URL短縮サービス (10K RPS)

前提条件:

  • 初期段階では単一リージョンを対象とし、マルチリージョンは将来的な拡張とします。
  • 読み書き比率が100:1であるため、リダイレクトパスを最優先します。
  • カスタムエイリアスは二次的な機能であり、標準リダイレクトと比較してわずかに高いレイテンシや一時的な利用不可に耐えうるとします。
  • クリック分析は厳密なリアルタイム性を必要とせず、わずかな遅延を許容します。

1. 高レベルアーキテクチャとリクエストフロー

書き込みパス(短縮リンクの作成):

  1. API Gateway: 長いURLとオプションのカスタムエイリアスを含むPOSTリクエストを受信します。
  2. Load Balancer: 書き込みリクエストをURL短縮サービス(US)APIインスタンスに分散します。
  3. US API(書き込みサービス):
    • 入力URLを検証します。
    • 短縮コードを生成します(セクション2参照)。
    • カスタムエイリアスが指定されている場合、まずそれを予約しようとします(セクション2参照)。
    • マッピング(short_code -> original_url, custom_alias -> short_code)をデータストアに永続化します。
    • 生成された短縮URLをクライアントに返します。

読み取りパス(リダイレクト):

  1. API Gateway: 短縮URLのGETリクエストを受信します。
  2. Load Balancer: 読み取りリクエストをUS APIインスタンスに分散します。
  3. US API(読み取りサービス):
    • URLパスから短縮コードを抽出します。
    • キャッシュ検索: 分散キャッシュ(例:Redis Cluster)で短縮コードを検索します。
      • キャッシュヒット: 見つかった場合、元のURLを取得し、HTTP 301/302リダイレクトレスポンスを返します。
      • キャッシュミス: 見つからなかった場合、プライマリデータストアに問い合わせます。
    • データストア検索: プライマリデータストアで短縮コードに関連付けられた元のURLを検索します。
    • キャッシュ更新: データストアで見つかった場合、元のURLが将来のリクエストのためにキャッシュに追加されます。
    • リダイレクト: 元のURLを含むHTTP 301/302リダイレクトレスポンスを返します。
    • エラー処理: 見つからなかった場合、404 Not Foundを返します。
  4. クリック分析(非同期): 別のサービスまたはメカニズム(セクション7参照)がクリックイベントを非同期に記録します。

トレードオフ:

  • 関心の分離: 読み取りサービスと書き込みサービスを分離することで、独立したスケーリングと最適化が可能になります。読み取りパスは低レイテンシと高スループットに最適化されています。
  • API Gateway/Load Balancer: 高可用性が構成されていない場合、単一障害点となりますが、スケーリングとトラフィック管理には不可欠です。
  • キャッシュミスのペナルティ: キャッシュミスはデータストア検索によるレイテンシの増加を招きますが、これは大規模なキャッシュと高いヒット率によって緩和されます。

2. 短縮コード生成戦略

戦略: カウンター/IDジェネレーターを使用したBase62エンコーディング。

  1. ID生成: 一意で単調増加する64ビット整数を生成するために、分散ID生成サービス(例:SnowflakeライクまたはZooKeeper/etcdを使用した専用サービス)を使用します。これにより、ソースでの一意性が保証され、衝突が回避されます。
    • トレードオフ: 高可用性と高性能なID生成サービスが必要です。これが失敗すると、新しい短縮リンクを作成できなくなります。
  2. Base62エンコーディング: 生成された各64ビット整数IDは、Base62文字列(0-9、a-z、A-Z)に変換されます。64ビットIDは最大2^64の一意な値を表すことができます。最初の6文字は約680億(62^6)の一意な値を表し、7文字は約4.1兆(62^7)を表します。5年間で300億リンクの場合、7文字で十分であり、成長のための十分な余地があります。
    • トレードオフ: Base62エンコーディングは単純なハッシュよりもわずかに複雑ですが、より短いURLを提供し、シーケンシャルIDと比較して推測可能性を回避します。
  3. カスタムエイリアス:
    • ユーザーがカスタムエイリアス(例:「/my-link」)を要求すると、書き込みサービスはまず、データストア内の専用テーブル/インデックス(例:custom_aliasesテーブル、alias -> short_codeをマッピング)でエイリアスが既に取得されているかどうかを確認します。
    • エイリアスが利用可能な場合、それは予約され、新しく生成された短縮コードに関連付けられます。
    • エイリアスが取得されている場合、APIはユーザーにエラーを返します。
    • 衝突処理: ID生成とBase62エンコーディングにより、生成された短縮コードの一意性が保証されます。カスタムエイリアスは、衝突を防ぐためにデータストアでの個別のアトミックなチェックアンドセット操作を通じて処理されます。
    • トレードオフ: カスタムエイリアスの検索は、書き込みパスにわずかなオーバーヘッドを追加します。カスタムエイリアスの可用性は保証されません。

一意性の保証: 分散IDジェネレーターによって達成されます。各IDは一意であり、そのBase62表現も一意になります。

推測不可能: Base62エンコードされたIDはシーケンシャルではなく、作成順序やリンクの総数を示しません。実質的にランダムに見える文字列です。

3. データモデルとデータストア(複数可)

データストアの選択: プライマリリンクマッピング用の分散NoSQLキーバリューストア(例:Cassandra、DynamoDB、またはVitessのようなシャーディングされたリレーショナルDB)、および分析用の別個のシステム。

プライマリデータストア(リンクマッピング):

  • スキーマ:

    • linksテーブル/コレクション:
      • short_code(主キー、文字列、例:「aBcDeFg」)
      • original_url(文字列)
      • created_at(タイムスタンプ)
      • user_id(オプション、所有権/管理用)
    • custom_aliasesテーブル/コレクション:
      • alias(主キー、文字列、例:「my-link」)
      • short_code(文字列、links.short_codeへの外部キー)
  • データストアタイプの正当化: 分散NoSQLキーバリューストアは、その高可用性、水平スケーラビリティ、およびキー検索の優れた読み取りパフォーマンスにより選択されます。これはリダイレクトパスにとって非常に重要です。300億エントリという膨大な規模を処理できます。

  • 容量/ストレージ見積もり:

    • Linksテーブル: 300億エントリ。
      • short_code:約7バイト(Base62、7文字)
      • original_url:平均100バイト(大きく変動する可能性あり、平均値と仮定)
      • created_atuser_id:約10バイト
      • エントリあたりの合計:約117バイト。オーバーヘッドとレプリケーションのために150バイトに切り上げます。
      • 合計ストレージ:300億 * 150バイト = 4.5 * 10^12バイト = 4.5 TB。
    • Custom Aliasesテーブル: リンクの10%がカスタムエイリアスを持つと仮定(30億)。
      • alias:平均15バイト(長いURLより短い)
      • short_code:約7バイト。
      • エントリあたりの合計:約22バイト。オーバーヘッドのために50バイトに切り上げます。
      • 合計ストレージ:30億 * 50バイト = 150 * 10^9バイト = 0.15 TB。
    • プライマリ合計ストレージ: 約4.65 TB。これは分散NoSQLシステムにとって管理可能です。
  • パーティショニング/シャーディング: データストアは、linksテーブルの場合はshort_code(またはそのハッシュ)、custom_aliasesテーブルの場合はaliasでシャーディングされます。これにより、データと読み書き負荷が複数のノードに分散されます。

トレードオフ:

  • NoSQL vs. SQL: NoSQLストアは、スキーマの柔軟性と水平スケーリングのために好まれます。リレーショナルDBも機能しますが、より複雑なシャーディング管理(例:Vitess)が必要になります。
  • データ冗長性: NoSQLストアは通常、可用性のためにデータをレプリケートし、ストレージ要件を増加させますが、耐障害性を向上させます。
  • カスタムエイリアステーブル: メインのlinksテーブルをスキャンするのではなく、エイリアスの可用性を効率的にチェックするために別個のテーブルが使用されます。これは非効率的です。

4. キャッシュ戦略

戦略: 分散インメモリキャッシュ(例:Redis Cluster、Memcached)。

  • キャッシュするもの: 頻繁にアクセスされるshort_codeからoriginal_urlへのマッピング。
  • キャッシュキー: short_code(例:「aBcDeFg」)
  • キャッシュ値: original_url(例:「https://www.verylongurl.com/...」)
  • キャッシュサイズ: ホットリンクの大部分を保持できるようにサイズ設定します。10K RPSと100:1の比率を考慮すると、毎秒数百万のアクティブリンクが予想されます。100万から500万エントリを保持するキャッシュは、ホットリンクに対して高いヒット率を提供する必要があります。
  • キャッシュ無効化:
    • 標準リンクの明示的な無効化は不要: 作成されたリンクは不変です。マッピングは変更されません。
    • カスタムエイリアスの場合: カスタムエイリアスが変更された場合(通常は許可されませんが、もしそうなら)、古いshort_code -> original_urlマッピングはキャッシュに残ります。しかし、標準的なプラクティスでは、カスタムエイリアスは設定されると一意で永続的です。リンクが削除された場合(URL短縮サービスでは一般的な機能ではありません)、そのエントリはキャッシュから削除されます。
  • キャッシュミス処理:
    1. キャッシュミスが発生すると、US API(読み取りサービス)はshort_codeを使用してプライマリデータストアからoriginal_urlを検索します。
    2. データストアで見つかった場合、original_urlはクライアントに返される前に、有効期限(TTL)(例:24〜48時間)とともにキャッシュに書き戻されます。
    3. データストアで見つからなかった場合、404が返され、キャッシュにエントリは追加されません。

トレードオフ:

  • キャッシュの陳腐化: TTLベースのキャッシングは、リンクが更新された場合(更新が許可されていれば)キャッシュが古くなる可能性のある小さなウィンドウがあることを意味します。しかし、不変のリンクではこれは問題になりません。
  • キャッシュの可用性: キャッシュは重要なコンポーネントです。失敗した場合、データストア検索のためにレイテンシが大幅に増加しますが、サービスは利用可能なままです(ただし遅くなります)。
  • コスト: 大規模なインメモリキャッシュは高価になる可能性があります。

5. スケーリング戦略

読み取りパスのスケーリング(リダイレクト):

  • ステートレスAPIサーバー: リダイレクトを処理するUS APIインスタンスはステートレスです。これにより、ロードバランサーの後ろで無限に水平スケーリングできます。
  • 分散キャッシュ: シャーディングおよびレプリケーションされた分散キャッシュ(Redis Clusterなど)は、数百万のQPSを処理でき、低レイテンシを提供します。水平スケーリングのために設計されています。
  • データストアのスケーリング: 選択された分散NoSQLデータストア(Cassandra、DynamoDB)は水平スケーリングのために設計されています。ノードを追加することで、スループットと容量を増やすことができます。
  • ロードバランサー: 複数のレイヤー(API Gateway、サービス間)のロードバランサーがトラフィックを均等に分散します。

データパーティショニング/シャーディング:

  • データストアシャーディング: セクション3で述べたように、プライマリデータストアはlinksテーブルの場合はshort_code(またはそのハッシュ)、custom_aliasesテーブルの場合はaliasでシャーディングされます。これにより、データと読み書き負荷が複数のノードに分散されます。
  • キャッシュシャーディング: 分散キャッシュは本質的にシャーディングされており、キーをノード全体に分散します。
  • ID生成サービス: このサービスもスケーラブルである必要があります。ZooKeeper/etcdまたは分散合意プロトコルによって調整された複数のインスタンスを使用する可能性があります。

トレードオフ:

  • 複雑さ: シャーディングと分散システムは、運用上の複雑さを大幅に増加させます。
  • ホットスポット: シャーディングは役立ちますが、非常に人気のあるリンクは、特定のキャッシュシャードまたはデータストアパーティションにホットスポットを作成する可能性があります。一貫性ハッシュやより高度なロードバランシングなどの戦略でこれを軽減できます。

6. 信頼性と障害処理

可用性目標(99.99%): すべてのレイヤーで冗長性が必要です。

  • データストアノード障害:
    • 戦略: データは複数のノード(例:3〜5レプリカ)に、場合によってはリージョン内のアベイラビリティゾーン(AZ)全体にレプリケートされます。
    • 処理: データストアクラスターは、レプリカを昇格させることでノード障害を自動的に処理し、リクエストの提供を続行します。フェイルオーバー中の読み書きは、わずかなレイテンシのスパイクを経験する可能性がありますが、サービスは利用可能なままです。
    • トレードオフ: レプリケーションによるストレージコストの増加。
  • キャッシュノード障害:
    • 戦略: Redis Clusterのような分散キャッシュは、レプリケーションとシャーディングで設計されています。ノードが失敗した場合、そのレプリカが引き継ぐか、データが再分散される可能性があります。
    • 処理: キャッシュが再構築またはフェイルオーバーする間、キャッシュミスが一時的に増加します。システムはデータストアにフォールバックし、レイテンシは高くなりますが、可用性は維持されます。
    • トレードオフ: キャッシュ障害時の一時的なパフォーマンス低下。
  • APIサーバー障害:
    • 戦略: ロードバランサーの後ろで、ステートレスなUS APIサーバーの複数のインスタンスを実行します。
    • 処理: ロードバランサーは正常でないインスタンスを検出し、トラフィックの送信を停止します。トラフィックは正常なインスタンスに自動的にルーティングされます。
    • トレードオフ: 強力なロードバランシングとヘルスチェックが必要です。
  • リージョン障害:
    • 戦略: 単一リージョン内の複数のアベイラビリティゾーン(AZ)にサービスをデプロイします。より高い可用性のために、マルチリージョンアクティブアクティブまたはアクティブパッシブ構成を実装できます。
    • 処理: 1つのAZが失敗した場合、トラフィックは正常なAZにルーティングされます。リージョン全体が失敗した場合、トラフィックはセカンダリリージョンにルーティングされます(グローバルロードバランシングとデータレプリケーションが必要です)。
    • トレードオフ: マルチリージョン展開における複雑さとコストの大幅な増加。

可用性目標の達成: 冗長性、自動フェイルオーバー、およびグレースフルデグラデーション(キャッシュミス時のデータストアへのフォールバック)が鍵となります。障害を迅速に検出し対応するには、監視とアラートが不可欠です。

7. クリック分析の収集

戦略: クリティカルなリダイレクトパスに影響を与えないように、非同期処理。

  1. イベント生成: リダイレクトが発生したとき(元のURLが取得され、リダイレクトレスポンスが送信される前)、US API(読み取りサービス)は軽量なイベントを発行します。

判定

2位

勝利票

0 / 3

平均スコア

53

総合点

55

総評

回答Bは、明確な見出しと明示的なトレードオフの箇条書きを備えた、きちんと構成されたドキュメントですが、重大な実質的な欠陥があります。最も深刻なのは、ショートコードのスキームが内部的に一貫していないことです。Snowflakeスタイルの単調増加カウンターを使用しながら、Base62エンコーディングによりコードが非シーケンシャルで推測不可能になると主張していますが、これは誤りです。Base62エンコーディングされたシーケンシャルIDは完全に列挙可能であり、明示された推測不可能性の制約に直接違反します。また、回答はセクション7で文の途中で切り取られており、分析パイプライン(番号付きの要件)が不完全なままです。その他の弱点としては、ストレージ見積もりは平均URLサイズを100バイトと仮定していますが(おそらく低い)、レプリケーションを具体的に掛け合わせていません。p99 50ミリ秒未満のターゲットは、レイテンシバジェットで一度も対処されていません。キャッシュサイズの推論(100万〜500万エントリ)は導出なしに断言されています。リージョン障害の処理は、99.99%のターゲットに対応するために設計されるのではなく、将来の拡張機能として一般的に説明されています。その強みは、読みやすい構成、分析のための正しい非同期意図、および妥当なデータストア/シャーディングの選択です。

採点詳細を表示

設計の質

重み 30%
50

全体的な形状(ゲートウェイ、ステートレスサービス、Redisキャッシュ、シャーディングされたNoSQL)は合理的ですが、ショートコードの設計は内部的に一貫していません。単調増加するSnowflake IDをBase62でエンコードしても、シーケンシャルでバルク列挙可能であるにもかかわらず、回答では推測不可能であると主張しています。これは、明示されたハードコンストレイントに直接違反しており、設計の中心にある正確性の誤りです。アーキテクチャの残りの部分は、有能ですが一般的であり、デフォルトではシングルリージョンです。

完全性

重み 20%
50

セクション1〜6は合理的なレベルでカバーされていますが、セクション7(クリック分析)は文の途中でカットされており、番号付きの要件が不完全なままです。p99 50ミリ秒未満のターゲットは、レイテンシバジェットや数値で一度も対処されておらず、マルチリージョン信頼性は設計されるのではなく、将来の拡張機能として延期されています。ストレージ見積もりは存在しますが、URLサイズの過小評価である可能性があります。

トレードオフの説明力

重み 20%
60

各セクションには明示的なトレードオフの箇条書きが含まれており、これは真の強みですが、いくつかは浅いか一般的です(例:「複雑さが増す」、「レプリケーションが増加するコスト」)。最も重要なトレードオフであるシーケンシャルID対推測不可能性は、誤って処理されています。欠点は認識されるのではなく否定されています。キャッシュとスケーリングのトレードオフは述べられていますが、与えられた制約に対して定量化されていません。

拡張性・信頼性

重み 20%
55

ショートコードによる標準的な水平スケーリングとレプリケーションのストーリー、および自動フェイルオーバーは、適切ですが一般的です。設計はシングルリージョンであり、マルチリージョンはオプションとしてのみ言及されており、月間99.99%の可用性を弱くサポートしています。フェイルオーバー容量の定量化、レイテンシバジェットはなく、ID生成サービスは具体的な緩和策なしに作成SPOFとして認識されています。ホットスポットの緩和は、「一貫性ハッシュなどの戦略」として曖昧にされています。

分かりやすさ

重み 10%
65

見出し、箇条書き、セクションごとのトレードオフの注釈を備えたクリーンなMarkdown構造により、スキャンしやすくなっています。しかし、ドキュメントはセクション7で文の途中で突然終了しており、読書体験を著しく損ない、最終的な要件を未解決のままにしています。

採点モデル OpenAI GPT-5.5

総合点

49

総評

回答Bは、APIサーバー、キャッシュ、データストア、シャーディング、非同期分析の意図を備えた認識可能なURL短縮アーキテクチャを示していますが、ベンチマーク要件に対してははるかに弱いです。99.99%の可用性目標にもかかわらず当初は単一リージョンを想定しており、Base62エンコードされた単調生成IDは推測不可能であるという主張は誤っており、p99 50ミリ秒の目標に対するレイテンシ分析は限定的で、ストレージ見積もりは疑わしく、分析セクションは不完全/切り取られています。トレードオフは存在しますが、多くは一般的です。

採点詳細を表示

設計の質

重み 30%
52

回答Bには、APIゲートウェイ、ロードバランサー、キャッシュ、データストア、非同期分析の概念を含むURL短縮器の基本的なコンポーネントがあります。しかし、アーキテクチャは一般的で、当初は単一リージョンであり、詳細なレイテンシ予算がなく、推測不可能性の要件に対して疑わしいコード生成アプローチを使用しています。

完全性

重み 20%
41

回答Bは多くの見出しを表面上カバーしていますが、いくつかの要件は不完全または未発達です。推測不可能なコードの要件を適切に満たしておらず、p99 50ミリ秒未満を明示的に設計しておらず、マルチリージョンを将来の作業として扱っており、分析セクションは実際のメカニズムが説明される前に切り取られています。

トレードオフの説明力

重み 20%
50

回答Bにはトレードオフの箇条書きが含まれていますが、多くは一般的で制約に深く結びついていません。シーケンシャルまたは単調なIDから派生したコードは列挙しやすいという重要なトレードオフを見逃しており、単一リージョン設計で開始することの可用性への影響を過小評価しています。

拡張性・信頼性

重み 20%
44

回答Bは水平スケーリング、シャーディングされたキャッシュ、シャーディングされたデータストア、レプリケートされたノードを説明していますが、当初は単一リージョンを想定し、マルチリージョンを拡張機能として残しているため、99.99%に対する信頼性のストーリーは十分ではありません。また、キャッシュミスや障害中に読み取りパスがp99 50ミリ秒未満をどのように維持するかを示していません。

分かりやすさ

重み 10%
62

回答Bは一般的に読みやすく、要求されたセクションで構成されていますが、精度が低く、いくつかの不正確な主張が含まれており、最後の分析セクションは明らかに切り取られており、明瞭さと完全性が低下しています。

採点モデル Google Gemini 2.5 Pro

総合点

57

総評

回答Bは標準的ではあるものの、不完全で欠陥のある設計です。主な弱点は、推測不可能という要件に直接反する、ショートコード用のシーケンシャルIDジェネレーターの選択です。単一リージョンを想定した初期設計は、99.99%の可用性という目標には不適切です。さらに、キャパシティの見積もりは楽観的すぎ、分析に関する最後のセクションは途中で終わっており、回答が不完全です。基本的なコンポーネントは正しいものの、設計はプロンプトのいくつかの重要な制約を満たせていません。

採点詳細を表示

設計の質

重み 30%
65

アーキテクチャは標準的で、基本的なURL短縮サービスとしては概ね正しいです。しかし、99.99%という可用性の要件を考えると、単一リージョンを想定した初期設計は大きな弱点であり、マルチリージョンまたは少なくとも堅牢なマルチAZ機能なしでは達成が非常に困難です。

完全性

重み 20%
40

回答は不完全です。クリック分析に関する最後のセクションは、途中で終わっています。さらに、信頼性要件の重要な部分であるリージョン障害に関する議論が、設計のコア部分としてではなく、将来の拡張として扱われています。

トレードオフの説明力

重み 20%
60

回答にはトレードオフに関する考察が含まれていますが、それはしばしば一般的です(例:「NoSQL対SQL」、「キャッシュは高価になりうる」)。プロンプトの制約に直接結び付けられた回答Aのトレードオフと比較すると、深みと具体性に欠けています。

拡張性・信頼性

重み 20%
50

この領域には重大な弱点があります。提案されているコード生成戦略(カウンターのBase62エンコード)は推測可能であり、コア要件に違反しています。キャパシティの見積もりは楽観的です。特にリージョン障害に関する信頼性計画が未熟であり、提案された設計では99.99%の可用性目標の達成は不可能に見えます。

分かりやすさ

重み 10%
70

回答は明確に記述されており、見出しもあって構造化されています。しかし、回答Aほどの深みがなく、最後のセクションが不完全であることが全体的な明瞭さを損なっています。

比較結果サマリー

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

採点者数: 3

勝利票

3 / 3

平均点

90
この回答を見る

採点結果

採点モデル Google Gemini 2.5 Pro

勝者理由

回答Aは、プロンプトの制約に完全に沿った、大幅に堅牢で詳細かつ正確な設計を提供しているため、明確な勝者です。回答Aの優位性は、最も重視される基準において最も明らかです。そのアーキテクチャはグローバルであり、高可用性のために構築されており、信頼性計画は包括的(重要な地域フェイルオーバーを含む)であり、その理由は提供された数値に直接結びついています。対照的に、回答Bは、推測可能なショートコード戦略を提案するという重大な誤りを犯しており、設計は弱い単一リージョン仮定に基づいており、不完全です。

採点モデル OpenAI GPT-5.5

勝者理由

回答Aが勝利したのは、その加重された強みが、アーキテクチャ品質、完全性、トレードオフの推論、スケーラビリティ/信頼性といった最も重要な基準に集中しているためです。番号付きの要件と明示された制約に具体的なメカニズムで直接対処していますが、回答Bは、推測不可能なコード生成、マルチリージョン可用性、明示的なレイテンシ計画、完全な分析設計といった、いくつかのコア要件を見逃しているか、弱くしか扱っていません。

勝者理由

回答Aは、重み付けの高い基準において決定的な勝利を収めました。アーキテクチャ品質(重み30)において、Aは一貫性があり正しい設計を提示し、定量的な推論をもって推測不可能性の制約を明示的に満たしていますが、Bのコアコード生成スキーム(シーケンシャルなSnowflake IDをbase62エンコードしたもの、推測不可能と主張)は、述べられた要件と矛盾しています。完全性(20)において、Aは7つの要件すべてに具体的な数値で対応していますが、Bは分析セクションで文の途中で途切れており、p99 50msのターゲットレイテンシ予算に全く対応していません。トレードオフの推論(20)とスケーラビリティ/信頼性(20)において、Aは実際の欠点を挙げ、リージョン障害復旧、容量ヘッドルームの計算、キャッシュ障害時のプロビジョニングを提供していますが、Bはシングルリージョンをプライマリ設計とする、より一般的な定型文にとどまっています。Aは、その長さにもかかわらず、明瞭さにおいてもBをわずかに上回っています。重み付けの結果は、すべての基準においてAを強く支持しています。

X f L