高性能、高并发、高可用、高安全
高性能、高并发、高可用是构建现代大规模系统的三个关键目标,它们各自解决不同的问题,但在实际系统中往往需要综合考虑,互为补充。例如,高并发可能会带来性能瓶颈,而高可用需要在性能和资源消耗之间找到平衡。通过合理的架构设计和技术选型,可以构建出既能应对大量并发请求,又具有快速响应和高可用性的系统。
参考文章:
高性能(High Performance)
概念
高性能指的是系统在处理请求时能够以最快的速度响应(程序处理速度非常快,所占内存少,cpu占用率低)。性能通常与系统的吞吐量和响应时间相关联。高性能系统能够在单位时间内处理大量请求,并在尽可能短的时间内提供响应。应用性能优化的时候,对于计算密集型和IO密集型还是有很大差别,需要分开来考虑。还可以增加服务器数量,内存,IO等参数提升系统的并发能力和性能,但不要浪费资源,要考虑硬件的使用率最高才能发挥到极致。
关键指标
- 吞吐量(
Throughput):系统在单位时间内处理的请求数量。通常以每秒请求数(Requests Per Second, RPS)或每秒事务数(Transactions Per Second, TPS)来衡量。 - 响应时间(Response Time):系统对请求进行反应的时间,及从发出请求到收到响应所需的时间,常以毫秒(ms)为单位。
 - 延迟(Latency):系统中请求等待被处理的时间。高延迟会导致用户体验变差。
 
实现手段
提高性能需要考虑,避免因为IO阻塞让CPU闲置,导致CPU的浪费,避免多线程间增加锁来保证同步,导致并行系统串行化,避免创建、销毁、维护太多进程、线程,导致操作系统浪费资源在调度上。具体如下等方面:
优化算法:使用更高效的数据结构和算法,减少时间复杂度。
数据库性能优化:
- 索引优化:创建适当的索引可以大幅提升查询效率。但需要注意索引的创建和维护成本,避免过多的索引影响写入性能。
 - 查询优化:优化SQL查询,避免全表扫描,尽量使用
JOIN代替子查询,减少不必要的数据传输。 - 数据库缓存:使用数据库缓存可以减少对数据库的访问次数,提高查询速度。
 - 数据库分区:将数据库分成多个分区,可以提高查询速度和可扩展性。
 - 数据库读写分离:将数据库的读操作和写操作分离到不同的服务器上,可以提高系统的吞吐量和并发处理能力。
 
