如何设计一个高并发系统?

概述

系统中的三高一般指:高并发、高吞吐、高可用。高并发指在某个时间点上能够接收多少并发访问。高吞吐主要关注处理的数据量。高可用指在部分服务出现故障后仍能对外提供服务。


高并发的核心指标

  1. QPS(Query Per Second):每秒的请求或查询数量,在互联网领域指每秒响应的请求数量
  2. TPS(Transactions Per Second):每秒处理的事务数量
  3. RT(Response Time):响应时间,从请求发出到收到响应所需要的时间
  4. 并发用户数:指系统可以同时承载的正常使用系统功能的用户数量

高并发的设计原则

1. 搭建集群

如果你只部署一个应用,只部署一台服务器,那抗住的流量请求是非常有限的。并且,单体的应用,有单点的风险,如果它挂了,那服务就不可用了

因此,设计一个高并发系统,我们可以采用分布式部署的方式,部署多台服务器,使用负载均衡的方式把流量分流开,让每个服务器都承担一部分的并发和流量,从而提升整体系统的并发能力

2. 服务拆分

服务拆分就是把一个单体的应用,按功能单一性,拆分为多个服务模块。比如一个电商系统,拆分为用户系统、订单系统、商品系统等等。

因此,服务拆分同样可以分摊请求流量,提高并发能力。如果配合分布式部署,为每个服务搭建集群,性能将进一步提升

3. 无状态设计

无状态应用是指不依赖于持久化存储或特定服务器状态的应用程序。每个请求都是独立的,无需维护会话状态或共享数据。无状态应用可以轻松扩展,通过增加更多的实例来处理更高的负载。

4. 服务治理

当系统变得复杂时,需要进行服务治理,比如自动注册和发现服务,服务分组、服务隔离、服务路由、服务限流、黑名单配置等

5. 幂等设计

幂等设计是指任意多次执行所产生的影响均与一次执行所产生的影响相同。当程序符合幂等设计的特性时,便可安全地使用错误重试

6. 消息队列

用于实现服务解耦、异步处理、流量削峰、流量缓冲等

7. 异步编程

可以提高系统的并发度,在可能的情况下尽量使用异步调用,具体实现有 Future 和 Callback 等

8. 数据治理

对于数据层采用读写分离、分库分表、数据分层等技术实现数据层的高并发和数据的高可用性。

9. 使用缓存

使用缓存可以提升接口的性能,在高并发场景下支持更多的用户同时访问。常用的缓存包括:Redis 缓存,内存缓存,浏览器缓存,CDN 缓存等等

10. 计算与存储分离

在计算与存储分离后,计算层和存储层均可自由伸缩,以应对灵活的业务需求

11. 弹性设计

在云上采用弹性设计思想,在高峰时弹出更多的资源以应对流量高峰,在低峰时缩减资源以降低成本

12. 限流设计

互联网上用户的流量是不可预知的,为了保障系统的稳定性,需要根据系统的并发量进行合理的限流配置

13. 超时重试

当调用错误时需要考虑多次重试以保障最终调用成功,但是可重试的业务需要符合幕等性要求

14. 可扩展设计

良好的可扩展性为需求的增加和变更带来很大方便

15. 可维护设计

系统要易于维护,比如一个长期不敢重启的系统,其维护性就不强。另外,合理的日志存储和分析手段也是可维护性设计需要考虑的一个方面

16. 可监控性设计

可监控性设计一般从系统日志、监控指标、调用链三方面来实现。系统日志记录了系统在运行过程中某一时刻的状态,通过对日志中错误日志的实时监控能及时发现系统运行过程中的问题。监控指标分为流量监控指标(例如 QPS),系统资源监控指标(例如CPU、内存磁盘使用率)、业务监控指标(例如日流水变化)等多个维度。调用链指服务之间相互调用关系的展示,能帮助我们快速分析出某个功能的调用逻辑和依赖关系,从而快速分析和解决问题

17. 告警系统

当系统发生故障(例如进程宕机、错误日志过多、流量异常等)时能及时告警并通知维护人员处理,可以是多级告警,比如邮件、信、短信、电话等

18. 熔断降级

当前互联网系统一般都是分布式部署的,如果出现某个基础服务不可用,最终将导致整个系统不可用。比如分布式调用链路 A -> B -> C,如果 C 出现问题,将导致 B 也会延迟,从而 A 也会延迟。A 会不断失败重新请求,消耗占用系统资源,最终会造成其他的请求同样不可用,导致系统崩溃。熔断机制可以防止应用不断尝试可能超时或失败的服务,保证自身快速响应,提高系统吞吐量

降级机制是指在流量过大,系统资源有限的情况下,为了保证关键服务正常运行,降低部分非关键服务的优先级或质量的一种策略。比如电商网站,流量大的时候就把评论功能停掉,把资源让出来给关键服务

posted @ 2024-01-15 16:29  低吟不作语  阅读(660)  评论(0编辑  收藏  举报