高性能、高并发、高可用是构建现代大规模系统的三个关键目标,它们各自解决不同的问题,但在实际系统中往往需要综合考虑,互为补充。例如,高并发可能会带来性能瓶颈,而高可用需要在性能和资源消耗之间找到平衡。通过合理的架构设计和技术选型,可以构建出既能应对大量并发请求,又具有快速响应和高可用性的系统。

参考文章:

高性能、高并发、高可用

高并发、高性能、高可用、高安全架构设计

程序员的三高:高并发、高性能、高可用

高性能(High Performance)

概念

高性能指的是系统在处理请求时能够以最快的速度响应(程序处理速度非常快,所占内存少,cpu占用率低)。性能通常与系统的吞吐量和响应时间相关联。高性能系统能够在单位时间内处理大量请求,并在尽可能短的时间内提供响应。应用性能优化的时候,对于计算密集型和IO密集型还是有很大差别,需要分开来考虑。还可以增加服务器数量,内存,IO等参数提升系统的并发能力和性能,但不要浪费资源,要考虑硬件的使用率最高才能发挥到极致。

关键指标

  • 吞吐量(Throughput):系统在单位时间内处理的请求数量。通常以每秒请求数(Requests Per Second, RPS)或每秒事务数(Transactions Per Second, TPS)来衡量。
  • 响应时间(Response Time):系统对请求进行反应的时间,及从发出请求到收到响应所需的时间,常以毫秒(ms)为单位。
  • 延迟(Latency):系统中请求等待被处理的时间。高延迟会导致用户体验变差。

实现手段

