「システム設計の面接試験」を読みました。前半でスケーラブルなシステムの基礎知識と面接の進め方を押さえ、後半はレートリミッターやキーバリューストアなどの設計課題を解いていく構成です。面接対策の本ではありますが、日々の設計の引き出しを増やす本としてもおすすめです。
この記事では、読みながら気になった点やもう少し知識を増やすべき部分を読書メモとして整理します。引用ブロックは、読みながら立てた「自分はこれに答えられるか?」という問いです。
適切なデータベースを選べるか
非リレーショナルデータベースが適しているのは、次のような場合だと紹介されています。
- アプリケーションに超低遅延が必要な場合
- 非構造化データを扱う場合、あるいはリレーショナルデータがない場合
- データのシリアライズとデシリアライズだけが必要な場合(JSON、XML、YAMLなど)
- 大量のデータの保存が必要な場合
要件に応じて適切なDB選択ができるか?
CDNフォールバック
CDNが故障した場合に、Webサイトやアプリケーションがどう対処するかを検討する必要があります。CDNが一時的に停止した場合、クライアントがその問題を検知し、オリジンサーバからリソースをリクエストできるようにしておく、という考え方です。
どんなときにCDNを使い、CDNが使えなくなったときにどうフォールバックするのか?
データの同期
異なる地域のユーザは、異なるローカルデータベースやキャッシュを使用するかもしれません。フェイルオーバーの際には、データが利用できないデータセンターにトラフィックがルーティングされる可能性があります。一般的な戦略は複数のデータセンター間でデータを複製することで、Netflixが非同期のマルチデータセンター・レプリケーションを実装している事例が紹介されていました。
複数のデータセンターでどう同期を取るのかを理解しているか?
データベースの水平スケーリング
大量のデータを1台のデータベースで抱えきれなくなったときの水平スケーリングについても説明されています。
シャーディング・シャードを理解しているか?
レートリミッター
レートリミッターには、さまざまなアルゴリズムで動くものがあります。
- トークンバケット
- リーキーバケット
- 固定ウィンドウカウンタ
- スライディングウィンドウログ
- スライディングウィンドウカウンタ
それぞれのアルゴリズムの仕組みと使い分けを説明できるか?
RedisのINCRやEXPIREといったコマンドを使ってレートリミッターを実装できるか?
X-RateLimit-Remaining、X-RateLimit-Limit、X-RateLimit-Retry-Afterといったレートリミッターのヘッダを理解しているか?
キーバリューストアの設計
キーバリューストアの設計の章では、ブルームフィルタが登場します。ある要素が集合のメンバーであるかをテストする上で、空間効率の良い確率的手法です。
ブルームフィルタとは何かを説明できるか?
リダイレクトの種類
URL短縮サービスの設計に絡めて、リダイレクトの種類も整理されています。
- 301リダイレクト: 恒久的に移動することを意味する
- 302リダイレクト: 一時的に移動することを意味する
301と302の違いと使い分けを理解しているか?
そのほかの問い
- グラフデータベースによるリコメンド管理ができるか?
- ブラウザのキャッシュについて正しく理解できているか? Cache-Controlのprivateやmax-ageといった指定を説明できるか?
まとめ
それぞれの問いについて自分で考えて、知らないことは勉強して記事化していきたいと思っています。別記事にしなくても、学んだことのアウトプットができればと考えています。
