システム設計ガイド

堅牢でスケーラブルで効率的なシステムを開発するのは困難な場合があります。ただし、主要な概念とコンポーネントを理解すると、プロセスをより管理しやすくなります。このブログ投稿では、DNS、負荷分散、API ゲートウェイなどの基本的なシステム設計コンポーネントと、開発者がさまざまな複雑さのシステムを設計するのに役立つ簡潔なチートシートについて説明します。

システム設計ブループリント/チートシート

開発者にシステム設計の主要な概念とベスト プラクティスを素早く簡単に参照できるようにする包括的なビジュアル ガイド。この便利なチートシートまたはブループリントでは、DNS、負荷分散、API ゲートウェイ、ビデオおよび画像処理、キャッシュ、データベース、一意の ID 生成、支払いおよび紹介サービスなどの標準コンポーネント、チャットおよびストリーミング プロトコルなどの基本的なトピックをカバーしています。この貴重なリソースを使用すると、スケーラブルで効率的で信頼性の高いシステムの設計と実装の課題に取り組む準備が整います。

システム設計ブループリント: 究極ガイド — フル解像度:  https://drive.google.com/file/d/1OGC55KQqTpeUnpiT6glq_6mNpRfl4rD2/view?usp=sharing

パート 1: システム設計の原則

1.1: モジュール化 - モジュール化

システムをより小さく管理しやすいモジュールに分割すると、複雑さが軽減され、保守性が向上し、再利用性が向上します。

1.2: 抽象化

実装の詳細を隠し、基本的な機能のみを表示することは、複雑なシステムを簡素化し、モジュール性を促進するのに役立ちます。

1.3: 階層化 - 階層化

システムを複数の層に分割し、各層が特定の機能セットを提供することで、懸念事項の分離が促進され、保守性が向上します。

1.4: スケーラビリティ

リソースを追加する (スケールアウト) か、システムの容量を最適化する (スケールアップ) ことによって、増加した負荷に対処できるようにシステムを設計します。

1.5: パフォーマンス—パフォーマンス

システムの応答時間、スループット、リソース使用率を最適化することが、設計を成功させる鍵となります。

1.6: セキュリティ - セキュリティ

適切なセキュリティ対策と慣行を実装することで、システムの機密性、完全性、可用性を確保します。

1.7: フォールト トレランスと冗長性 フォールト トレランスと復元力

障害に耐え、エラーから適切に回復するようにシステムを設計し、信頼性と可用性を確保します。

パート 2: システム設計の主要なコンポーネント

2.1: DNS (ドメインネームシステム)

DNS は、インターネットまたはプライベート ネットワークに接続されているコンピューター、サービス、またはその他のリソースのための階層的で分散型の命名システムです。人間が判読できるドメイン名 ( www.example.comなど) を IP アドレスに変換し、ユーザーが Web サイトやサービスに効率的にアクセスできるようにします。

2.2: ロード バランシング - ロード バランシング

負荷分散とは、どのサーバーにも負荷がかからないようにするために、ネットワーク トラフィックを複数のサーバーに分散することを指します。このアプローチにより、システムの可用性、信頼性、パフォーマンスが向上します。標準の負荷分散アルゴリズムには、Pi、最小接続性、および IP ハッシュが含まれます。

2.3: API ゲートウェイ — API ゲートウェイ

API ゲートウェイは、分散システム内のクライアントとマイクロサービスの間の仲介者として機能するサーバーです。リクエストを管理およびルーティングし、セキュリティ ポリシーを適用し、キャッシュ、ロギング、監視などの追加機能を提供する場合があります。

2.4: コンテンツ配信ネットワーク (CDN)

CDN は、さまざまな場所に分散されたサーバーのネットワークであり、低遅延かつ高帯域幅でユーザーにコンテンツを配信するように設計されています。CDN は、エンド ユーザーに近いエッジ サーバーにコンテンツをキャッシュし、システム パフォーマンスを向上させ、オリジン サーバーの負荷を軽減します。

2.5: メッセージ キュー - メッセージ キュー

メッセージ キューは、メッセージをキューに一時的に保存することで、分散システム コンポーネント間の通信を容易にします。これらは非同期処理を実装し、コンポーネントの分離に役立ち、システムのスケーラビリティと耐障害性を向上させます。

2.6: 通信プロトコル