提高性能需要考虑,避免因为IO阻塞让CPU闲置,导致CPU的浪费,避免多线程间增加锁来保证同步,导致并行系统串行化,避免创建、销毁、维护太多进程、线程,导致操作系统浪费资源在调度上。具体如下等方面:

  • 优化算法:使用更高效的数据结构和算法,减少时间复杂度。

  • 数据库性能优化:

    • 索引优化:创建适当的索引可以大幅提升查询效率。但需要注意索引的创建和维护成本,避免过多的索引影响写入性能。
    • 查询优化:优化SQL查询,避免全表扫描,尽量使用JOIN代替子查询,减少不必要的数据传输。
    • 数据库缓存:使用数据库缓存可以减少对数据库的访问次数,提高查询速度。
    • 数据库分区:将数据库分成多个分区,可以提高查询速度和可扩展性。
    • 数据库读写分离:将数据库的读操作和写操作分离到不同的服务器上,可以提高系统的吞吐量和并发处理能力。
  • 缓存:通过在内存中存储常用数据,减少对数据库的访问,提高读取速度,提升热点数据的访问性能。

    • 数据缓存:使用缓存(如RedisMemcached)可以显著提高系统的响应速度。常见的缓存策略LRU(Least Recently Used)LFU(Least Frequently Used)

    • 页面缓存:对于不经常变化的页面,可以使用CDN(Content Delivery Network)进行缓存,减少服务器压力。

    • 缓存根据性能由高到低分为:寄存器L1缓存L2缓存L3缓存本地内存分布式缓存

      • 上层的寄存器、L1 缓存、L2 缓存是位于 CPU 核内的高速缓存,访问延迟通常在 10 纳秒以下。
      • L3 缓存是位于 CPU 核外部但在芯片内部的共享高速缓存,访问延迟通常在十纳秒左右。高速缓存具有成本高、容量小的特点,容量最大的 L3 缓存通常也只有几十MB。
      • 本地内存是计算机内的主存储器,相比 CPU 芯片内部的高速缓存,内存的成本要低很多,容量通常是 GB 级别,访问延迟通常在几十到几百纳秒。
    • 注意:内存和高速缓存都属于掉电易失的存储器,如果机器断电了,这类存储器中的数据就丢失了。

  • 异步处理:将一些耗时操作(如 I/O 操作)放在后台异步执行,不阻塞主线程。

    • 消息队列:使用消息队列(如RabbitMQKafka)可以实现异步处理,解耦系统的各个组件。消息队列可以缓冲突发的请求,确保系统的稳定性。
    • 异步任务:通过异步任务处理(如CeleryResque),可将不需要即时响应的任务放到后台处理,减少前端请求的响应时间。
  • 资源利用优化:包括 CPU内存磁盘 I/O高效使用,以及减少上下文切换和锁争用

  • 网络性能优化:

    • 减少网络延迟:通过CDN加速、内容压缩、减少HTTP请求等手段可以有效减少网络延迟。
    • 使用HTTP/2:HTTP/2支持多路复用、头部压缩等特性,可以显著提高网络传输效率。
  • 服务性能优化

    • 服务拆分:*将单体应用拆分为微服务,各服务独立部署和扩展,可以提高整体系统的灵活性和性能。
    • 服务降级:**在高并发场景下,对一些非核心服务进行降级处理,可以保证核心功能的稳定运行。
  • 负载均衡(Load Balancing:分散请求到多个服务器上,避免单个服务器过载。

    • 常用的负载均衡策略轮询最少连接源地址哈希等。负载均衡器(如NginxHAProxy)。

高并发(High Concurrency)

概念

高并发指的是系统能够同时处理大量请求或操作的能力。在互联网应用中,用户可能会同时访问某个功能,这就要求系统能够同时处理多个用户的请求而不发生性能下降。

关键指标

  • 并发用户数:同时承载正常使用系统功能的用户数量。
  • 并发事务数:系统能够同时处理的事务数量。
  • QPS(Queries Per Second):每秒钟系统处理的查询数量,反映了系统的并发处理能力。
  • 秒查询率(Queries Per Second,QPS):每秒响应请求数,和吞吐量差不多,用于来衡量系统承载能力

实现手段

  • 线程池:使用线程池技术复用线程资源,避免频繁创建和销毁线程,提升并发处理能力。
  • 无锁并发编程:减少锁的使用,或使用无锁数据结构,避免因锁竞争导致的性能瓶颈。
  • 消息队列:通过消息队列异步处理请求,削峰填谷,平滑系统的并发压力。
  • 水平扩展(Horizontal Scaling):通过增加服务器节点的方式来处理更多的并发请求。
    • 相比之下,垂直扩展(Vertical Scaling是通过增加单个服务器的硬件能力。水平扩展更具灵活性和可扩展性
  • 分布式架构:将系统功能分布到多个节点上,分担并发请求的压力。
  • 限流和熔断:在高并发情况下,保护系统不被突发的流量压垮,限流策略确保核心服务的稳定性。

高可用(High Availability)

概念

高可用指的是系统能够长时间持续稳定运行,并在出现故障时能够迅速恢复,以最小的停机时间提供服务。高可用性是衡量系统可靠性的关键指标。

关键指标

  • 可用性(Availability):系统在规定时间内可用的时间占比,通常以百分比表示。
    • 例如:99.9% 的可用性意味着系统每年最多停机约8小时45分钟。
  • 故障切换时间(Failover Time):当发生故障时,系统切换到备份系统或方案所需的时间。
  • 平均故障间隔时间(Mean Time Between Failures,MTBF):系统在故障间的平均正常运行时间。
  • 平均修复时间(Mean Time to Repair,MTTR):系统从故障到恢复正常服务的平均时间。

实现手段

  • 冗余设计:通过引入冗余(如双机热备、集群冗余等),在一个节点或组件故障时,另一个节点或组件可以无缝接管。
  • 故障转移(Failover):在主服务器发生故障时,自动将请求转移到备份服务器上,保证服务的连续性。步骤如下:
    • 1、故障自动侦测(Auto-detect):采用健康检查、心跳等技术手段自动侦测故障节点;
    • 2、自动转移(FailOver):当侦测到故障节点后,采用摘除流量、脱离集群等方式隔离故障节点,将流量转移到正常节点
    • 3、自动恢复(FailBack):当故障节点恢复正常后,自动将其加入集群中,确保集群资源与故障前一致。
  • 容错设计:设计系统时考虑各种可能的故障,并提供应对机制,如数据副本、自动重试等。
    • 如redis的高可用的集群方案: Redis单副本,Redis多副本(主从),Redis Sentinel(哨兵),Redis Cluster,Redis自研。
  • 自动化运维:通过自动化脚本和工具,快速检测并修复故障,减少人为操作带来的误差和延迟。
    • 自动化部署:使用容器化技术(如DockerKubernetes)实现自动化部署和管理,提高运维效率。
    • 自动化监控:通过监控系统(如PrometheusZabbix)实时监控系统状态,发现问题及时告警和处理。
  • 分布式系统:将服务部署在多个地理位置或数据中心,防止单点故障带来的整体服务中断。
    • 多数据中心:在不同的地理位置部署多个数据中心,实现跨区域的服务冗余和故障切换。
    • 主从切换:使用主从复制技术(如MySQL的主从复制)实现数据库的高可用,主库故障时可以切换到从库。
  • 数据备份和恢复:定期备份数据,并提供快速的数据恢复机制,确保在数据损坏或丢失时能够迅速恢复。
    • 数据备份:定期进行数据备份,确保在数据丢失或损坏时能够快速恢复。
    • 灾难恢复:制定详细的灾难恢复计划,模拟灾难场景进行演练,确保系统在灾难发生时能够迅速恢复。
  • 过载保护:负载超过系统的承载能力时,系统会自动采取保护措施,确保自身不被压垮
    • 熔断:系统濒临崩溃的时候,立即中断服务,从而保障系统稳定避免崩溃。它类似于电器中的“保险丝”,当电流过大的时候,“保险丝”会先被烧掉,断开电流,以免电路过热烧毁电器引起火灾。
    • 限流:原理跟熔断有点类似,都是通过判断某个条件来确定是否执行某个策略。但它只处理自己能力范围之内的请求,超量的请求会被限流。限流算法:计数器限流滑动窗口限流令牌桶限流漏桶限流
  • 降级:非核心的功能进行降级 ,降低系统压力。 弃车保帅, 保证核心功能的正常使用 。

实际应用场景

  • 内容分发网络(CDN):内容分发网络通过在全球多个节点上分发内容,提高访问速度和可用性,防止单一节点故障影响用户访问。
  • 负载均衡:通过负载均衡器,将流量分发到多台服务器,确保即使某一台服务器出现故障,系统整体仍能继续服务。

高安全(High Safety)

概念

高安全是指系统能够保护用户数据和系统资源的安全,防止未经授权的访问和攻击。

实现手段

  • 网络安全
    • 防火墙:配置防火墙(如iptables)限制不必要的网络访问,保护内部网络安全。
    • 入侵检测:部署入侵检测系统(如SnortSuricata),实时监控和分析网络流量,发现潜在的入侵行为。
  • 数据安全
    • 数据加密:对敏感数据进行加密存储和传输,防止数据泄露和篡改。例如,可使用 SSL/TLS 协议对通信内容进行加密。
    • 访问控制:通过权限控制(如RBACABAC)确保只有授权用户才能访问敏感数据和功能。
  • 应用安全
    • 身份验证:采用多因素身份验证(MFA)增加用户身份验证的安全性。
    • 防御常见攻击:防御常见的网络攻击(如SQL注入XSSCSRF),使用安全编码实践和Web应用防火墙(WAF)。
  • 安全审计
    • 日志记录:记录关键操作日志,便于事后分析和审计。
    • 安全扫描:定期进行安全扫描和漏洞检测,及时修复发现的安全隐患。比如,可以使用漏洞扫描工具(如 Nessus)来定期扫描系统中的漏洞,并及时进行修复,防止攻击者利用漏洞进行攻击。
    • 安全监控:使用安全监控工具(如Nagios)实时监控系统的运行状态,可以及时发现安全事件,并采取相应的措施进行处理