高并发系统设计

《服务器开发技术、方法与实用解决方案》

一、资源扩展策略

1. 垂直扩展

  • 增加服务器CPU核数、采用高性能CPU
  • 提升服务器内存
  • 使用固态硬盘,提升硬盘容量
  • 增加网络带宽

2. 水平扩展

简单理解就是“堆机器”,通过服务器集群来满足高并发场景下的容量需求

1)服务层水平扩展
增加应用服务器数量,采用多个实例对外提供相同的服务。并在客户端和业务服务器集群间增加一个负载均衡层,将来自客户端的请求均匀转发到业务服务器上

由于同一用户的每次请求可能被负载均衡中间件转发到不同的实例上,从而导致上下文无法关联,因此业务服务应设计为无状态服务。

  • 有状态服务:服务端需要保存请求的信息,并且其他请求还可以使用已保存的信息
  • 无状态服务:服务端处理逻辑中所需的数据全部来自本次请求中携带的信息。服务端保存的信息要么与请求无关,要么为所有请求体所共用

2)数据层水平扩展

  • 简单处理:主从部署、读写分离
  • 复杂处理:分库分表+主从部署

3. 负载均衡

1)四层负载均衡
四层负载均衡服务器在接收到客户端请求后,会通过负载均衡算法选择一个最佳服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),然后直接转发给该服务器。

四层负载均衡客户端从DNS服务器获取到的只是服务器集群的虚拟IP(VIP),TCP连接是由客户端和后端业务服务器直接建立的,负载均衡节点只起转发作用

常用方案:LVS、Ali-LVS

2)七层负载均衡
七层负载均衡工作在OSI模型的应用层(HTTP、DNS等),本质是通过分析报文内容进行负载均衡

相较于四层负载均衡,七层负载均衡的流量路由方式要复杂的多。负载均衡节点需与客户端和服务端分别建立TCP连接(三次握手),才能接收到应用层报文的内容

七层负载的优点:可以对客户端的请求和服务器的响应进行任意指定的修改,灵活的处理用户需求;并且可以设定多种策略过滤特定报文(如SQL注入),提升系统安全性

常用方案:Tengine(基于Nginx)

3)混合负载均衡
对于一些大型网站,通常会采用“DNS+四层负载+七层负载

客户端发起请求时,如果使用的是四层协议(TCP/UDP),则LVS集群直接将流量转发给后端服务器,如果使用七层协议(HTTP/HTTPS),LVS会将服务请求转发给Tengine集群,Tengine集群再根据自身的调度算法选择相应的后端服务器建立连接。若使用了HTTPS协议,Tengine集群还需要与KeyServer交互,进行签名验签

二、数据缓存策略

数据库单机的并发量通常为几千,服务端的瓶颈往往都在数据库。缓存服务器单机的承载量一般在每秒几万甚至数十万,通过缓存能够大幅提高系统的响应速度和并发度

1. 本地缓存

本地缓存将数据保存于本地环境的内存,速度快但无法保证数据一致性以及大多没有持久化机制。

常用方案:

  • Guava Cache
  • Caffeine:性能最优,支持更优的缓存淘汰算法
  • Ehcache:功能更丰富,且支持持久化。性能居于Guava Cache和Caffeine之间

2. 分布式缓存

分布式缓存将数据分布(或分区)于任意数目的集群节点上,集群中的一个具体节点只负责缓存一部分数据,集群整体对外提供统一的访问接口。分布式缓存一般基于冗余备份机制实现数据的高可用

分布式缓存相比于本地缓存可以通过集中管理缓存数据的方式保证数据的一致性;且可以通过集群部署、主从机制实现高可用

分布式缓存的典型应用场景:

  • 页面缓存:缓存Web页面的内容片段,如HTML、CSS、图片
  • 应用对象缓存:作为ORM框架的二级缓存
  • 状态缓存:如分布式Session
  • 并行处理:缓存需要共享的大量中间计算结果

常用方案:Redis、Memcached

3. CDN

CDN(内容分发网络)是一种网络加速技术,建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器组成的分布式网络。CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向距离用户最近的服务节点上。目的是使用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间、提升用户体验

CDN分层架构:

  • L1:距离用户越近越好,通常用于缓存可缓存的静态数据
  • L2:距离源站越近越好,当L1无法命中缓存时回源到L2,若L2仍没命中缓存则回源到源站。L2还可以用来做流量、请求数的量级收敛

应用场景:网站站点、应用加速、视音频点播、大文件下载、视频直播加速、移动应用加速

4. 多级缓存

CDN + 本地缓存 + 分布式缓存,若均未命中则查询数据库并更新缓存

三、流量削峰策略

削弱瞬时的请求高峰,让系统吞吐量在高峰请求下保持可控

1. 消息队列削峰

异步化,消息队列在一端承接瞬时的流量洪峰,在另一端平缓地将消息推送出去

涉及到多个应用系统时,为了保持一致性,应采用事务消息方案(保证最终一致性)

2. 客户端削峰

核心思想是尽量避免用户同时请求和重复请求

  • 答题策略:用户需要先答题才能参与。该策略有损用户体验,通常在采用其他策略后仍无法满足高并发需求时使用
  • 限制请求:包括忽略请求(在一定条件下,忽略用户请求),延迟请求(随机算法延迟,分散请求)。该策略存在公平性问题,可能引发舆情,适用场景受限

四、服务降级、限流策略

见系统稳定性设计

五、设计原则

1. 写操作原则

  • 对于不可降级、时延敏感业务,一般以资源扩展策略为主,辅以流量削峰策略
  • 对于不可降级、时延宽松业务,一般以流量削峰策略为主,辅以资源扩展策略
  • 对于非核心且占用资源较多的业务,优先考虑服务降级策略
  • 限流策略作为兜底

2. 读操作原则

  • 对于数据量小、变更频率低、接收弱一致性的业务,一般以本地缓存策略为主,辅以分布式缓存策略
  • 对于数据量较大、变更频率低、一致性要求高的业务,一般以分布式缓存策略为主,辅以本地缓存策略
  • 对于音视频、流媒体、图片、静态资源等内容的分发加速,一般以CDN为主,辅以分布式缓存策略
  • 限流策略作为兜底

你可能感兴趣的:(系统架构设计,java)