📖

「システム設計の面接試験」を読んだ

はじめに

同僚と実装の相談をしてい時に、参考書としてこの本を見せて貰い、面白そうだったので読みました。

https://www.amazon.co.jp/gp/product/B0C61BNTW9

内容

最初は、単一の Web サーバーを持つシステムの問題点を挙げ、ロードバランサーの追加、DB の冗長化などスケールアップをするための方法が書かれています。

その後は、ニュースフィード、チャット、YouTube をテーマにシステム設計をしていく内容が書かれています。 要件を決めるための質問ややり取りが書かれていて、その後に要件を満たすためのシステム設計を行う流れです。

普段何気なく使っているレートリミッターのアルゴリズムや分散システムでのユニーク ID の生成方法、Web クローラーなど自前で実装することが少ないシステムの設計手法や利用されているアルゴリズムが書かれています。 その後は、ニュースフィードシステムのタイムラインや、チャットシステムとそのユーザーのオンラインステータスの更新、YouTube とエンコードシステムの設計、GoogleDrive とファイルアップロード、ダウンロードの設計が書かれています。

感想

最初は単一の Web サーバーを持つシステムから、スケールアップを行う方法が書かれていて、わかりやすかったです。

レートリミッターのアルゴリズムでは初めて知るアルゴリズムが書かれていて、とても面白かったです。 レートリミッターは、リクエストを受け付けたら過去 N 分の間のリクエストをカウントして、閾値を超えていたらリクエストを拒否するというものだと考えていましたが、 リクエスト時にトークンを消費して、トークンがない場合にはリクエストを破棄するトークンバケットアルゴリズムというものもあることを知りました。 Youtube の設計の章では DAG プログラミングモデルという概念を知りました。 エンコードに関するタスクおいて、タスク間の依存関係やデータフローを定義をして、エンコードシステムはその定義に従って、タスクを実行するものだと理解しました。 FaceBook では DAG プログラミングモデルを採用した(SVE: Distributed Video Processing at Facebook Scale - Meta Research)ようでした。

GoogleDrive の設計の章では、主にアップロード、ダウンロード、ファイル更新と同期に関する設計が書かれてました。 ファイル更新では差分のみを変更するなど主にネットワックトラフィックを削減するために手法が書かれていました。 ちなみに、権限管理に触れず進んでいくの以下の資料が参考になります。

おわりに

簡素なシステムから段階的に複雑なシステムを構築する流れが読みやすかったです。 普段使っているシステムの設計が多いので、機能やシステム要件がイメージしやすく、すっと頭に入ってきました。 個人的にはここ数年で読んだ本で一番面白くためになる本でした。

SNSへシェアする