📖

システム設計って何すりゃいいの? ~System Design Primerを読んでみる~

2021/06/02に公開

System Design Primer

https://github.com/donnemartin/system-design-primer
システムをスケールさせるためのアーキテクチャ構成の仕方を学べる資料集。
主に、パフォーマンスの要求に応えられるようにするにはインフラをどのように組み合わせればよいのか、という点について詳しく説明している。
日本語版(https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md)もあります。

システム設計とは

一般的なシステム設計は、システムを構築するためのあらゆる設計を指しますが、ここではもう少し狭い意味で使います。

主に、下記を満たすためのインフラ構成とスケールの仕方を考えることを指すこととします。

  • ユースケースを実現する
  • パフォーマンスの要件を満たす

システム設計の流れ

  • ユースケースを確認する
  • パフォーマンス上の要求を確認する
  • ユースケースを満たす最もシンプルな設計を考える
  • ボトルネックを分析する
  • 構成を作り変えてスケールする

システムの性能を上げるための知識

考え方

システム構成を考えるときは、必ずトレードオフの関係に注意する。パフォーマンスが上がる代わりに管理が難しくなるなど、いろいろなトレードオフが存在する。要件と照らし合わせて、何を達成して何を妥協するのかを考える。

CDN

CDNは地理的に一番近いサーバーからファイルを取得できるようにするシステム。主に静的ファイルを高速に配信するために利用する。

ロードバランサー

複数の同じ役割を持つサーバーへのリクエストを分散させるための機器。主にアプリケーションサーバーへのリクエストを振り分けて負荷を均一にするのに利用する。

リバースプロキシ

キャッシング、静的コンテンツの配信、SSLの終端などをアプリケーションサーバーの代わりに行うためのWebサーバー。
ロードバランサーと同様に、複数のアプリケーションサーバーをまとめることもできる。

RDBMS

構造化されたデータを扱うデータベース。トランザクションを扱えるので、データの整合性を保ちやすい。
スケールする際は、レプリケーションを用いてデータベースの数を増やして負荷を分散したり、シャーディング、フェデレーションによって一度に扱うデータの数を減らしたりする。

NoSQL

完全には構造化されていないデータを扱うデータベース。主に結果整合性しか保証しない。
基本的に、大容量のデータを扱うなど、特定の適した用途に局所的に利用する。

キャッシュ

キャッシュはいろいろな場面で高速な応答をするのに用いられる。
キャッシュアサイド、ライトスルー、ライトバックといったキャッシュ方式がある。キャッシュを導入するとシステムの複雑性は増す。

非同期処理

重たい処理を別のシステムに移譲するなどして、後で実行する。
メッセージキューを使ってジョブの要求を伝達する。

システムの構成

マイクロサービス

独立してデプロイ可能な小さなサービスの集合としてアプリケーションを構成する手法。サービス単位でスケールできるので、スケールしやすい。

サービスディスカバリー

主にマイクロサービス構成で、サービス同士がお互いを見つけやすくする仕組み。クラウド環境のようにサービスのIPアドレスや構成が変わるような環境での管理をしやすくするために用いられる。

システム設計問題を解いてみる

こちらからどうぞ。
https://github.com/donnemartin/system-design-primer#object-oriented-design-interview-questions-with-solutions

Discussion