系统架构设计
- harry
- Technology
- May 4, 2023
开发一个强大、可扩展和高效的系统可能令人生畏。但是,了解关键概念和组件可以使该过程更易于管理。
Table of Contents
在这篇博文中,我们将探讨基本的系统设计组件,如 DNS、负载平衡、API 网关等,以及可以帮助开发人员设计不同复杂度的系统的简明备忘单。
系统设计蓝图/备忘单
全面的可视化指南,为开发人员提供快速简便的系统设计中的关键概念和最佳实践参考。这个方便的备忘单或蓝图涵盖了基本主题,例如 DNS、负载平衡、API 网关、视频和图像处理、缓存、数据库、唯一 ID 生成、支付和推荐服务等标准组件以及聊天和流媒体协议。有了触手可及的宝贵资源,您将有能力应对设计和实施可扩展、高效和可靠系统的挑战。
系统设计蓝图:终极指南 — 完整分辨率:https://drive.google.com/file/d/1OGC55KQqTpeUnpiT6glq_6mNpRfl4rD2/view?usp=sharing
第一节 系统设计原理
1.1: 模块化
将系统划分为更小、易于管理的模块有助于降低复杂性、提高可维护性和可重用性。
1.2: 抽象
隐藏实现细节并仅显示基本功能有助于简化复杂系统并促进模块化。
1.3: 分层
将系统组织成层,每层提供一组特定的功能,促进关注点分离并增强可维护性。
1.4: 可扩展性
设计系统以通过添加更多资源(水平扩展)或优化系统容量(垂直扩展)来处理增加的负载。
1.5: 性能
优化系统的响应时间、吞吐量和资源利用率对于成功的设计至关重要。
1.6: 安全性
通过实施适当的安全措施和实践,确保系统的机密性、完整性和可用性。
1.7: 容错和弹性
设计系统以承受故障并从错误中恢复,确保可靠性和可用性。
第二节 系统设计的关键组成部分
2.1: DNS(域名系统)
DNS 是连接到 Internet 或专用网络的计算机、服务或其他资源的分层和分散命名系统。它将人类可读的域名(例如 www.example.com )转换为IP地址,使用户能够更有效地访问网站和服务。阅读更多
2.2: 负载平衡
负载平衡是指在多个服务器之间分配网络流量,以确保没有单个服务器不堪重负。此方法提高了系统的可用性、可靠性和性能。标准负载平衡算法包括轮循机制、最少连接数和 IP 哈希。阅读更多备忘单
2.3: 接口网关
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:分布式唯一 ID 生成
在分布式系统中创建唯一标识符可能具有挑战性,但对于维护数据的一致性和完整性至关重要。阅读更多比较表
第三节:使用签名 URL 以块形式上传视频和图像
在本节中,我们将探讨如何使用签名 URL 以区块形式上传大型视频和图像文件。此方法可以显著提高文件上传的效率和可靠性,尤其是在网络条件不太理想的情况下。
3.1: 什么是签名网址?
签名 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=a9c8a7d1644c7b351ef3034f4a1b4c9047e891c7203eb3a9f29d8c7a74676d88
3.2: 分块上传
在单个请求中上传大文件可能会导致超时、高内存消耗以及由于网络不稳定而导致的失败风险增加。相反,将大文件分解为较小的块并按顺序或并行上传它们可以提高上传效率和可靠性。这种方法称为“分块”或“分段”上传。
3.3:合并签名 URL 和分块上传
要使用签名 URL 以区块形式上传视频和图像文件,请按照以下常规步骤操作:
将文件拆分为较小的块:在客户端将大文件拆分为较小的块,通常使用 JavaScript。区块大小可能会有所不同,但必须平衡请求数和每个区块的大小以优化上传性能。
为每个区块请求签名 URL:向服务器发送请求,为每个区块生成签名 URL。服务器应创建具有适当权限和到期时间的签名 URL,并将其返回给客户端。
使用签名 URL 上传区块:使用签名 URL 将每个区块上传到云存储服务。根据所需的并发级别和网络条件,这些上载可以按顺序或并行完成。
确认上传成功并重新组合:成功上传所有区块后,通知服务器确认上传过程完成。然后,服务器可以将块重新组合到原始文件中,并执行任何必要的处理或验证。
处理失败的上传:如果任何区块上传失败,请使用新的签名 URL 重试上传或实施错误处理策略以确保流畅的用户体验。
通过使用签名 URL 和分块上传,开发人员可以高效、安全地处理大型视频和图像上传,从而提高其系统的可靠性和性能。
第四节:聊天和流媒体协议
本节将讨论各种聊天和流协议,以促进客户端和服务器之间的实时通信和数据流。了解这些协议可以帮助开发人员构建响应式交互式应用程序。
4.1: RTMP(实时消息传递协议)
RTMP 是由 Adobe Systems 开发的专有协议,用于通过 Internet 流式传输音频、视频和数据。它通常用于视频流应用程序,并在客户端和服务器之间提供低延迟通信。然而,由于它对Flash Player的依赖,它的受欢迎程度近年来有所下降。
4.2: WebRTC (Web Real-Time Communication)
WebRTC是一个开源项目,可在Web浏览器和移动应用程序中实现实时音频,视频和数据通信。它支持点对点连接,减少延迟和服务器负载。WebRTC广泛用于视频会议,在线游戏和其他需要实时通信的应用。
4.3: 网络套接字
WebSocket 是一种通信协议,它支持通过单个长期连接在客户端和服务器之间进行双向全双工通信。由于其低延迟和高效的通信功能,WebSocket 通常用于聊天、通知和实时更新等实时应用程序。
4.4:SSE(服务器发送的事件)
服务器发送事件 (SSE) 是一种使服务器能够通过 HTTP 连接推送客户端更新的技术。它专为从服务器到客户端的单向实时通信而设计,使其适用于实时更新、新闻源和通知等应用程序。
4.5: HTTP 短轮询
短轮询涉及客户端重复向服务器发送 HTTP 请求以检查新的更新。虽然易于实现,但由于持续轮询,短轮询可能会导致高服务器负载和延迟增加,尤其是在更新不频繁的情况下。
4.6:HTTP 长轮询
长轮询是对短轮询的改进,在短轮询中,客户端向服务器发送请求,服务器保持请求打开状态,直到新数据可用。此方法可减少请求数和服务器负载,但仍可能遇到延迟问题,并且需要仔细管理服务器资源。
4.7: 网络钩子
Webhook 是由系统中的特定事件触发的用户定义的 HTTP 回调。事件发生时,源站点会向为 Webhook 配置的 URL 发出 HTTP 请求。这种方法允许在不同系统或服务之间进行高效的事件驱动通信。
4.8: 流 API
流 API 使客户端能够使用来自服务器的连续数据流,通常使用 HTTP 或 WebSocket 连接。这些 API 专为需要实时更新的应用程序而设计,例如社交媒体源、股票市场数据或实时分析。
通过了解和利用这些聊天和流媒体协议,开发人员可以构建响应迅速的实时应用程序,以满足各种用例并提供引人入胜的用户体验。
第五节 系统设计中的常用组件
本节将探讨现代系统设计中常见的一些标准组件。了解这些组件可以帮助开发人员将它们无缝集成到他们的系统中并增强整体功能。
5.1: 支付服务
支付服务处理客户和企业之间的交易。集成可靠的支付服务对于电子商务和基于订阅的平台至关重要。流行的支付服务提供商包括Stripe,PayPal和Square。这些服务通常提供 API 来促进安全交易和管理定期付款、退款等。
5.2: 分析服务
分析服务支持数据收集、处理和可视化,以帮助企业做出明智的决策。这些服务可以跟踪用户行为、监控系统性能并分析趋势。标准分析服务提供商包括Google Analytics,Mixpanel和Amplitude。将分析服务集成到系统中可以帮助企业优化其产品并改善用户体验。
5.3: 通知
通知服务让用户随时了解更新、警报和重要信息。这些服务可以通过各种渠道(例如电子邮件、短信和推送通知)传递通知。通知服务提供商的示例包括 Firebase Cloud Messaging (FCM)、Amazon Simple Notification Service (SNS) 和 Twilio。
5.4: 搜索
集成强大的搜索组件对于具有大量数据或内容的系统至关重要。搜索服务应提供快速、相关且可缩放的搜索功能。Elasticsearch、Apache Solr 和 Amazon CloudSearch 是实现搜索功能的热门选择。这些服务通常支持全文搜索、分面搜索和筛选,使用户能够快速高效地找到他们要查找的信息。
5.5: 推荐服务
推荐服务使用算法根据用户的偏好、行为和其他因素向用户提供个性化建议。这些服务可以显著提高用户参与度和满意度。生成建议的技术包括协作筛选、基于内容的筛选和混合方法。机器学习算法(如矩阵分解和深度学习)也可用于生成更复杂的建议。
通过将这些标准组件整合到其系统设计中,开发人员可以增强其应用程序的功能,并为用户提供更加无缝和引人入胜的体验。
第六节:系统设计的最佳实践
6.1: 需求收集
在开始设计过程之前,彻底了解并记录系统要求。
6.2: 设计模式
利用经过验证的设计模式来解决反复出现的设计问题并改进整体架构。
6.3: 文档
记录您的设计决策、假设和基本原理,以确保更好的沟通和可维护性。
6.4: 迭代设计
通过多次迭代和反馈来优化您的设计,使其不断发展和改进。
6.5: 测试和验证
根据要求验证您的设计,并进行测试以识别和解决潜在问题。
结论
总之,系统设计是一个多方面和复杂的过程,需要对各种组件、协议和技术有深刻的理解。这篇博文概述了基本主题,例如 DNS、负载平衡、API 网关、视频和图像处理、缓存、数据库、唯一 ID 生成、支付和推荐服务等标准组件以及聊天和流媒体协议。
通过利用这些知识,开发人员可以创建可扩展、高效和可靠的系统,以满足不同的需求并提供无缝的用户体验。重要的是要记住,系统设计是一个迭代过程,持续改进对于构建和维护成功的应用程序至关重要。凭借这些核心概念的坚实基础和对适应性的关注,开发人员可以自信地应对设计和实现稳健系统的挑战。