自我介紹:我作為自由 Web 開發人員已有大約 1.5 年的時間。我從來沒有考慮過寫 HLD 或 LLD。相反,我專注於根據客戶的具體要求開發應用程式。當我渴望過渡到企業環境時,我渴望提升自己的技能並獲得新知識。
所以,這是我寫 HLD 的嘗試
客戶需求:基於 E2EE Web 的聊天應用程式。在任何給定時間可擴展到 1000 個同時使用者。
系統架構
該應用程式主要由前端(react)、後端(Node)、資料庫(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 令牌):透過基於令牌的身份驗證來保護通訊。
- 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中文網其他相關文章!