第一章:从零到百万用户规模的扩展 📅 发布时间:2026/7/3 2:54:39 👁️ 浏览次数: 原文https://github.com/liquidslr/system-design-notes/tree/main/01.%20Scaling介绍将系统扩展到支持数百万用户是一个复杂且迭代的过程需要不断改进和优化。本章概述了如何从单服务器设置开始逐步扩展架构以处理数百万用户。第一部分单服务器设置最初所有组件Web应用程序、数据库、缓存都在单个服务器上运行。请求流程用户通过域名例如api.mysite.com访问应用程序这些域名通过 DNS 解析为 IP 地址。将网络服务器的 IP 地址返回给浏览器或移动应用程序。HTTP 请求被发送到 Web 服务器服务器返回 HTML 或 JSON 响应。流量来源Web 应用程序使用服务器端语言例如 Python、Java实现业务逻辑使用客户端语言例如 JavaScript、HTML实现展示。移动应用程序使用 HTTP 和 JSON 与 Web 服务器通信实现轻量级数据交换。第二部分数据库分离随着用户群的增长数据库被迁移到专用服务器上以便 Web 层和数据库层可以独立扩展。数据库选择关系型数据库SQL以表格形式存储的结构化数据。例如MySQL、PostgreSQL。非关系型数据库NoSQL适用于非结构化数据或低延迟要求。类别包括键值存储图数据库列式存储文档存储如果满足以下条件非关系型数据库可能是正确的选择应用需要极低的延迟。数据是非结构化的或者没有关系型数据。只需要序列化和反序列化数据JSON、XML、YAML 等。需要存储海量数据。第三部分垂直缩放与水平缩放垂直缩放为现有服务器增加更多资源CPU、RAM。受硬件限制且缺乏冗余。水平缩放向池中添加更多服务器使其更适合大规模系统。负载均衡器用于处理服务器之间的请求路由。第四部分负载均衡器负载均衡器将流量分配到多个服务器。其优点包括冗余机制如果服务器离线流量将被重新路由。如果服务器 1 离线所有流量将路由到服务器 2。可扩展性可轻松添加服务器以应对流量高峰。如果网站流量快速增长可以添加后续服务器来处理额外的流量。第五节数据库复制主从模式主数据库处理写入操作。所有数据修改命令如插入、删除或更新都必须发送到主数据库。从属数据库处理读取操作提高性能和可靠性。由于大多数应用程序中读取操作与写入操作的比例较高因此系统中从数据库的数量通常大于主数据库的数量。好处通过并行读取操作提升性能。通过冗余实现高可用性和数据可靠性。故障处理如果只有一个从数据库可用并且该从数据库离线则读取操作将暂时定向到主数据库。如果有多个从属数据库可用则读取操作将重定向到其他健康的从属数据库并且新服务器将替换旧服务器。如果主数据库离线则会从数据库升级为新的主数据库。在生产系统中所选的从数据库可能不是最新的因此需要通过运行数据恢复脚本来更新数据多主和循环复制等方法可能会有所帮助。第六节缓存缓存将频繁访问的数据存储在内存中以减轻数据库负载。缓存层是一个临时数据存储层速度远快于数据库。缓存注意事项使用场景当数据读取频繁但修改频率较低时可以考虑使用缓存。过期策略缓存数据过期后将从缓存中移除。如果没有设置过期策略缓存数据将永久存储在内存中。一致性这意味着保持数据存储和缓存同步。不一致的情况可能发生是因为对数据存储和缓存的数据修改操作没有在同一个事务中进行。缓解故障单个缓存服务器可能存在单点故障建议在不同的数据中心部署多个缓存服务器以避免单点故障。缓存驱逐策略当缓存已满时需要驱逐缓存项以释放内存。LRU最近最少使用是最常用的缓存驱逐策略。第七节内容分发网络CDNCDN通过在地理位置分散的服务器上缓存静态内容图像、CSS、JavaScript来提高加载速度。工作流程用户向最近的 CDN 服务器请求内容。如果内容不可用则会从源服务器获取内容并进行缓存。CDN 注意事项成本CDN 由第三方提供商运营他们会对进出 CDN 的数据传输收取费用。缓存过期时间缓存过期时间既不能太长也不能太短。CDN 回退如果 CDN 出现暂时性故障客户端应该能够检测到问题并从源服务器请求资源。文件失效如果文件已更新则应使缓存失效以指向已更新的文件。第 8 节无状态 Web 层通过将会话数据迁移到共享数据存储区Web 服务器变为无状态服务器。这使得更易于水平缩放。根据流量自动扩缩容。第 9 节多数据中心部署跨多个数据中心部署可以提高可用性并降低延迟。相关策略包括GeoDNS路由将用户定向到最近的数据中心。数据复制跨中心同步数据防止数据不一致。关键考虑因素流量重定向需要有效的工具将流量引导至正确的数据中心。数据同步一种常见的策略是将数据复制到多个数据中心。测试和部署自动化部署工具对于保持所有数据中心服务的一致性至关重要。第 10 节消息队列消息队列是一个持久化组件存储在内存中支持异步通信。它充当缓冲区分发异步请求。输入服务称为生产者/发布者创建消息并将其发布到消息队列。其他被称为消费者/订阅者的服务连接到队列并执行消息定义的操作。第 11 节日志记录、指标和自动化重要性日志记录跟踪错误和系统运行状况。指标提供有关性能和用户活动的见解。自动化简化测试、部署和扩展流程。第 12 节数据库扩展垂直缩放增加了硬件资源但存在物理和成本方面的限制。存在多项缺点单点故障风险更大。垂直扩展的总体成本很高。水平扩展分片使用键例如user_id将数据分散到多个分片中。分片将大型数据库分割成更小、更易于管理的部分称为分片。每个分片共享相同的模式但每个分片上的实际数据都是该分片独有的。分片键在实施分片策略时至关重要。选择分片键时务必选择能够均匀分布数据的键。挑战数据重新分片当出现以下情况时需要进行数据重新分片由于增长迅速单个分片已无法容纳更多数据。由于数据分布不均某些分片可能会比其他分片更快地耗尽资源。一致性哈希用于克服这些问题。名人问题对特定分片的过度访问可能导致服务器过载。为了解决这个问题我们可能需要为每位名人分配一个分片。连接与反规范化一旦数据库被分片到多个服务器上就很难跨数据库分片执行连接操作。常见的解决方法是对数据库进行反规范化以便在单个表中执行查询。结论要点总结保持 Web 层无状态。在每一层都建立冗余机制。使用缓存和 CDN 来优化性能。利用分片技术扩展数据层。为了提高灵活性需要将各个组件解耦。本章为构建能够处理数百万用户的可扩展系统奠定了坚实的基础。
什么是 Vibe Coding?——最火的编程新范式(一文彻底搞懂) Vibe Coding(氛围编程) 是 2025 年初由 OpenAI 联合创始人 Andrej Karpathy 提出的新概念,随后迅速火遍整个技术圈。 它代表了一种全新的编程方式:不再逐行手写代码,而是用自然语言描述需求,完全依赖大模型… 2026/7/3 2:52:38
超参数调优实战:从高维搜索到线上稳定交付 1. 这不是调参,是给模型装上“导航系统”“Master Hyperparameter Tuning in Machine Learning”——这个标题乍看像一句口号,但在我带过37个工业级建模项目、亲手调过2100组超参数组合之后,越来越确信:它根本不是教你怎么点几下鼠… 2026/7/3 2:52:38
行业全景解读|MWC 上海集中释放 6G / 智能体 / 绿色算力成果,AI 安全监管与全球漏洞风险双线承压 行业全景解读|MWC 上海集中释放 6G / 智能体 / 绿色算力成果,AI 安全监管与全球漏洞风险双线承压标签:MWC 上海、6G ADN、CubeMAP、智能体互联网、绿色算力、数据安全办法、Mythos5、深度伪造治理前言2026 年 6 月 24-26 日 MWC 上海正式举办… 2026/7/3 2:48:35
边缘计算盒子挑选指南:从性能到应用,一篇文章教你选对设备 随着人工智能、大模型、工业互联网、智慧零售、智慧医疗等行业的快速发展,越来越多的企业开始将数据处理从云端下沉到本地,边缘计算盒子也逐渐成为数字化建设中的核心设备。然而,市场上的产品种类繁多,配置差异较大,很… 2026/7/3 4:19:10
每日任务清单的重要性的庖丁解牛 每日任务清单的本质,是外部化的工作记忆与预执行的决策协议。它通过将未来的不确定性坍缩为当下的确定性动作,极大地降低了心理熵增。第一层:神经基底——卸载认知负荷与减少切换成本(Cognitive Offloading) 这是清单的… 2026/7/3 4:17:10
需求预测模型验证:从算法指标到业务价值的实战转型 1. 需求预测模型验证的实战困境去年双十一前,我们团队遭遇了一次惨痛的教训。当时为某服装品牌部署的需求预测模型,在实际业务中出现了严重偏差——预测销量增长50%的羽绒服实际只卖出40%,而被判断为"平稳销售"的加绒卫衣却意外爆单… 2026/7/3 4:15:09
4岁儿童美育兴趣班选择建议:注重平面与立体创作结合 4岁儿童美育兴趣班:为何“平面立体”双维创作更利于成长4岁是儿童感知力与精细动作发展的关键过渡期。这一阶段的4岁儿童美育兴趣班选择,不再仅仅是让孩子涂涂画画,更重要的是通过多维度的材料探索,激发孩子的观察力与手眼协调能力… 2026/7/3 4:13:09
国产大模型编码能力实测:DeepSeek-Coder、GLM-4-Code与Kimi-Math-Code工程对比 1. 项目概述:一场真实场景下的国产大模型编码能力横向实测“国内模型哪个编码强?ds,glm,kimi?”——这句话不是论坛里的空泛提问,而是我上周在团队技术选型会上被抛出的首个问题。当时我们正为一个新启动的… 2026/7/3 4:13:09
[特殊字符] C 语言避坑指南:为什么我的 strlen 算出的是 40 而不是 10? 在 C 语言的学习过程中,字符串和数组的关系是新手最容易“翻车”的地方。今天我们来复盘一个非常经典的案例:明明数出来只有 10 个字符,为什么自定义的 my_strlen 函数打印结果却是 40?这背后隐藏着一个关于内存边界和结束符 \0 的… 2026/7/3 4:07:02
如何5分钟快速上手XUnity.AutoTranslator:打破语言障碍的游戏翻译神器终极指南 如何5分钟快速上手XUnity.AutoTranslator:打破语言障碍的游戏翻译神器终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过精彩的游戏剧情?面对日… 2026/7/3 0:01:58
3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址… 2026/7/3 0:05:59
2026江苏三维扫描仪定制厂家:一条很现实的分水岭——“会用”和“用对” 在江苏制造业的三维扫描项目里,有一个很容易被忽略的分界线: 👉 会用设备,不等于用对设备。 尤其在江苏GOM三维扫描仪定制厂家、江苏蔡司3D扫描仪定制厂家项目中,这条分界线会直接决定系统最终是“工具”,还… 2026/7/3 0:07:59