会社の後輩の子のスキルアップするための記事です。システムデザインはSEとて全体像を教えてくれる領域なので、ぜひ理解するようにしていきましょう。
1 - コンピューターアーキテクチャ
コンピューターアーキテクチャの主要な構成要素には、ディスク、メモリ、中央処理装置(CPU)、キャッシュが含まれます。
ディスク(disk)にはHDD(ハードディスク)とSSD(ソリッドステートドライブ)が含まれます。後者の方が一般的であり、そのコストはより高くなります。
メモリ(RAM)はディスクよりも高価で、ストレージスペースは小さいですが、非常に高速な記憶装置です。コンピューターをシャットダウンすると、内部の内容が失われます。
中央処理装置(CPU)はコンピューターの中核的な計算部分であり、高速キャッシュが内蔵されています。
キャッシュ(cache)は重要な概念であり、コンピューターアーキテクチャ以外の多くの領域で使用されます。例えば、ウェブブラウザーは頻繁にアクセスされるウェブページを追跡するためにキャッシュを使用し、それらをより高速に読み込みます。これらの保存されたデータにはHTML、CSS、JavaScript、画像などが含まれます。データがページキャッシュされてから有効である場合、読み込み速度が向上します。ただし、この場合、ブラウザーはキャッシュとしてディスクを使用します。なぜなら、インターネットリクエストを発行することはディスクから読み取るよりも遅いからです。
さらに、ムーアの法則についても言及しておきます。これは、コンピューターの内部CPUのトランジスタ数が約18ヶ月で倍増し、価格もそれに応じて半減するという観察結果です。
2 - アプリケーションアーキテクチャ
アプリケーションアーキテクチャの概要:製品レベルのアプリケーションのアーキテクチャは、複数のコンポーネントから構成され、共に堅牢なシステムを作り出します。これらのコンポーネントには、開発者、サーバー、ユーザー、フロントエンドコード、ストレージシステムなどが含まれ、それぞれが別のセクションで詳しく説明されています。
開発者の視点:開発者はコードを書き、それをサーバーにデプロイします。サーバーは他のコンピューターからのリクエストを処理し、アプリケーションデータを永続的に保存する必要があります。ストレージシステムはサーバー内にあるか、外部からネットワーク接続を介してアクセスされます。
ユーザーの視点:ユーザーはウェブブラウザーを介してサーバーにリクエストを送信し、サーバーはこれらのリクエストに応答します。サーバーがすべてのリクエストを処理できない場合、それを拡張する必要があります。これは、サーバーのハードウェアをアップグレードする垂直スケーリングまたはサーバーの数を増やす水平スケーリングによって実現できます。
負荷分散(LB):サーバーの負荷を分散するために、負荷分散器を使用してリクエストを複数のサーバーに均等に分配できます。
ログとメトリクスの記録(logging&metrics):サーバーにはログサービスがあり、すべてのアクティビティが記録されます。より信頼性の高いログの記録のためには、通常、これらを別の外部サーバーに書き込みます。さらに、さまざまなデータを収集し、開発者がサーバーの動作を理解し、潜在的なボトルネックを特定できるようにするために、メトリクスサービスが必要です。
アラート:開発者は、特定のメトリックが目
標値に達しない場合にプッシュ通知を受け取るためにアラートを設定できます。これにより、定期的にメトリックの状態をチェックする必要がなくなり、問題を早期に検出して対処できます。
3 - システムデザイン要件
大規模で効率的な分散システムを設計するために満たす必要がある要件:
-
システムデザインの基礎:システムデザインのインタビューでは、デザインのアプローチと分析が重要であり、各コンポーネントの詳細についてではありません。効果的な分散システムを設計するには、データの移動、保存、変換、システムの可用性、信頼性、容錯性、冗長性などを考慮する必要があります。
-
考え方:大規模な企業システムを設計する際には、それを3つのキーとすることができます:データの移動(moving data)、保存(storing data)、および変換(transforming data)。分散システムでは、通常、ローカルデータの移動よりもデータの移動が難しい場合があります。
-
データの保存:大規模な分散システムを設計する際には、必ずしもデータの保存が必要です。データの保存方法を考慮する必要があります。これには、データベース、Blobストレージ、ファイルシステム、または分散ファイルシステムなどが含まれます。適切なストレージ方法を選択することは、使用状況に依存します。
-
データの変換:データの移動と保存に加えて、システムはデータを変換する必要があります。データの変換方法はさまざまで、監視サービスはサーバーログを成功と失敗のリクエストの割合に変換することができます。変換プロセスがどれほど複雑であろうとも、データを効率的に変換する方法を考える必要があります。
-
可用性(Availibility):可用性は効果的なシステムの中核です。これは、一定期間内にシステムが利用可能な状態である割合を示します。可用性の重要性と、どのようにして計算し、向上させるかを理解することがデザインの鍵です。
-
信頼性、容錯性、冗長性(Reliability, Fault Tolerance, and Redundancy):信頼性は、一定期間内にシステムが予期される機能を実行することを意味します。容錯性は、システムが故障を検出して自己修復する方法を指します。冗長性は、システム内のバックアップコンポーネントの存在を指し、主要なコンポーネントの故障に備えます。
-
スループット(Throughput)と遅延(Latency):スループットは、一定の時間内に処理されるデータ量や操作数を指します。遅延は、クライアントがリクエストを送信してからサーバーがそのリクエストに応答するまでの時間を指します。システムを設計する際には、スループットを向上させ、遅延を減少させる方法を考える必要があります。
総じて、効果的なシステムを設計するには、データの移動、保存、変換、システムの可用性、信頼性、容錯性、冗長性、スループット、および遅延などの要素を考慮する必要があります。