高并发系统通用设计方法

概述

在应对高并发大流量时主要有三种方法:

  • Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。
  • 缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。
  • 异步:在某些场景下,未处理完成之前我们可以让请求先返回,在数据准备好之后再通知请求方,这样可以在单位时间内处理更多的请求。

Scale-out(横向扩展)

这个方案的思想来源于CPU的发展,从单CPU到多核CPU;由于单CPU的工艺无法再有所突破,则将多个 CPU 核心压在一个芯片上,从而大大提升 CPU 的并行处理能力。其中单CPU的性能突破叫做Scale-up(纵向扩展),多核心的思想叫做Scale-out(横向扩展)

  • Scale-up(纵向扩展):

    通过不断提高单体性能的思想,比如升级单台服务器硬件。这种方案简单方便。

  • Scale-out(横向扩展):

    通过将多个低性能的机器组成一个分布式集群来共同抵御高并发流量的冲击。但是引入了多节点管理的问题。

缓存

缓存的思想遍布系统设计的每个角落,不管是操作系统、浏览器、数据库等都能看到缓存的影子。使用缓存的主要作用是提升系统的访问性能,在高并发的场景下就可以支撑更多用户的同时访问。

能提升性能的原因在于:缓存大多都是基于内存级别,远比磁盘IO要快几个数量级,这样能让系统处理更快,提高系统吞吐量。

异步处理

异步也是一种常见的高并发设计方法。异步调用,调用方不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。

正是因为异步的特性,异步主要用于解决某些响应时间较长,会造成阻塞的方法;防止系统性能严重下降甚至发生雪崩。

异步的方式:后端处理时会把请求丢到消息队列中,同时快速响应用户,告诉用户我们正在排队处理,然后释放出资源来处理更多的请求。

image-20230410161556656

一般系统的演进过程应该遵循下面的思路:

  • 最简单的系统设计满足业务需求和流量现状,选择最熟悉的技术体系。
  • 随着流量的增加和业务的变化修正架构中存在问题的点,如单点问题、横向扩展问题、性能无法满足需求的组件。在这个过程中,选择社区成熟的、团队熟悉的组件帮助我们解决问题,在社区没有合适解决方案的前提下才会自己造轮子。
  • 当对架构的小修小补无法满足需求时,考虑重构、重写等大的调整方式以解决现有的问题。