簡単な自己紹介: 私はフリーランスの Web 開発者として約 1 年半働いています。 HLD や LLD を書くことを考えたことはありません。代わりに、私はクライアントの特定の要件に基づいてアプリケーションを開発することに重点を置いてきました。企業環境への移行を目指しているので、スキルを向上させ、新しい知識を習得したいと考えています。
それでは、HLD を作成する私の試みを紹介します
クライアント要件: E2EE Web ベースのチャット アプリ。いつでも最大 1,000 人の同時ユーザーまで拡張可能。
システムアーキテクチャ
アプリは主にフロントエンド(反応)、バックエンド(ノード)、データベース(RedisとSQL)で構成されています。
-
フロントエンド:
- ユーザーに表示される内容を管理します
- ユーザーログイン、ユーザー登録の処理。
- メッセージの送受信の処理。
- レスポンシブデザイン。
-
バックエンド:
- メッセージとログインの内容と方法を管理します
- ログイン/登録の管理を担当します
- メッセージとユーザーデータの保存を担当します
- ページルートを処理します
-
データベース:
- これには、暗号化されたメッセージとユーザー データ/ログイン情報が保存されます
-
WebSocket サーバー:
- ユーザー間のリアルタイム双方向通信のための専用サービスです。
-
キャッシュ層 (オプション):
- アクティブ ユーザー、メッセージ キュー、オンライン ステータスを一時的にキャッシュしてパフォーマンスを向上させるには、Redis を使用します。
高レベルフロー
- ユーザーはフロントエンド経由でログイン → バックエンドがユーザーを認証します。
- フロントエンドは、リアルタイム通信のためにバックエンドへの WebSocket 接続を確立します。
- ユーザーがメッセージを送信するとき:
- WebSocket サーバーがそれを受信します。
- メッセージを処理し、目的の受信者にルーティングします。
- バックエンドはメッセージをデータベースに保存します。
- 受信者は、WebSocket 接続を通じてリアルタイムでメッセージを受信します。
アーキテクチャ図
データフロー
-
登録フロー
- ユーザーがアカウントを作成します
- パブリック ハッシュとプライベート ハッシュが生成されます。パブリック ハッシュはユーザー情報とともにデータベースに保存されます。
- 成功時:
-
ログインの流れ
- ユーザーは電子メールとパスワードを使用してログインするよう求められます。
- バックアップされたデータは入力時に認証されます。
- 成功時:
- 拒否時:
-
ルームメッセージの流れ
- ユーザーがルームに参加します:
- フロントエンドはルーム ID をバックエンドに送信します。
- joinRoom イベントは特定のルームに編集されます。
- ルーム内のメッセージ:
- 現時点では、グローバル ルームのメッセージは暗号化されておらず、単に共有され、データベースに保存されています。
- ルーム内のすべての参加者にリアルタイムで配信されます。
-
ユーザー - ユーザー メッセージ フロー
- フロントエンド:
- フロントエンドは受信者の公開キーを使用してメッセージを暗号化します。
- 暗号化されたメッセージはソケット経由でバックエンドに共有されます。
- バックエンド:
- メッセージを PSQL に保存します
- userID を使用してメッセージをユーザーにルーティングします
- 受信者のフロントエンドがメッセージを復号化します
詳細なサンプルフロー
リアルタイム ダイレクト メッセージ フロー
-
フロントエンド:
- ユーザーが WebSocket 経由で別のユーザーにメッセージを送信します。
- メッセージは送信前に受信者の公開キーで暗号化されます。
-
バックエンド:
- WebSocket サーバーは暗号化されたメッセージを受信します。
- メッセージはメタデータ (送信者、受信者、タイムスタンプなど) とともに PostgreSQL に保存されます。
- バックエンドは、暗号化されたメッセージを受信者の WebSocket 接続にルーティングします。
-
受信者フロントエンド :
- 暗号化されたメッセージは WebSocket 経由で受信されます。
- 秘密キーはメッセージを復号化するために使用されます。
- チャットに平文メッセージが表示されます。
技術スタック
-
フロントエンド:
- React: ユーザー インターフェイス (チャット ウィンドウ、ボタン、入力ボックス) を構築します。
- Context API または Redux: アプリの状態 (現在のユーザー、アクティブなチャットなど) を管理します。
- GSAP: アニメーション用 (チャットバブルがスムーズにスライドするなど)。
- WebSocket クライアント: バックエンドとのリアルタイム接続を確立します。
-
バックエンド:Node.js Express.js:
- REST API を処理するため (ログイン、登録、メッセージの取得用)。
- JWT (JSON Web Tokens): トークンベースの認証で通信を保護します。
- Passport.js: 認証戦略 (Google または Facebook ログインなど) を実装します。
- Socket.IO: リアルタイム メッセージング用の WebSocket 接続を処理します。
-
データベース :
- PostgreSQL: ユーザー プロファイル、メッセージ、チャット ルームの詳細などの永続データを保存します。
- Redis (オプション): リアルタイム データ (アクティブなユーザーのステータス、最近送信されたメッセージなど) をキャッシュします。
-
ホスティングと展開:
- AWS (EC2、S3、RDS): バックエンドをホストし、静的ファイルを保存し、データベースを管理します。
- Nginx または AWS ELB (ロード バランサー): バックエンド サーバー間でトラフィックを分散します。
非機能要件 (NFR)
-
パフォーマンス:
- リアルタイム メッセージの遅延を 100 ミリ秒未満にすることを目標とします。
- 1,000 ユーザーに対して一貫した読み取り/書き込み操作を保証します。
-
スケーラビリティ:
- バックエンドは、水平方向にスケーリングすることで、増加するユーザーを処理する必要があります (Redis や AWS ELB を使用するなど)。
- サーバーごとに 10,000 のアクティブな WebSocket 接続をサポートします。
-
在庫状況:
- バックアップと災害復旧により 99.9% の稼働時間を確保します。
-
セキュリティ:
- プライベート メッセージングには E2EE を使用します。
- 転送中のすべてのデータに HTTPS を採用します。
- 保存データが PostgresSQL で暗号化されていることを確認します。
まとめ
スケーラブルで安全なエンドツーエンド暗号化メッセージング アプリケーションを構築するには、パフォーマンス、使いやすさ、セキュリティの間の慎重なバランスが必要です。このハイレベル設計を通じて、ユーザーのプライバシーを確保しながらリアルタイム通信を処理できる最新のメッセージング システムのアーキテクチャとフローを実証することを目的としました。
このプロジェクトでは、フロントエンドの React、バックエンドの Node.js、データ管理の PostgreSQL/Redis などの主要な技術スキルを紹介するだけでなく、スケーラビリティと信頼性を考慮した設計の重要性も強調しています。
あなたが堅牢なシステムの作成や、リアルタイム通信アーキテクチャについて詳しく調べることに興味のある開発者や愛好家であれば、この記事が貴重な洞察を提供することを願っています。
ご意見やフィードバックをお待ちしています!コメントセクションでお気軽につながり、アイデアを共有し、質問してください。学び、構築し続けましょう!
私の LLD にも注目してください!
すべてのプロジェクトは、ソフトウェア開発の技術の習得に一歩近づいています。この経験から、機能と拡張性のバランスの重要性を学びました。将来はさらに複雑なシステムを構築することを楽しみにしています!
以上がエンドツーエンドの暗号化メッセージング アプリ: 高レベルの設計とアーキテクチャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。