システム設計では、HTTP/HTTPS、WebSocket、gRPC などのさまざまな通信プロトコルが使用されます。これらのプロトコルには利点とトレードオフがあり、選択は遅延、セキュリティ、データ転送要件などの要因によって異なります。

2.7: キャッシュ

キャッシュはデータのコピーを保存するための一時的な技術であり、将来のリクエストでの高速な取得を可能にします。これにより、遅延、サーバー負荷、帯域幅の消費が軽減されます。一般的なキャッシュ メカニズムには、メモリ内キャッシュ、分散キャッシュ、ブラウザ キャッシュなどがあります。

2.8: データベース—データベース

システムに適切なデータベースの選択は、データ構造、スケーラビリティ、一貫性、待ち時間によって決まります。一般的なデータベースの種類には、リレーショナル データベース (MySQL、PostgreSQL など)、NoSQL データベース (MongoDB、Cassandra など)、NewSQL データベース (Cockroach DB、Google Spanner など) があります。

2.9: レプリケーション — レプリケーション技術

レプリケーションとは、信頼性、可用性、耐障害性を向上させるために、異なるノード上にデータの複数のコピーを維持することです。標準的なレプリケーション テクノロジには、同期レプリケーション、非同期レプリケーション、および準同期レプリケーションが含まれます。

2.10: 分散 UUID 生成 — 分散固有 ID の生成

分散システムで一意の識別子を作成することは困難な場合がありますが、データの一貫性と整合性を維持するためには重要です。

パート 3: 署名付き URL を使用してビデオと画像を分割してアップロードする

このセクションでは、署名付き URL を使用して、大きなビデオや画像ファイルを分割してアップロードする方法を説明します。このアプローチにより、特に理想的とは言えないネットワーク条件において、ファイルのアップロードの効率と信頼性が大幅に向上します。

3.1: 署名付き URL とは何ですか?

署名付き URL は、クラウド ストレージ内のオブジェクトなど、特定のリソースへの一時的かつ安全なアクセスを可能にする特別に作成された URL です。これらの URL には、ユーザーが限られた時間内でファイルのアップロードやダウンロードなどの特定のアクションを実行できるようにする認証署名が含まれています。Amazon S3 や Google Cloud Storage などの一般的なクラウド ストレージ プロバイダーは、署名付き URL の生成をサポートしています。署名付き URL の例は次のとおりです。

https://example-bucket.s3.amazonaws.com/my-file.txt?\ 
  X-Amz-Algorithm=AWS4-HMAC-SHA256& 
  X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20220407%2Fus-east-1%2Fs3% 2Faws4_request&\ 
  X-Amz-Date=20220407T123456Z&\ 
  X-Amz-Expires=3600&\ 
  X-Amz-SignedHeaders=host&\ 
  X-Amz-Signature=a9c8a7d1644c7b351ef3034f4a1b4c9047e891c7203eb 3a9f29d8c7a74676d88

3.2: チャンクアップロード

1 回のリクエストで大きなファイルをアップロードすると、タイムアウト、大量のメモリ消費、およびネットワークの不安定による障害のリスクが増加する可能性があります。代わりに、大きなファイルを小さなチャンクに分割し、順次または並行してアップロードすると、アップロードの効率と信頼性が向上します。この方法は、「チャンク」または「マルチパート」アップロードとして知られています。

3.3: 署名付き URL とマルチパート アップロードの結合

署名付き URL を使用してビデオ ファイルと画像ファイルを分割してアップロードするには、次の一般的な手順に従います。

  1. ファイルを小さなチャンクに分割する: 通常は JavaScript を使用して、クライアント側で大きなファイルを小さなチャンクに分割します。チャンクのサイズはさまざまですが、アップロードのパフォーマンスを最適化するには、リクエストの数と各チャンクのサイズのバランスをとる必要があります。
  2. 各チャンクの署名付き URL をリクエストする: サーバーにリクエストを送信して、各チャンクの署名付き URL を生成します。サーバーは、適切な権限と有効期限を持つ署名付き URL を作成し、クライアントに返す必要があります。
  3. 署名付き URL を使用してチャンクをアップロードする: 署名付き URL を使用して、各チャンクをクラウド ストレージ サービスにアップロードします。必要な同時実行性のレベルとネットワークの状態に応じて、これらのアップロードは順番に実行することも、並行して実行することもできます。
  4. アップロードが成功したことを確認して再組み立てする: すべてのチャンクが正常にアップロードされたら、サーバーにアップロード プロセスの完了を確認するように通知します。その後、サーバーはチャンクを元のファイルに再構築し、必要な処理や検証を実行できます。
  5. アップロードの失敗の処理: チャンクのアップロードに失敗した場合は、新しい署名付き URL を使用してアップロードを再試行するか、エラー処理戦略を実装してスムーズなユーザー エクスペリエンスを確保します。