缓存:通过在内存中存储常用数据,减少对数据库的访问,提高读取速度,提升热点数据的访问性能。
数据缓存:使用缓存(如
Redis、Memcached)可以显著提高系统的响应速度。常见的缓存策略有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 操作)放在后台异步执行,不阻塞主线程。
- 消息队列:使用消息队列(如
RabbitMQ、Kafka)可以实现异步处理,解耦系统的各个组件。消息队列可以缓冲突发的请求,确保系统的稳定性。 - 异步任务:通过异步任务处理(如
Celery、Resque),可将不需要即时响应的任务放到后台处理,减少前端请求的响应时间。 
- 消息队列:使用消息队列(如
 资源利用优化:包括
CPU、内存、磁盘 I/O的高效使用,以及减少上下文切换和锁争用。网络性能优化:
- 减少网络延迟:通过CDN加速、内容压缩、减少HTTP请求等手段可以有效减少网络延迟。
 - 使用HTTP/2:HTTP/2支持多路复用、头部压缩等特性,可以显著提高网络传输效率。
 
服务性能优化
- 服务拆分:*将单体应用拆分为微服务,各服务独立部署和扩展,可以提高整体系统的灵活性和性能。
 - 服务降级:**在高并发场景下,对一些非核心服务进行降级处理,可以保证核心功能的稳定运行。
 
负载均衡(
Load Balancing):分散请求到多个服务器上,避免单个服务器过载。- 常用的负载均衡策略有
轮询、最少连接、源地址哈希等。负载均衡器(如Nginx、HAProxy)。 
- 常用的负载均衡策略有
 
高并发(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):当故障节点恢复正常后,自动将其加入集群中,确保集群资源与故障前一致。 
 - 1、故障自动侦测(
 - 容错设计:设计系统时考虑各种可能的故障,并提供应对机制,如数据副本、自动重试等。
- 如redis的高可用的集群方案: Redis单副本,Redis多副本(主从),Redis Sentinel(哨兵),Redis Cluster,Redis自研。
 
 - 自动化运维:通过自动化脚本和工具,快速检测并修复故障,减少人为操作带来的误差和延迟。
- 自动化部署:使用容器化技术(如
Docker、Kubernetes)实现自动化部署和管理,提高运维效率。 - 自动化监控:通过监控系统(如
Prometheus、Zabbix)实时监控系统状态,发现问题及时告警和处理。 
 - 自动化部署:使用容器化技术(如
 - 分布式系统:将服务部署在多个地理位置或数据中心,防止单点故障带来的整体服务中断。
- 多数据中心:在不同的地理位置部署多个数据中心,实现跨区域的服务冗余和故障切换。
 - 主从切换:使用主从复制技术(如MySQL的主从复制)实现数据库的高可用,主库故障时可以切换到从库。
 
 - 数据备份和恢复:定期备份数据,并提供快速的数据恢复机制,确保在数据损坏或丢失时能够迅速恢复。
- 数据备份:定期进行数据备份,确保在数据丢失或损坏时能够快速恢复。
 - 灾难恢复:制定详细的灾难恢复计划,模拟灾难场景进行演练,确保系统在灾难发生时能够迅速恢复。
 
 - 过载保护:负载超过系统的承载能力时,系统会自动采取保护措施,确保自身不被压垮
- 熔断:系统濒临崩溃的时候,立即中断服务,从而保障系统稳定避免崩溃。它类似于电器中的“保险丝”,当电流过大的时候,“保险丝”会先被烧掉,断开电流,以免电路过热烧毁电器引起火灾。
 - 限流:原理跟熔断有点类似,都是通过判断某个条件来确定是否执行某个策略。但它只处理自己能力范围之内的请求,超量的请求会被限流。限流算法:
计数器限流、滑动窗口限流、令牌桶限流、漏桶限流。 
 - 降级:对非核心的功能进行降级 ,降低系统压力。 弃车保帅, 保证核心功能的正常使用 。
 
实际应用场景
- 内容分发网络(
CDN):内容分发网络通过在全球多个节点上分发内容,提高访问速度和可用性,防止单一节点故障影响用户访问。 - 负载均衡:通过负载均衡器,将流量分发到多台服务器,确保即使某一台服务器出现故障,系统整体仍能继续服务。
 
高安全(High Safety)
概念
高安全是指系统能够保护用户数据和系统资源的安全,防止未经授权的访问和攻击。
实现手段
- 网络安全
- 防火墙:配置防火墙(如
iptables)限制不必要的网络访问,保护内部网络安全。 - 入侵检测:部署入侵检测系统(如
Snort、Suricata),实时监控和分析网络流量,发现潜在的入侵行为。 
 - 防火墙:配置防火墙(如
 - 数据安全
- 数据加密:对敏感数据进行加密存储和传输,防止数据泄露和篡改。例如,可使用 
SSL/TLS协议对通信内容进行加密。 - 访问控制:通过权限控制(如
RBAC、ABAC)确保只有授权用户才能访问敏感数据和功能。 
 - 数据加密:对敏感数据进行加密存储和传输,防止数据泄露和篡改。例如,可使用 
 - 应用安全
- 身份验证:采用多因素身份验证(
MFA)增加用户身份验证的安全性。 - 防御常见攻击:防御常见的网络攻击(如
SQL注入、XSS、CSRF),使用安全编码实践和Web应用防火墙(WAF)。 
 - 身份验证:采用多因素身份验证(
 - 安全审计
- 日志记录:记录关键操作日志,便于事后分析和审计。
 - 安全扫描:定期进行安全扫描和漏洞检测,及时修复发现的安全隐患。比如,可以使用漏洞扫描工具(如 
Nessus)来定期扫描系统中的漏洞,并及时进行修复,防止攻击者利用漏洞进行攻击。 - 安全监控:使用安全监控工具(如
Nagios)实时监控系统的运行状态,可以及时发现安全事件,并采取相应的措施进行处理 
 



