回答A: OpenAI GPT-5.4
A. 短縮URL生成戦略
- 要件駆動型の選択
- 新規書き込み: 1億件/月 ≈ 330万件/日 ≈ 平均38.6件/秒。
- 読み取り比率100:1 ≈ 33億件/月 ≈ 平均1,270件/秒、ピークは10~50倍になる可能性あり。
- コンパクトで、グローバルに一意なIDと非常に高速な検索が必要。
- コード生成アプローチ
決定論的なID生成サービスとBase62エンコーディングを使用する。
フロー:
- グローバルに一意な数値IDが生成される。
- その整数が文字[0-9a-zA-Z]を使用してBase62にエンコードされる。
- 例: 125 → Base62で「21」。
このアプローチを採用する理由:
- IDが一意であれば、衝突のリスクはない。
- 生成が非常に高速。
- ランダムコードの衝突チェックと比較して運用が容易。
-...
全文を表示 ▼
A. 短縮URL生成戦略
- 要件駆動型の選択
- 新規書き込み: 1億件/月 ≈ 330万件/日 ≈ 平均38.6件/秒。
- 読み取り比率100:1 ≈ 33億件/月 ≈ 平均1,270件/秒、ピークは10~50倍になる可能性あり。
- コンパクトで、グローバルに一意なIDと非常に高速な検索が必要。
- コード生成アプローチ
決定論的なID生成サービスとBase62エンコーディングを使用する。
フロー:
- グローバルに一意な数値IDが生成される。
- その整数が文字[0-9a-zA-Z]を使用してBase62にエンコードされる。
- 例: 125 → Base62で「21」。
このアプローチを採用する理由:
- IDが一意であれば、衝突のリスクはない。
- 生成が非常に高速。
- ランダムコードの衝突チェックと比較して運用が容易。
- コード長の予測可能な成長。
- IDジェネレーターの設計
推奨オプション:
- Snowflakeスタイルの64ビットIDジェネレーターまたは集中型レンジアロケーターを使用する。
- IDフィールドにはタイムスタンプ + マシンID + シーケンスを含めるか、アプリサーバーに単調増加するレンジを割り当てる。
2つの良い実装:
- SnowflakeライクなID: 分散型、高スループット、低協調。
- メタデータストアからのレンジ割り当て: 各書き込みノードがIDブロック(例: 100万件)をリースする。
書き込みスループットは控えめなので、シンプルさからレンジ割り当てを好む。各書き込みサーバーはリースされたレンジからローカルでIDを生成でき、ホットな中央依存を回避できる。
- エンコーディングスキームと予想される長さ
Base62の容量:
- 62^6 ≈ 56.8億
- 62^7 ≈ 3.52兆
5年間の総リンク数:
- 1億件/月 * 60ヶ月 = 60億件
したがって、IDがグローバルに密に使用される場合、長期的なヘッドルームのために6文字のBase62では不十分だが、7文字あれば十分すぎる。
予想される長さ:
- 必要であれば、初期段階では6文字から始める。
- 実用的には、実装をシンプルに保ち、ユーザーの期待における長さの変更を避けるために、7文字に標準化する。
- 衝突処理
決定論的な一意IDの場合:
- コードレベルでの衝突はない。
- 短縮コードに対するデータベースの一意性制約が最終的なセーフティネットとなる。
- ソフトウェアバグやIDの設定ミスにより、非常にまれな重複が発生した場合は、新しいIDから再生成し、アラートを出す。
- 排出戦略
- 7文字のBase62は3.52兆の組み合わせを提供し、5年間で必要な60億件をはるかに超える。
- 将来的にスケールが大幅に増加した場合でも、8文字のコードをシームレスにサポートする。
- リダイレクトサービスはコード長を可変として扱うべきなので、移行の問題はない。
- オプションのカスタムエイリアス
製品がユーザー定義のエイリアスをサポートする場合:
- 同じマッピングテーブルに一意性を強制して保存する。
- ブロックされた単語や不適切な用語を予約する。
- カスタムエイリアスは競合のホットスポットであるため、より厳格なレート制限を適用する。
B. データストレージ
- プライマリデータベースの選択
URLマッピングには、以下のような分散型で高可用性のキーバリューストアを使用する:
- DynamoDB / Bigtable / Cassandra
理由:
- 主なアクセスパターンは、short_codeによる単純なキー検索である。
- 水平スケーリング、高可用性、マルチレプリカ読み取りが必要。
- 書き込みは控えめで、読み取りが支配的。
- キーバリューストアへのアクセスは、50ミリ秒未満のリダイレクトレイテンシに最適。
概念的にはDynamoDBライクまたはCassandraライクなストレージを選択する:
- short_codeのハッシュでパーティション化する。
- アベイラビリティゾーンをまたいでレプリケートする。
- 低レイテンシのポイントリードにチューニングする。
- セカンダリストア
- コントロールプレーンのメタデータ、請求、ユーザー、ドメイン、ポリシー用のリレーショナルDB。
- 分析/クリックログ用のオブジェクトストレージ + データレイク。
- 管理者が作成者、日付、タグなどでクエリする必要がある場合は、オプションの検索/インデックスストア。
- スキーマ設計
プライマリマッピングテーブル:
- short_code (PK)
- destination_url
- created_at
- expires_at (NULL許容)
- owner_id (NULL許容)
- status (active, disabled, deleted)
- redirect_type (301/302)
- checksumまたはnormalized_urlハッシュ (オプション)
- metadata pointer (オプション)
製品がテナントごとに同じ長URLに同じ短縮URLを返すことを望む場合のオプションの重複排除テーブル:
- dedup_key = hash(tenant_id + canonicalized_url)
- short_code
これはオプションである。多くのURL短縮サービスは、セマンティクスがユーザー、キャンペーン、または分析ニーズによって異なるため、グローバルな重複排除を行わない。
- 5年間のストレージ見積もり
総リンク数:
- 60億件のレコード
レコードあたりの概算:
- short_code: 約8バイト相当(生)
- destination_url: 平均200バイトと仮定
- タイムスタンプ/ステータス/フラグ: 約24バイト
- レプリケーション/バージョニング/インデックスのオーバーヘッド: 実際のシステムでは大きい
- ストレージエンジンのオーバーヘッド: プライマリDBあたりレコードあたり実効合計350~500バイトと仮定
400バイト/レコードを使用:
- 60億 * 400バイト = 2.4 TB の論理データ(生)
レプリケーションファクター3の場合:
- 7.2 TB
インデックス、コンパクションオーバーヘッド、トゥームストーン、メタデータ、運用上のヘッドルームを追加:
- 5年間でプライマリストレージに10~15 TBを計画
分析/クリックログはマッピングよりもはるかに大きい。
書き込み100件あたり100回の読み取りの場合:
- 5年間で6000億回のリダイレクト
各クリックログイベントの平均が圧縮状態でわずか100バイトであっても、それは約60 TB(圧縮状態)であり、よりリッチなフィールドがあればおそらくそれ以上になる。したがって、ログはサービングデータベースではなく、安価なオブジェクトストレージに格納すべきである。
- パーティショニング/シャーディング戦略
プライマリテーブルのシャーディング:
- パーティションキー: short_code または hash(short_code)
- IDが適切に混合された、分散性の高い数値IDまたはレンジIDからエンコードされるため、均一に分散される。
重要な注意:
- 純粋なシーケンシャルIDは、キーの局所性が重要である場合、一部のデータベースでホットパーティションを作成する可能性がある。
- これを回避するには、次のいずれかを行う:
- パーティション配置のためにshort_codeをハッシュする。
- 下位ビットに十分なエントロピーを持つIDを使用する。
- Base62エンコーディングの前にシャードビットをプレフィックスとして付ける。
均一な分散を保証するために、short_codeで明示的にハッシュパーティション化する。
C. 読み取りパスアーキテクチャ
- 読み取りパスの概要
リクエストフロー:
- ユーザーが https://sho.rt/abc1234 にアクセスする。
- DNSが最寄りのエッジ/CDNにルーティングする。
- CDNがキャッシュヒットしない場合、リージョナルリダイレクトサービスに転送する。
- リダイレクトサービスがインメモリ/Redisキャッシュをチェックする。
- キャッシュミスの場合、分散KVストアから読み取る。
- HTTP 301/302とLocationヘッダーを返す。
- クリックイベントを非同期に分析パイプラインに発行する。
- <50ms p95レイテンシの達成
リダイレクトパスは非常に軽量である必要がある。
レイテンシバジェットの例:
- エッジ/CDNルーティング: 小規模、地理的にローカル。
- アプリケーション処理: 1~3ms。
- Redis/インメモリキャッシュヒット: 1~5ms。
- リージョン内のDBミスパス: 通常5~15ms。
- p95合計50ms未満は、リージョナルサービングと積極的なキャッシュで達成可能。
- キャッシュレイヤー
レイヤー1: CDN/エッジキャッシュ
- エッジでホットリンクのリダイレクトレスポンスをキャッシュする。
- 多くの人気のある短縮リンクは繰り返しアクセスされるため、非常に効果的。
- TTL(例: 可変性に応じて数分から数時間)を持つCache-Controlヘッダーを使用する。
- リンクを迅速に無効化できる場合は、より短いTTLまたはパージサポートを選択する。
レイヤー2: アプリケーションローカルキャッシュ
- 各リダイレクトノードは、ホットマッピングのLRUキャッシュを保持する。
- 超低レイテンシで、Redisへのネットワークホップを回避する。
- 最も頻繁にリクエストされるコードに適している。
レイヤー3: 分散キャッシュ (Redis/Memcached)
- リージョナルフリート用の共有キャッシュ。
- short_code → destination_url, status, redirect type を格納する。
- 不変リンクの場合はTTLを長く設定できる。可変/管理者が管理するリンクの場合は短くする。
- 読み取りのためのレプリケーション戦略
- 各リージョン内のマルチAZレプリカ。
- ローカルリージョンのストレージレプリカから読み取りをサーブする。
- 複数のリージョン間でのアクティブ/アクティブ。
- 最も近い正常なリージョンにルーティングするために、ジオDNSまたはAnycastを使用する。
- キャッシュポピュレーション戦略
- ミス時のリードスルー: アプリケーションがDBからフェッチし、Redisとローカルキャッシュをポピュレートする。
- 存在しない/無効化されたコードのネガティブキャッシュを短いTTLで設定し、アビューズやタイポストームを吸収する。
- 分析から既知のトレンドリンクについては、キャッシュを事前ウォームアップする。
- リダイレクトセマンティクス
- デフォルトでは302。宛先が変更される可能性がある場合、または分析/追跡ポリシーで柔軟性が必要な場合。
- クライアントやCDNが積極的にキャッシュする可能性のある永続リンクの場合は301。
- 製品の決定により、両方のオプションを提供できる。
- 読み取りパスでのアビューズ処理
- 疑わしい高レートのリクエストに対して、IP / ASN / トークンによるレート制限。
- CDNでのWAFとボットフィルター。
- ブルートフォースの短縮コードスキャンからオリジンを保護する。
D. 書き込みパスアーキテクチャ
- 書き込みパスの概要
リクエストフロー:
- クライアントが長URLとオプションのメタデータ/カスタムエイリアスを送信する。
- APIゲートウェイが認証とレート制限を行う。
- URLの検証と正規化はステートレスなアプリ層で行われる。
- アプリケーションが短縮コードを取得/生成する。
- マッピングをプライマリKVストアに永続化する。
- 即時利用のために、キャッシュを非同期または同期的にポピュレートする。
- 作成イベントをキューに発行し、分析、アビューズスキャン、および下流のインデックス作成を行う。
- 容量
1億件/月は最新のシステムとしては多くない:
- 平均約39件/秒
- 100倍のバーストでも数千件/秒程度
したがって、主な目標は、極端な書き込みスループットではなく、信頼性、冪等性、および運用のシンプルさである。
- 検証ステップ
- URL構文を検証する。
- 通常はhttp/httpsのみの許可プロトコルを強制する。
- オプションで、セーフブラウジングまたはマルウェアスキャンを非同期で行う。リスクが見つかった場合はリンクを無効化する。
- オプションの重複排除ロジックのためにURLを正規化する。
- キューイングと非同期処理
サイドエフェクトのために、耐久性のあるキューまたはログ(Kafka/SQS/PubSubなど)を使用する:
- 新規リンク作成の分析イベント
- アビューズ/詐欺/フィッシング検出
- キャッシュウォームアップ
- 検索インデックス作成
- 通知/監査パイプライン
クリティカルパスには、マッピングの作成と短縮URLの返却に必要なものだけを含めるべきである。
- 一貫性モデル
作成レスポンスの場合、新しい短縮コードに対して書き込み後の作成一貫性を使用する:
- APIが成功を返したら、リダイレクトはすぐに機能するはずである。
方法:
- DBコミット前に、プライマリDBのクォーラム/リーダーにマッピングを永続化する。
- オプションで、DBコミット後にRedisにライトスルーする。
- リダイレクトパスはキャッシュミス時にDBにフォールバックするため、キャッシュ伝播の遅延は正当性を損なわない。
- 冪等性
リトライ中の重複リンクを防ぐために、APIクライアント向けの冪等性キーをサポートする。
- 短い期間のTTLで、高速なストアに request_id → short_code を格納する。
- 特にモバイル/ネットワークリトライシナリオで役立つ。
- レート制限
- アビューズを制御するための、ユーザー/APIキーごとのクォータ。
- カスタムエイリアスリクエストに対するより強力な制限。
- 攻撃によって引き起こされる書き込み増幅を防ぐためのグローバルなセーフガード。
E. 信頼性と耐障害性
-
可用性目標: 99.9%
99.9%のアップタイムは、月あたり約43.8分のダウンタイムを許容する。これは、マルチAZデプロイメントとリージョンフェイルオーバーで達成可能である。 -
障害処理
ノード障害:
- ステートレスアプリノードはロードバランサーの後ろに配置し、正常でないインスタンスを自動的に置き換える。
- ローカルキャッシュは破棄可能。
- Redisは高可用性クラスタ/センチネルモードでデプロイされる。
AZ障害:
- アプリ層は少なくとも3つのAZにまたがってデプロイされる。
- プライマリDBはAZをまたいでレプリケートされる。
- ロードバランサーが正常でないAZを除外する。
リージョン/DC障害:
- 複数のリージョン間でのアクティブ/アクティブな読み取りサービング。
- データは、DBの機能に応じて、非同期またはニアシンクロナスでクロスリージョンにレプリケートされる。
- DNS/トラフィックマネージャーがユーザーを正常なリージョンにフェイルオーバーする。
- データ耐久性
- プライマリDBのレプリケーションファクター3をAZをまたいで設定。
- オブジェクトストレージへの定期的なスナップショット/バックアップ。
- サポートされている場合はWAL/コミットログのアーカイブ。
- 災害復旧のためのクロスリージョンバックアップコピー。
- バックアップとリカバリ戦略
- 毎日のフルスナップショットと増分バックアップ。
- 偶発的な削除/破損に対するポイントインタイムリカバリ。
- RTO/RPOを検証するためのステージングへの定期的なリストアドリル。
- 5年間のアクセス可能性要件とコンプライアンスニーズに合わせたバックアップ保持期間。
合理的な目標:
- RPO: 数分~1時間(クロスリージョンレプリケーションモデルによる)
- RTO: リージョンフェイルオーバーの場合は1時間未満、完全なストレージ再構築の場合はそれ以上だが、それはまれであるべき。
- キャッシュ無効化戦略
リンクのほとんどが不変であれば、キャッシュはシンプルである。
可変リンク(無効化/宛先変更/有効期限変更)の場合:
- まずDBを更新する。
- 無効化イベントを発行する。
- Redisキーとローカルキャッシュエントリをエビクトする。
- エッジキャッシュがそのコードに使用されている場合は、CDNキャッシュをパージする。
- TTLを制限し、無効化が失敗した場合でも古いキャッシュが自己修復するようにする。
- データ破損とアビューズからの保護
- short_codeに対するDBの一意性制約。
- レコードのチェックサム/バージョンフィールド。
- 管理アクションの監査ログ。
- ハード削除ではなく、可能な限りソフト削除または無効化状態。
- マルウェア/フィッシングスキャンとテイクダウンツール。
F. 主要なトレードオフ
- 決定論的ID生成 vs ランダム短縮コード
オプション:
- 決定論的シーケンシャル/レンジベースID: シンプル、衝突なし、コンパクト、高速。
- ランダムコード: 予測可能/列挙可能ではないが、衝突チェックとより多くの複雑さが必要。
選択:
- Base62でエンコードされた決定論的IDを選択する。
理由:
- このスケールでは、よりシンプルで、高速で、運用上安全である。
- リトライループなしで衝突フリー。
- スループットが控えめで、主な課題が読み取りレイテンシであるため、より適している。
コスト:
- コードがより列挙可能/予測可能になる可能性がある。
緩和策: - レート制限、ボット検出、機密性の高いリンクのためのオプションのより長い/非シーケンシャルエイリアス。
- 作成時の強力な一貫性 vs すべての場所での最終的な一貫性
オプション:
- 最終的な一貫性は、書き込みレイテンシを削減し、マルチリージョン書き込みを簡素化できる。
- 耐久性のある書き込み後の強力な確認により、返された短縮URLがすぐに機能することを保証する。
選択:
- ホームリージョン内の単一リンク作成パスでは強力な一貫性を使用する。セカンダリキャッシュとクロスリージョン伝播では最終的な一貫性を使用する。
理由:
- より良いユーザーエクスペリエンス: APIが返されたら、リダイレクトは成功するはずである。
- 書き込み量は、クリティカルな書き込みで一貫性を緩和する必要がないほど少ない。
- 積極的なエッジキャッシュ vs 高速な無効化
オプション:
- 長いCDN TTLは、読み取りパフォーマンスを最大化し、オリジンコストを削減する。
- 短いTTLは、無効化/更新操作をより迅速に伝播させる。
選択:
- 可変/管理者が管理するリンクの場合は、明示的なパージを伴う中程度のTTL。不変リンクの場合はより長いTTL。
理由:
- 短縮されたURLのほとんどは実質的に不変であるため、キャッシュは大幅なレイテンシとコストのメリットをもたらす。
- しかし、アビューズのテイクダウンには、ある程度高速な無効化が必要である。
- シンプルさ vs リダイレクトパスでの分析の豊富さ
オプション:
- 同期クリックロギングは、即時の分析保証を提供するが、レイテンシと障害の結合を追加する。
- 非同期イベント発行は、リダイレクトを高速に保つが、障害発生時に分析が遅延したり、少量失われたりする可能性がある。
選択:
- 非同期分析。
理由:
- 製品のハードSLAは、リダイレクトレイテンシと可用性であり、ゼロロスリアルタイム分析ではない。
- リダイレクトパスは、下流のロギングシステムのためにブロックされるべきではない。
アーキテクチャの概要
- 短縮コード生成: レンジリースまたはSnowflakeスタイルのユニーク64ビットIDをBase62でエンコード、標準7文字コード。
- プライマリストア: 分散KVデータベース、short_codeによるハッシュパーティショニング、RF=3、マルチAZ。
- 読み取りパス: CDN + ローカルキャッシュ + Redis + KVストアフォールバック。マルチリージョンアクティブ/アクティブ読み取り。
- 書き込みパス: ステートレスAPI + 耐久性のあるDB書き込み + サイドエフェクト用の非同期キュー。冪等性とレート制限。
- 信頼性: マルチAZ、クロスリージョンレプリケーション、バックアップ、キャッシュ無効化イベント、DNSフェイルオーバー。
- この設計は、1億件/月の新規URL、100:1の読み取り比率、5年間の保持期間、99.9%のアップタイム、および<50msのp95リダイレクトを余裕でサポートする。
判定
勝利票
3 / 3
平均スコア
総合点
総評
包括的で構造化された設計であり、必須のセクションすべてが、堅牢な定量的推論(書き込み/読み取りQPS、5年間のボリューム、Base62キー空間)と実用的なメカニズム(範囲リースID、CDN + ローカル + Redisによるマルチレイヤーキャッシュ、ネガティブキャッシュ、マルチリージョンルーティング、べき等性、キューベースの副作用、キャッシュ無効化/パージ戦略)によって網羅されています。ストレージサイジングは合理的に控えめで、実際のオーバーヘッドとログボリュームの分離を認識しています。トレードオフは具体的で制約(レイテンシ対分析の結合度、CDN TTL対無効化、整合性の選択)に関連付けられています。
採点詳細を表示 ▼
設計の質
重み 30%エンドツーエンドのアーキテクチャは一貫しています。範囲リースによる決定論的なID生成、KVプライマリストア、マルチレイヤーキャッシュ(CDN/ローカル/Redis)、非同期分析、および明示的なパーティショニング/ホットスポット緩和。レイテンシと運用の懸念にうまく対処しています。
完全性
重み 20%A~Fを計算、スキーマ、ストレージ見積もり、読み書きパス、信頼性、および複数のトレードオフで完全にカバーしています。ネガティブキャッシュ、不正利用制御、カスタムエイリアスなどの追加機能も含まれています。
トレードオフの説明力
重み 20%トレードオフは具体的で正当化されています(決定論的ID対ランダム性/列挙、強い作成整合性対最終的な伝播、CDN TTL対削除速度、非同期分析対リダイレクトレイテンシ)。
拡張性・信頼性
重み 20%明確なマルチAZ + マルチリージョンアプローチ、フェイルオーバールーティング、RF=3、バックアップ/PITR、キャッシュ障害時の動作、および大規模環境でリダイレクトレイテンシを低く抑えるためのメカニズム。
分かりやすさ
重み 10%具体的な箇条書き、フロー、概算計算により、よく整理されており、詳細にもかかわらず理解しやすいです。
総合点
総評
回答Aは、傑出した包括的なシステム設計を提供しています。構造化されており、詳細で、実践的な課題に対する深い理解を示しています。ストレージの定量的見積もりは現実的で、十分に正当化されています。読み取りパスと書き込みパスの両方のアーキテクチャは堅牢で実用的であり、問題の規模に完全に適合しています。トレードオフの議論は特に強力で、4つの明確で関連性の高い点を明確な理由付けとともに特定しています。キャッシュ無効化戦略や不正利用処理などの運用上の詳細を含めることで、設計の質がさらに向上しています。
採点詳細を表示 ▼
設計の質
重み 30%アーキテクチャは例外的に優れた設計です。読み取りパスにおけるマルチレイヤーキャッシュ(CDN、ローカル、分散)は優れています。書き込みパスはシンプルで堅牢であり、ユーザーインターフェースのクリティカルパスに対して強力な一貫性を提供すると同時に、副作用を非同期キューに適切にオフロードします。これは実用的で非常に効果的な設計です。
完全性
重み 20%回答は非常に完全であり、プロンプトのすべてのセクションを詳細に扱っています。カスタムエイリアスなどのオプション機能の議論、レイテンシ予算の提供、読み取りパスと書き込みパスの両方での不正利用処理の詳細を提供することで、最小限の要件を超えています。
トレードオフの説明力
重み 20%トレードオフ分析は傑出しています。回答は、プロンプトで要求された2つを超える、4つの明確で非常に関連性の高いトレードオフを特定しています。各選択肢は、システム設計原則に対する深い理解を反映した、明確で説得力のある理由付けとともに説明されています。
拡張性・信頼性
重み 20%設計は非常にスケーラブルで信頼性があります。マルチAZ/マルチリージョンデプロイメント、レプリケーションを備えた分散データベース、堅牢なバックアップ戦略などの標準的なパターンを正しく採用しています。信頼性に関する議論は徹底しており、ノードからリージョンレベルまでのさまざまな障害シナリオをカバーしています。
分かりやすさ
重み 10%回答は、非常に明確でよく構造化された設計ドキュメントとして提示されています。セクションは論理的であり、説明は理解しやすいです。定量的推論はステップバイステップで提示されており、検証が容易です。
総合点
総評
回答Aは、包括的で構造化された優れた設計ドキュメントであり、要求された6つのセクションすべてを徹底的に網羅しています。詳細な容量計算、レイテンシ予算の分解、ストレージ見積もりなど、全体を通して強力な定量的推論を示しています。アーキテクチャは、各選択肢に対する明確な説明とともに、非常によく正当化されています。リードパスアーキテクチャは特に強力で、マルチレイヤーキャッシュ戦略(CDN、ローカルキャッシュ、Redis、DBフォールバック)と詳細なレイテンシ予算分析を備えています。ライトパスは、控えめな書き込みスループットを正しく特定し、信頼性と冪等性に焦点を当てています。トレードオフセクションは格別であり、4つの真のトレードオフを特定し、それぞれの選択肢についてニュアンスのある推論と、デメリットに対する緩和策を含んでいます。また、回答は、不正利用処理、ネガティブキャッシュ、カスタムエイリアス、分析ログの分離など、重要な実用的な懸念事項もカバーしています。軽微な弱点としては、一部冗長であることと、ストレージ見積もりでURLに200バイトを使用していること(わずかに高いですが、保守的な見積もりとして合理的)が挙げられます。
採点詳細を表示 ▼
設計の質
重み 30%回答Aは、リード用にCDN、ローカルキャッシュ、Redis、DBフォールバックを備えた、よく設計されたマルチレイヤーアーキテクチャを提示しており、50ms p95が達成可能であることを示す明確なレイテンシ予算を備えています。ライトパスは、クライアントに確認する前に永続的なDB書き込みを確実にします。範囲ベースのID割り当ては、控えめな書き込みスループットに対して適切に正当化されています。分析を非同期パイプラインとオブジェクトストレージに分離することは、実用的で合理的な判断です。
完全性
重み 20%回答Aは、カスタムエイリアス、リードパスでの不正利用処理、ネガティブキャッシュ、リダイレクトセマンティクス(301 vs 302)、冪等性キー、ソフトデリート、分析ストレージ分離といった追加の実用的な考慮事項とともに、6つのセクションすべてを徹底的にカバーしています。ストレージ見積もりには、分析/クリックログストレージの考慮事項が含まれています。スキーマには、redirect_typeやstatusなどの便利なフィールドが含まれています。
トレードオフの説明力
重み 20%回答Aは、決定論的ID vsランダムID、作成時の強い一貫性 vs 結果整合性、積極的なエッジキャッシュ vs 高速な無効化、同期分析 vs 非同期分析という4つの真の、よく推論されたトレードオフを特定しています。各トレードオフには、明確な選択肢、選択された方向性、推論、およびコストの認識と緩和策が含まれています。キャッシュ vs 無効化のトレードオフは特にニュアンスがあり、不変リンクと可変リンクに対して異なる戦略を提案しています。
拡張性・信頼性
重み 20%回答Aは、特定のRPO/RTOターゲット、マルチAZおよびクロスリージョン展開、キャッシュ無効化イベント伝播、DNSフェイルオーバー、復旧ドリルを含む詳細な信頼性分析を提供しています。さまざまな障害モード(ノード、AZ、リージョン)の処理に関する議論は体系的です。バウンドされたTTLをセーフティネットとして使用するキャッシュ無効化戦略は実用的です。99.9%のアップタイム計算(月あたり43.8分)は、議論を現実に根ざしたものにしています。
分かりやすさ
重み 10%回答Aは、明確なセクションヘッダーと番号付きのサブセクションでよく整理されています。文章は直接的かつ技術的です。レイテンシ予算の分解は特に明確です。最後に要約アーキテクチャセクションがあり、良い要約を提供しています。ただし、回答はかなり長く、一部のセクションはより簡潔にできた可能性があります。セクション内の番号付きリスト形式は、読みやすさを向上させています。