在设计系统时,我们需要决定要包含哪些功能,忽略哪些功能。
我们每次做出这个决定,都是在权衡取舍。
本文将结合实际案例,探讨系统设计中最常见的 15 个权衡取舍:
一、可扩展性与性能
可扩展性与规模有关:“系统能否扩展以处理更多工作?”
性能取决于速度:“系统完成任务的速度有多快?”
它们往往朝着相反的方向发展,改善其中一方有时会对另一方产生影响。
例如:向系统中添加更多机器可以使其更具可扩展性,但管理这些机器和协调跨机器的任务的复杂性可能会引入延迟,从而影响性能。
反之,以最少的资源优化性能,可能会在用户需求增加时造成可扩展性问题。
二、垂直缩放与水平缩放
垂直扩展是指向现有服务器添加更多资源(例如 CPU、RAM),而水平扩展是指向池中添加更多服务器。
垂直扩展虽然更简单,但单台机器的升级能力是有限的,而且会引入单点故障。如果这台机器宕机,整个系统都可能无法使用。
水平扩展可以实现几乎无限的扩展,但也带来了管理分布式系统的复杂性。
例如:最初,一家初创公司可能会通过增加 CPU 和 RAM 来垂直扩展其服务器,以处理不断增加的负载。
随着初创公司的发展,它可能会转向横向扩展,通过增加更多服务器来分散负载。
三、延迟与吞吐量
延迟衡量的是数据通过网络传输所需的时间。
吞吐量是指在特定时间内实际可以通过网络的平均数据量。
低延迟系统对于实时应用至关重要,而高吞吐量系统对于数据密集型应用至关重要。
例如:网络游戏需要低延迟才能提供玩家之间的实时互动。
数据分析服务优先考虑吞吐量,以便随着时间的推移处理和分析大型数据集。
四、SQL 数据库与 NoSQL 数据库
SQL(关系数据库)基于关系模型构建,该模型将数据组织成行和列的表格,每行都有一个唯一的键来标识。
这些数据库结构高度清晰,并提供强大的查询语言,因此非常适合处理复杂的查询和事务。例如:MySQL、PostgreSQL。
然而,SQL 数据库横向扩展可能面临挑战。
例如:银行使用 SQL 数据库进行交易管理。这些数据库确保所有交易都能得到可靠处理,并维护准确的账户余额和交易记录。
NoSQL(非关系型数据库)具有灵活性和易于扩展性,但可能会牺牲类似 SQL 的查询功能和 ACID 事务。
NoSQL 适用于处理大量非结构化或半结构化数据,以及需要快速迭代和频繁代码推送的应用程序。例如:Cassandra、Amazon DynamoDB。
它们有多种类型,包括文档型、键值型、宽列型、文档型和图型存储。
例如:像 Netflix 这样的公司使用 NoSQL 来实现实时推荐引擎。NoSQL 数据库可以快速处理大量多样化的数据(浏览量、评分、偏好等),从而为数百万用户提供个性化的内容推荐。
五、一致性与可用性(CAP 定理)
一致性意味着每次有人访问系统时,他们都能获得最新数据。
例如:在亚马逊这样的电商平台上,当顾客下单后,系统会立即更新库存信息。这种信息更新机制可以防止其他顾客在商品缺货的情况下下单。
可用性是指确保系统始终正常运行,即使系统的某些部分出现问题。
例如:在在线即时通讯服务中,可用性确保即使某些服务器出现故障,您仍然可以发送和接收消息。
根据 CAP 定理,在分布式系统中,你只能保证一致性、可用性和分区容错性这三者中的两项。
在一致性和可用性之间做出选择,取决于您希望提供的用户体验中哪一点更重要。
六、强一致性与最终一致性
在分布式系统中,数据存储在多个位置,确保每个人同时看到相同的数据可能是一个挑战。
这就涉及到强一致性和最终一致性的概念了。
强一致性意味着一旦数据更新,之后对该数据的任何访问都将反映该更新。
例如:在银行系统中,当你将钱从一个账户转到另一个账户时,系统会立即更新余额。
另一方面,最终一致性意味着更新可能需要一段时间才能在系统中的所有节点上生效。但是,可以保证的是,如果没有新的更新,最终所有对该数据的访问都会返回更新后的值。
例如:在Instagram等社交媒体平台上,当你发布一张新照片时,它可能不会立即出现在所有关注者的动态消息中。但是,过一段时间后,所有人都能看到最新的更新。
七、读取式缓存与写入式缓存
缓存是一种通过将频繁访问的数据副本存储在速度更快的存储介质中来加快数据访问速度的技术。
就缓存策略而言,“读取直通”和“写入直通”是两种常见的方法。
直读缓存会在请求数据时首先检查缓存。如果数据不在缓存中(缓存未命中),则会先从速度较慢的主存储器将数据加载到缓存中,然后再返回给用户。
它适用于读取密集型应用,这类应用的数据经常被访问,但更新频率不高,从而减轻主存储的负载,提高读取性能。
例如:在网上商店中,当顾客首次浏览某个产品时,产品详情会从数据库中获取并存储在缓存中。后续的浏览操作会直接从缓存中加载产品信息,从而加快响应速度并减少数据库查询次数。
直写式缓存同时将数据更新写入缓存和主存储,确保数据始终保持最新,并降低数据丢失的风险。
这对于写入密集型应用程序来说非常有利。所有写入操作都会立即反映在缓存和主存储中。
例如:电影票预订系统使用直写式缓存来防止超额预订,方法是将预订信息立即记录在缓存和数据库中。
八、批处理与流处理
批量处理是指在一段时间内收集数据,然后一次性处理所有数据。
另一方面,流处理实时处理数据,数据一到达就立即进行处理。
例如:信用卡公司使用批量处理来生成日常账单和对账单。
为了检测欺诈行为,他们采用流处理技术实时分析交易,并立即标记可疑活动。
九、同步处理与异步处理
同步处理是指任务按顺序执行。一个任务必须完成才能开始下一个任务,系统会等待上一个任务的结果后再继续执行。
例如:当您进行网上购物时,支付过程是同步的。点击“立即支付”后,您需要等待交易处理完成。网站只有在确认您的支付成功后才会允许您继续操作。
异步处理允许任务在后台运行,无需等待一个任务完成即可开始另一个任务。
例如:在社交媒体上上传照片是在后台异步进行的。照片上传期间,您可以继续滚动页面或退出应用。
十、有状态架构与无状态架构
有状态系统会记住过去的交互。它会存储有关当前会话的信息,从而在后续交互中保持连续性和上下文关联,而无需每次都从头开始。
例如:在网上购物时,当您将商品添加到购物车后,网站会记住您的选择。如果您离开页面浏览更多商品,然后再返回购物车,您的商品仍然在那里,等待您结账。
无状态系统不会记录过去的交互。每个请求都被视为新的请求,不会保留之前请求的任何信息。
例如:许多 RESTful Web 服务在运行时不会记住过去的请求。例如,当您向公共 API 查询天气信息时,每次请求都需要提供所有必要的详细信息(例如位置)。
十一、长轮询与 WebSocket
长轮询是一种技术,客户端向服务器请求数据,服务器则保持请求打开状态,直到有新信息可用。收到新数据后,客户端立即发送新的请求,从而实现即时更新。
例如:社交媒体平台的通知系统。浏览器不断向服务器查询新通知,服务器在新通知出现或超时时做出响应。
WebSockets通过单个、长期连接提供全双工通信通道,允许服务器和客户端在数据可用时立即来回发送数据,而无需等待对方的请求。
例如:在多人在线游戏中,WebSocket 能够通过客户端和服务器之间的持久连接,实现玩家操作和游戏更新的实时共享。
十二、规范化与非规范化
数据库设计中的规范化是指将数据拆分到相关的表中,以确保每条信息只存储一次。
它旨在减少冗余并提高数据完整性。
例如:客户数据库可以有两个单独的表:一个用于客户详细信息,另一个用于订单,从而避免每个订单的客户信息重复。
另一方面,反规范化是将数据合并回更少的表中以提高查询性能的过程。这通常意味着在数据库中重新引入冗余(重复信息)。
例如:博客网站可以将最新的评论与帖子存储在同一个表中(非规范化),以加快帖子和评论的显示速度,而不是将它们分开存储(规范化)。
十三、单体架构与微服务架构
单体架构是将应用程序的所有部分捆绑在一起构建成一个统一的单元,而微服务架构则是将较小的、可独立部署的服务集合在一起。
单体架构具有简单易用、部署方便的优点,因此适合规模较小的应用程序或团队。然而,随着应用程序的增长,它可能会减慢开发速度,并使扩展变得复杂。
微服务架构提高了可扩展性和开发速度。但是,它增加了服务管理和数据一致性的复杂性,并且可能会增加通信开销。
例如:一个小型 Web 应用程序最初可能为了简单起见而采用单体架构。随着其发展,它可以演变为微服务架构,拆分成更小、可独立扩展的服务,从而提高敏捷性和可扩展性。
十四、REST 与 GraphQL
REST是一种成熟的 API 标准,它简洁易用,并支持多种数据格式。使用 REST API,您可以通过访问多个端点来收集数据。
GraphQL提供更高效的数据获取方式,请求更少,但学习曲线更陡峭,前期设计也更复杂。
在 GraphQL 中,您只需向 GraphQL 服务器发送一个包含具体数据需求的查询。服务器随后会返回一个 JSON 对象,其中包含满足这些需求的数据。
十五、TCP 与 UDP
TCP 和 UDP 是用于通过网络传输数据和消息的通信标准。
TCP(传输控制协议)确保您的消息完整无损地按您发送的顺序到达。它会在发送方和接收方之间建立连接,检查数据是否正确接收,并重新发送丢失的数据。
TCP 非常适合像电子邮件服务这样对可靠性要求极高的应用。
UDP(用户数据报协议)以速度为代价牺牲了可靠性,适用于对时间要求较高的应用,例如视频流,在这些应用中,传输过程中丢失一些数据是可以接受的。
UDP 发送数据时不建立连接,也没有检查来确保数据被接收或顺序正确。
在线游戏和直播服务可能会选择 UDP 协议,因为它的延迟较低,从而牺牲可靠性以换取速度。
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721