大厂高并发系统设计揭秘 高并发系统三大利器
大家好,我是用白话文聊技术的女程序猿如意。以下是根据大厂电商系统的设计经验来做的总结,提供了高并发系统设计的一些思路。面试时也可吊打面试官。
为什么做高并发系统
所谓高并发系统的设计,就是在保证系统整体可用的同时,能够处理很高的并发请求。
在设计高并发系统时,就需要
- 借助外力
分摊流量、引入中间件、完善监控告警来提升系统处理能力;
- 提升自身处理能力
提升并发处理能力、维护系统稳定性、接口性能提升
来应对突发的流量洪峰。
一、分摊流量
主要运用分而治之的思想,分以下三个方面来实现流量分摊的目的
1、多服务器异地部署
单体应用局限性:能扛住的流量是有限的,而且一旦服务器挂了,将导致整体服务不可用。
高并发系统设计:设计高并发系统时,可以采用分布式部署的方式,将流量分摊到多台服务器,提升系统的整体并发能力。如果条件允许,可将服务部署在不同地域,做容灾及降低延迟。
2、系统拆分
使用 DDD 指导微服务拆分。比如电商系统,可根据功能单一性,拆分成用户、商品、店铺、广告、风控、营销、交易、支付等多个系统。这样也起到了流量分摊的目的
3、数据库优化
1)主从分离
单机MySQL服务器:一台单机的mysql服务器,仅可以支持500左右的TPS和10000左右的QPS,当业务量激增时,就可能成为瓶颈。
主从分离:实时性要求不高的读请求,都去读从库,写的请求或者实时性要求高的请求,才走主库。这样就很好保护了主库,也提高了系统的吞吐。
2)分库分表
由于MySQL单机磁盘容量、连接数都是有限的。高并发场景下,很容易出现SQL RT过高、数据库实例负载过高、单库实例磁盘撑爆等问题。
分库分表:横向/纵向拆分成多个数据库、多个数据表,提升sql查询性能。例如订单系统的订单表,可根据查询角色拆分成买家库、卖家库;根据用户id,用RANGE_HASH分片做数据表拆分。
二、借助中间件
4、使用缓存
使用缓存来提升系统接口的性能,这样高并发场景下,系统就可以支持更多的用户同时访问。
缓存包括Redis缓存,本地缓存等。单拿Redis来讲,单机就可应对几万的并发,读场景的业务,可以用缓存来扛住高并发。但用Redis需注意缓存穿透、缓存雪崩、大key、热key等问题。
5、搜素引擎
复杂查询可借助Elasticsearch来支持。因为它是一个分布式、高扩展、高实时的搜索与数据分析引擎。当数据量大的时候,就不用做加机器、扩容、分库等操作。
三、提升并发处理能力
6、池化技术
使用池化技术,即数据库连接池、HTTP 连接池、Redis 连接池等等。使用数据库连接池,可以避免每次查询都新建连接,减少不必要的资源开销,通过复用连接池,提高系统处理高并发请求的能力。
同理,我们使用线程池,也能让任务并行处理,更高效地完成任务。
7、流量消峰
我们搞一些双十一、双十二等运营活动时,需要避免流量暴涨,打垮应用系统的风险。因此一般会引入消息队列,来应对高并发的场景。
假设你的应用系统每秒最多可以处理1000个请求,每秒却有5000个请求过来,可以引入消息队列,应用系统每秒从消息队列拉1000个请求处理。
四、系统保护
8、限流
限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。
可以使用Guava的RateLimiter单机版限流,也可以使用Redis分布式限流,还可以使用阿里开源组件sentinel限流。
9、熔断和降级
分布式系统中偶尔会出现某个基础服务不可用,最终导致整个系统不可用的情况, 这种现象被称为服务雪崩效应。
为了应对服务雪崩, 常见的做法是熔断和降级。最简单是加开关控制,当下游系统出问题时,开关打开降级,不再调用下游系统。还可以选用开源组件Hystrix来支持。
你要保证设计的系统能应对高并发场景,那肯定要考虑熔断降级逻辑进来。
五、系统性能提升
10、接口rt优化
可利用Arthas分析优化接口执行时长,Arthas 中的 trace 命令能够输出方法内部调用路径,并输出方法路径上的每个节点上耗时。
例如下图所示,可看见有个方法调用占据了大部分时间,代码中找到具体方法的实现,做特定方法实现的优化, 从而优化整个接口rt。
11、压测定位系统瓶颈
设计高并发系统,离不开最重要的一环,就是压力测试。就是在系统上线前,需要对系统进行压力测试,测清楚你的系统支撑的最大并发是多少,确定系统的瓶颈点,让自己心里有底,做好预防措施。
六、完善监控&告警
没有监控或者没有一个好的监控,导致你无法快速判断系统是不是健康的;没有告警或者没有一个精准的告警,当系统出问题时不能及时通知到你,并且告诉你哪里出了问题,影响是什么以及具体怎么解决。
监控告警的目标是能够预测故障、发现故障、快速定位故障以及故障快速解决。从而维护高并发系统的稳定性。
创作不易,麻烦大家转发、收藏、评论支持一下呀。有想要了解的知识也欢迎私信我