自我介绍:我作为一名自由 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中文网其他相关文章!