在系统设计中,高并发往往意味着巨大的流量压力,而设计高并发系统的魅力在于,我们可以通过巧妙的架构和策略来应对这种冲击,从而为用户提供更流畅、稳定的使用体验。这些策略如同调控水流一般,让汹涌的请求被系统有序地消化与处理。
面对高并发和大流量的挑战,业界普遍采用三种核心应对方式,可类比为“治理洪水”的工程思维:
- 横向扩展(Scale-out):通过分布式部署实现“分而治之”,将流量合理分散到多个服务器上,使每台机器承担一部分负载,从而提升整体处理能力。
- 缓存机制:类似于拓宽河道以容纳更多水流,利用缓存减少对后端资源的直接访问,显著提升响应速度和系统吞吐量。
- 异步处理:在某些场景下,允许请求提前返回,待数据准备就绪后再进行通知,从而在单位时间内处理更多的并发请求,提高系统效率。
1. Scale-up 与 Scale-out 的对比
“摩尔定律”由 Intel 创始人之一戈登·摩尔于 1965 年提出,最初指出集成电路上可容纳的晶体管数量大约每两年翻一番。随后,Intel CEO 大卫·豪斯将其演进为“18 个月性能翻倍”的说法,这一观点广为流传。
虽然摩尔定律原本描述的是芯片技术的发展节奏,但其影响延伸至整个硬件领域。自 20 世纪后半叶以来,计算机硬件性能呈现指数级增长。几十年间,CPU 从最初的十几个晶体管发展到如今单芯片集成数十亿晶体管,正是这一规律的体现。
然而,随着制程工艺逼近 10nm 甚至更低,物理极限和技术成本使得摩尔定律面临失效的风险。为了延续性能提升的路径,厂商转向了多核架构——通过在一个芯片上集成双核、四核甚至更多核心,增强并行处理能力。
在高并发系统设计中,我们也借鉴了类似的两种思路:
- Scale-up(纵向扩展):依赖更强的单机性能来应对更高的并发需求。例如,当前一台 4 核 4G 的服务器每秒可处理 200 次请求,若需处理 400 次,则可通过升级至 8 核 8G 的设备实现。尽管硬件性能提升并非完全线性,但这种方式简单直接,适用于早期或负载可控的系统。
- Scale-out(横向扩展):不同于依赖单一高性能机器,该方法通过构建由多个普通性能节点组成的分布式集群来共同承担流量压力。以上述为例,可用两台 4 核 4G 的服务器协同完成 400 次请求的处理任务。
通常,在系统初期优先考虑 Scale-up,因其架构简单、维护成本低;而当单机性能达到瓶颈时,必须转向 Scale-out 模式以支撑更高并发。
2. 缓存:提升系统性能的关键手段
可以说,Web 2.0 的时代本质上是缓存的时代。从操作系统内核到浏览器渲染,从数据库查询优化到消息中间件的设计,缓存无处不在。它的核心价值在于缩短数据访问延迟,从而在高并发环境下支持更大规模的用户同时操作。
为什么缓存能带来如此显著的性能提升?关键在于存储介质之间的速度差异。常规的数据持久化依赖磁盘存储,传统机械硬盘由盘片、磁头、转轴和机械臂构成,数据分布在磁道、柱面和扇区中。当读取数据时,磁头需移动至指定磁道,这个过程所需的时间称为“寻道时间”。
普通机械硬盘的平均寻道时间约为 10ms,而 CPU 执行指令和内存寻址的速度处于纳秒(ns)级别,千兆网络的数据接收延迟则在微秒(μs)级别。相比之下,磁盘 I/O 成为整个系统中最慢的一环,性能差距可达几个数量级。
因此,采用基于内存的缓存机制成为必然选择。内存访问速度快,虽不具备持久性,但作为中间层能极大缓解对磁盘的频繁访问,从而大幅提升整体响应效率。
如今,“缓存”的概念已不再局限于内存中的临时存储。广义上,任何用于降低响应延迟的中间数据暂存机制都可视为缓存。例如,CPU 的 L1/L2/L3 缓存、操作系统的 Page Cache 等,都是这一思想的具体实践。
3. 异步处理:释放系统吞吐潜力
在部分业务场景中,并不需要立即返回完整结果。此时可以采用异步模式:先接收请求并快速响应,待后台完成数据处理后再通过回调、事件通知等方式告知客户端。这种方式有效释放了请求线程资源,使得系统能在相同时间内处理更多并发任务。
异步不仅提升了系统的吞吐能力,也改善了用户体验,避免了长时间等待导致的阻塞感。它常与消息队列、事件驱动架构结合使用,是构建高并发系统的重要支柱之一。
在高并发系统设计中,异步是一种被广泛采用的设计思想,我们经常能在各类技术文章或分享演讲中听到这一概念。与之相对的概念是“同步”。例如,在分布式服务框架 Dubbo 中存在同步调用和异步调用两种模式;在IO模型中也有同步IO与异步IO的区分。
那么,究竟什么是同步?什么又是异步?
以方法调用为例进行说明:
同步调用意味着调用方必须阻塞等待被调用的方法执行完毕才能继续后续操作。这种模式下,如果被调用的方法处理时间较长,调用方将长时间处于等待状态。在高并发场景中,这可能导致资源被大量占用,系统吞吐量下降,严重时甚至引发雪崩效应。
而异步调用则完全不同。调用方发出请求后无需等待方法执行完成即可返回并处理其他任务。当被调用方法执行结束后,通过回调函数、事件通知等机制将结果反馈给调用方。
异步机制在大规模高并发系统中应用非常普遍。一个典型的例子就是我们熟悉的12306网站。
当我们提交订票请求时,页面通常会提示“系统正在排队中”,这个提示实际上表明系统的处理流程是异步的。因为在12306系统中,查询余票、提交订单以及更新余票状态等操作都较为耗时,往往涉及多个内部子系统的协同调用。若采用同步方式,用户需一直等待直到所有流程结束,这在高峰期极易导致请求堆积、响应超时,正如早期12306上线时频繁出现的无法下单问题。
而引入异步处理后,后端会将订票请求放入消息队列中暂存,并立即向前端返回响应,告知用户请求已接收并正在排队处理。这样既快速释放了Web服务器资源,又能并发处理更多用户的请求。待后台完成实际业务逻辑处理后,再通过短信、站内信等方式通知用户订票成功或失败的结果。
通过将核心业务逻辑移至异步处理程序,Web服务的压力显著降低,资源占用减少,整体系统的并发承载能力也随之提升。
4. 高并发架构的演进过程
了解了上述几种常见设计手段之后,是否意味着我们在构建每一个高并发系统时都要全部应用这些技术呢?答案是否定的。系统架构的发展是一个逐步演化的过程。
正如罗马不是一天建成的,任何复杂系统的成型也都经历了从简单到复杂的持续迭代。
不同规模的系统面临的核心问题各不相同,因此其架构设计的重点也应有所差异。倘若每个电商平台都照搬淘宝的架构,每款即时通讯工具都模仿微信或QQ的技术体系,那大多数系统最终只会走向失败。
虽然淘宝、微信能够支撑千万级甚至上亿用户的并发访问,但其背后的技术复杂度极高。盲目复制不仅难以落地,反而会导致系统臃肿、维护困难。比如淘宝的服务化改造,也是在其单体架构发展到瓶颈、整体扩展性受限之后才启动的项目。
一般来说,高并发系统的演进遵循以下几个阶段:
- 初始阶段:根据当前业务需求和流量水平设计最简单的系统结构,优先选用团队熟悉的技术栈,确保快速交付和稳定运行。
- 发展阶段:随着流量增长和业务变化,逐步识别并解决架构中的短板,如单点故障、横向扩展能力不足、性能瓶颈组件等问题。优先选择社区成熟且团队掌握良好的中间件或解决方案,仅在无合适现成工具时才考虑自研。
- 重构阶段:当局部优化已无法满足业务发展需要时,启动整体架构的重构或重写,从根本上解决现有问题。
仍以淘宝为例,其最初在业务从0到1阶段采用了采购成品系统的方式快速搭建平台。随后,随着用户量激增,陆续实施了一系列关键技术升级:数据库存储引擎由MyISAM切换为InnoDB,实施分库分表策略,引入多级缓存体系,并自主研发中间件来应对性能挑战。
当这些局部优化达到极限后,淘宝启动了标志性的“五彩石”项目,实现了从单体架构向服务化架构的整体转型。正是通过这样一步步渐进式的演进,淘宝最终构建出能支撑亿级QPS(每秒查询速率)的高可用技术体系。
总结一句话:
高并发系统的架构演进应当坚持循序渐进的原则,始终以解决当前存在的实际问题为导向,避免过度设计和盲目复制大型系统的复杂结构。


雷达卡


京公网安备 11010802022788号







