易
Pastebin / Bit.ly を設計せよ
課題
ユーザーがテキスト(paste)を投稿すると、ランダムに生成された短いリンクが返される。そのリンクにアクセスすると元のテキストを閲覧できる。ログイン不要(匿名)で使え、各pasteには「月ごとの訪問数」などの簡単なアクセス統計が見られる。一定期間で期限切れになったpasteは削除する。これを高可用に作るのが課題。URL短縮サービス(Bit.ly)も本質的に同じ構造で考えられる。
制約・前提
- ユーザーは10M(1000万)人
- paste書き込みは10M回/月、paste読み取りは100M回/月
- read:write = 10:1 (読み取りが圧倒的に多い = read-heavy)
- 1 pasteあたり平均1.27 KB
- 3年で約360M(3.6億)個のshortlinkが必要
- 平均40 read req/s (ただしトラフィックは不均一でピークはもっと高い)
- ログイン不要(匿名)、期限切れpasteは削除、高可用が必須
主要数値
概算(back-of-the-envelope)の出発点。
| read:write比 | 10:1 (read-heavy) |
|---|---|
| 平均read req/s | 40 req/s |
| 3年で必要なshortlink数 | 約360M (3.6億) |
| 1 pasteあたりサイズ | 1.27 KB |
| Base62 7文字の空間 | 62^7 ≒ 3.5兆通り |
| 3年分のストレージ | 約450 GB |
主要数値の可視化
read : write 比
read : write = 10:1
3 年分のストレージ規模
read-heavy (10:1) 短縮 URL の参照が圧倒的に多く、生成(write)は少ない。キャッシュと読み取りスケールが鍵。
まず自分で設計を考えてから、1ステップずつ答え合わせをしましょう。
Step 1: 要件・ユースケース(まだ伏せられています)
考えてみよう(面接官の追加質問)
- shortlinkを「本文ハッシュ」ではなく「自動採番(連番)→Base62」で作るとどんな利点・欠点があるか?(ヒント: 衝突チェック不要だが連番が推測されやすい)
- 期限切れpasteの削除を、cronの一括削除ではなくDBのTTL機能でやる場合のメリット・デメリットは?
- MD5の代わりにSHA-256を使うべき場面はあるか? なぜこの用途ではMD5で十分なのか?
- 同じ本文を2人が投稿したら同じshortlinkになってしまう。これは問題か? どう設計を変えるか?
- 月次統計をリアルタイムに近づけたい場合、どんな仕組み(ストリーム処理等)を足すか?