署名付き URL とチャンクアップロードを使用することで、開発者は大規模なビデオや画像のアップロードを効率的かつ安全に処理でき、システムの信頼性とパフォーマンスが向上します。

パート 4: チャットとストリーミング プロトコル

このセクションでは、クライアントとサーバー間のリアルタイム通信とデータ フローを促進するさまざまなチャットおよびストリーミング プロトコルについて説明します。これらのプロトコルを理解すると、開発者が応答性の高い対話型アプリケーションを構築するのに役立ちます。

4.1: RTMP (リアルタイム メッセージング プロトコル)

RTMP は、インターネット上でオーディオ、ビデオ、およびデータを送信するために Adob​​e Systems によって開発された独自のプロトコルです。これはビデオ ストリーミング アプリケーションで一般的に使用され、クライアントとサーバー間の低遅延通信を提供します。ただし、Flash プレーヤーへの依存により、近年その人気は衰えています。

4.2: WebRTC (ウェブリアルタイム通信)

WebRTC は、Web ブラウザーやモバイル アプリケーションでのリアルタイムのオーディオ、ビデオ、データ通信を可能にするオープン ソース プロジェクトです。ピアツーピア接続をサポートし、遅延とサーバー負荷を軽減します。WebRTC は、ビデオ会議、オンライン ゲーム、およびリアルタイム通信を必要とするその他のアプリケーションに広く使用されています。

4.3: Webソケット

WebSocket は、単一の長期接続を介してクライアントとサーバー間の双方向の全二重通信を可能にする通信プロトコルです。WebSocket は、待ち時間が短く効率的な通信機能があるため、チャット、通知、リアルタイム更新などのリアルタイム アプリケーションによく使用されます。

4.4: SSE (サーバー送信イベント)

Server Sent Events (SSE) は、サーバーが HTTP 接続経由でクライアントの更新をプッシュできるようにするテクノロジーです。サーバーからクライアントへの一方向のリアルタイム通信用に設計されており、リアルタイムの更新、ニュース フィード、通知などのアプリケーションに適しています。

4.5: HTTPショートポーリング

短期ポーリングでは、クライアントがサーバーに HTTP リクエストを繰り返し送信して、新しい更新を確認します。実装は簡単ですが、ポーリングが短いと、特に更新頻度が低い場合、継続的なポーリングによりサーバー負荷が高くなり、遅延が増加する可能性があります。

4.6: HTTP ロングポーリング

ロング ポーリングは、クライアントがサーバーにリクエストを送信し、サーバーは新しいデータが利用可能になるまでリクエストを開いたままにするショート ポーリングよりも改良されたものです。このアプローチでは、リクエストの数とサーバーの負荷が軽減されますが、依然として遅延の問題が発生する可能性があり、サーバー リソースの慎重な管理が必要です。

4.7: Webhook

Webhook は、システム内の特定のイベントによってトリガーされるユーザー定義の HT​​TP コールバックです。イベントが発生すると、発信元サイトは Webhook 用に構成された URL に対して HTTP リクエストを作成します。このアプローチにより、異なるシステムまたはサービス間の効率的なイベント駆動型通信が可能になります。

4.8: ストリームAPI

ストリーミング API を使用すると、クライアントは通常 HTTP または WebSocket 接続を使用して、サーバーからのデータの継続的なストリームを消費できます。これらの API は、ソーシャル メディア情報、株式市場データ、リアルタイム分析など、リアルタイムの更新を必要とするアプリケーション向けに設計されています。

これらのチャットおよびストリーミング プロトコルを理解して利用することで、開発者はさまざまなユースケースに対応し、魅力的なユーザー エクスペリエンスを提供する応答性の高いリアルタイム アプリケーションを構築できます。

パート 5: システム設計における共通コンポーネント

このセクションでは、最新のシステム設計で頻繁に登場するいくつかの標準コンポーネントについて説明します。これらのコンポーネントを理解することは、開発者がそれらをシステムにシームレスに統合し、全体的な機能を強化するのに役立ちます。

5.1: 決済サービス - 決済サービス

