高并发架构方案详解(8主流高并发架构)

高并发架构方案详解(8主流高并发架构)-mikechen

高并发架构是大型架构最核心的内容,比如:阿里的双11秒杀就是典型的高并发架构场景,如何应对?如何解决?本篇详解9大方案@mikchen

负载均衡

负载均衡是一种将流量分配到多个服务器上的技术,确保每台服务器的负载均匀分布,从而提高系统的吞吐量和可用性。

整体架构,如下图所示:

高并发架构方案详解(8主流高并发架构)-mikechen

负载均衡的主要目的是,将流量合理分配到多个服务器上,比如上图的:node-1、node-2、node-3…等节点。

比如:你可以使用轮询法,是最简单的负载均衡算法之一。

它将请求依次分配给服务器集群中的每一台服务器,比如上图的:node-1、node-2、node-3…等节点。

每个服务器依次接收请求,直到分配给最后一台服务器,然后循环到第一台服务器。

当然,你可以使用加权轮询法,让每台服务器根据其性能、和负载能力设置一个权重。

请求按照权重分配给服务器,权重越高的服务器分配的请求越多。

总之,通过负载均衡,可以更好的提升性能、以及可扩展性,并且,还可以避免单点过载。

 

 

数据库分库分表

分库分表是将大表拆分为多个小表、或将数据拆分到多个数据库中,减少单个数据库的负载。

如下图所示:

高并发架构方案详解(8主流高并发架构)-mikechen

通过分库分表,可以极大的减少单点数据库的压力,提高查询效率。

还是,举一个例子,比如:数据根据某个特定的字段(如:用户ID、订单ID等)的范围、或哈希值进行分割。

如果有一个用户表,用户ID在1到1000万之间,可以将1到250万的数据放在第一个数据库实例,250万到500万的数据放在第二个实例,依此类推。

通过分库分表,主要解决数据量大、并发访问高的问题。

通过将同一表的数据分布到多个数据库实例中,从而,提升系统的水平扩展能力。

当然,好处有很多,同样也有很多挑战。

比如:跨多个数据库实例的事务操作变得复杂,可能需要分布式事务管理…..等等。

 

消息队列(Message Queue)

消息队列在系统中引入异步消息处理机制,可以削峰填谷,缓解瞬时高并发压力。

如下图所示:

高并发架构方案详解(8主流高并发架构)-mikechen

在系统的高峰期,生产者可能会产生大量的请求、或任务。

这些请求会首先进入消息队列,而不是直接由消费者处理,消息队列起到一个缓冲作用,防止系统瞬时承受过多的并发压力。

并且,在系统的低峰期,消费者可以逐步从消息队列中提取任务进行处理,充分利用系统资源,平滑系统的负载曲线,避免资源浪费。

 

异步处理(Asynchronous )

异步处理通过将一些非实时任务放入队列异步执行,减少实时系统的响应时间。

如下图所示:

高并发架构方案详解(8主流高并发架构)-mikechen

订单系统在处理完订单后,直接将积分任务异步推送到MQ,然后立即响应用户,而无需等待积分操作完成。

在异步模式下,任务可以同时或独立执行,不需要等待之前的任务完成。

还是举一个例子:假设你有一个电子商务网站,用户下单时需要执行一系列操作。

如库存检查、支付处理、订单生成和发货…..等通知,如果这些操作都是同步执行的。

在高峰期,比如促销活动期间,系统可能会因为高并发请求而崩溃。

总之,在高并发场景下,异步处理能够同时处理大量请求,提高系统的吞吐量、和响应速度。

 

缓存(Caching)

分布式缓存,通过将频繁访问的数据,存储在快速访问的介质中,减少数据库、和后端服务的压力。

缓存通常存储在内存中,因为内存的读写速度、远高于磁盘、和网络存储,适合快速数据访问。

比如,常见的场景:

  • 数据库查询结果缓存:减少对数据库的重复查询,提高查询性能;
  • Web页面缓存:将生成好的页面、或部分内容缓存,减少服务器渲染时间;
  • Session缓存:将用户会话信息存储在缓存中,快速读取和验证;
  • API响应缓存:在前端、或网关层缓存API的响应,减少对下游服务的调用次数。

这些典型的场景,都可以极大的体系性能,你可以选择主流的:Redis、Memcached…等。

 

服务拆分(Service)

将大型单体应用拆分为多个小型服务(微服务架构),各服务可以独立扩展和部署。

比如,SpringCloud就是典型的微服务架构方案。

如下图所示:

高并发架构方案详解(8主流高并发架构)-mikechen

1.按业务功能拆分

将系统按照业务功能模块进行拆分,每个微服务负责一个或多个相关的业务功能。

例如:电商系统可以拆分为订单服务、用户服务、商品服务、支付服务、店铺服务、交易服务…….等。

2.按边界上下文拆分

根据领域驱动设计(DDD),将系统拆分成多个具有明确边界上下文的微服务,以确保各服务之间的低耦合性、和高内聚性。

3.数据库分离

每个微服务拥有自己的独立数据库,以防止不同服务之间直接共享数据,避免服务之间的紧耦合。

每个微服务专注于特定的业务功能,系统组件之间的耦合度降低,便于独立开发、部署、和扩展。

微服务架构通过将系统拆分为多个独立的小服务,使系统可以更好地应对高并发场景。

 

限流和熔断

限流用于控制系统的流量,使系统不至于被过载流量压垮,保护系统在高并发下的稳定性,防止系统崩溃。

熔断器用于在下游服务不稳定时,快速返回错误以保护系统。

高并发架构方案详解(8主流高并发架构)-mikechen

常见工具:Hystrix、Sentinel….等。

 

内容分发网络(CDN)

CDN将静态资源分发到全球多个节点,用户可以从最近的节点获取资源,从而加快资源访问速度。

比如:CDN会将网站的静态内容(如:图片、CSS、JavaScript文件、视频…..等),缓存到多个边缘服务器上,这些服务器分布在全球各地。

当用户请求这些静态资源时,CDN会将用户的请求路由到离用户最近的边缘服务器,从而减少数据传输的物理距离,降低网络延迟,加快页面加载速度。

还是举一个例子,比如:在一个流量高峰期间,数千个用户同时访问某个视频资源。

CDN会将这些请求分发到多个缓存服务器上,而不是让源服务器承受所有流量,从而避免服务器崩溃或响应时间过长。

 

读写分离(Read-Write Separation)

在高并发场景下,数据库是一个常见的瓶颈,通过数据库分片、和读写分离可以提高数据库的性能。

数据库分片将数据水平分割到多个数据库实例中,每个实例只处理部分数据,减轻单个数据库的压力。

读写分离:将读操作分配到从数据库中,而写操作只由主数据库处理,避免读写竞争导致的性能问题。

  • 常见实现:主从复制、MySQL Proxy
  • 优点:提升数据库的读操作性能,减轻主库的负载。

总之,通过将数据库的读操作和写操作分离到不同的数据库实例上,提升读操作的性能。

总结

在高并发架构中,各种方案往往需要结合业务场景使用,设计时要充分考虑系统的业务场景和需求,选择最适合的架构方案。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法