決済サービスは、顧客と企業間の取引を処理します。信頼性の高い支払いサービスを統合することは、電子商取引およびサブスクリプションベースのプラットフォームにとって重要です。人気のある決済サービス プロバイダーには、Stripe、PayPal、Square などがあります。これらのサービスは多くの場合、安全なトランザクションを促進し、定期的な支払いや返金などを管理するための API を提供します。

5.2: 分析サービス - 分析サービス

分析サービスにより、データの収集、処理、視覚化が可能になり、企業は情報に基づいた意思決定を行うことができます。これらのサービスは、ユーザーの行動を追跡し、システムのパフォーマンスを監視し、傾向を分析できます。標準の分析プロバイダーには、Google Analytics、Mixpanel、Amplitude などがあります。分析サービスを 1 つのシステムに統合すると、企業は製品を最適化し、ユーザー エクスペリエンスを向上させることができます。

5.3: プッシュサービス - 通知

通知サービスにより、ユーザーは更新、アラート、重要な情報を常に知ることができます。これらのサービスは、電子メール、SMS、プッシュ通知などのさまざまなチャネルを通じて通知を提供できます。通知サービスプロバイダーの例には、Firebase Cloud Messaging (FCM)、Amazon Simple Notice Service (SNS)、Twilio などがあります。

5.4: 検索 — 検索

大量のデータまたはコンテンツを含むシステムの場合、強力な検索コンポーネントの統合が不可欠です。検索サービスは、高速で関連性があり、スケーラブルな検索機能を提供する必要があります。Elasticsearch、Apache Solr、Amazon CloudSearch は、検索機能を実装するための一般的な選択肢です。これらのサービスは通常、全文検索、ファセット検索、フィルタリングをサポートしており、ユーザーは探している情報を迅速かつ効率的に見つけることができます。

5.5: レコメンデーションサービス—レコメンデーションサービス

レコメンデーション サービスは、アルゴリズムを使用して、ユーザーの好み、行動、その他の要因に基づいてパーソナライズされたレコメンデーションをユーザーに提供します。これらのサービスは、ユーザーのエンゲージメントと満足度を大幅に向上させることができます。レコメンデーションを生成するための手法には、協調フィルタリング、コンテンツベースのフィルタリング、ハイブリッド アプローチなどがあります。行列因数分解や深層学習などの機械学習アルゴリズムを使用して、より複雑な推奨事項を生成することもできます。

これらの標準コンポーネントをシステム設計に組み込むことで、開発者はアプリケーションの機能を強化し、よりシームレスで魅力的なエクスペリエンスをユーザーに提供できます。

パート 6: システム設計のベスト プラクティス

6.1: 要件の収集

設計プロセスを開始する前に、システム要件を徹底的に理解し、文書化します。

6.2: デザインパターン

実証済みの設計パターンを活用して、繰り返し発生する設計上の問題を解決し、アーキテクチャ全体を改善します。

6.3: ドキュメント - ドキュメント

より良いコミュニケーションと保守性を確保するために、設計上の決定事項、仮定、理論的根拠を文書化します。

6.4: 反復設計 - 反復設計

複数回の反復とフィードバックを通じてデザインを改良し、進化と改善を続けます。

6.5: テストと検証 - テストと検証

要件に照らして設計を検証し、潜在的な問題を特定して解決するためのテストを実施します。

要約する

結論として、システム設計は多面的で複雑なプロセスであり、さまざまなコンポーネント、プロトコル、テクノロジーに関する深い知識が必要です。このブログ投稿では、DNS、負荷分散、API ゲートウェイ、ビデオおよび画像処理、キャッシュ、データベース、一意の ID 生成、支払いおよび推奨サービス、チャットおよびストリーミング プロトコルなどの標準コンポーネントなどの基本的なトピックの概要を説明します。

この知識を活用することで、開発者は、さまざまな要件を満たし、シームレスなユーザー エクスペリエンスを提供する、スケーラブルで効率的かつ信頼性の高いシステムを作成できます。重要なのは、システム設計は反復的なプロセスであり、成功するアプリケーションを構築して維持するには継続的な改善が不可欠であることを覚えておくことです。これらの中心概念の強固な基盤と適応性に重点を置くことで、開発者は堅牢なシステムの設計と実装の課題に自信を持って取り組むことができます。

おすすめ

転載: blog.csdn.net/jeansboy/article/details/131703142