大厂高并发系统设计揭秘 高并发系统三大利器

createh55个月前 (12-24)技术教程44


大家好,我是用白话文聊技术的女程序猿如意。以下是根据大厂电商系统的设计经验来做的总结,提供了高并发系统设计的一些思路。面试时也可吊打面试官。

为什么做高并发系统

所谓高并发系统的设计,就是在保证系统整体可用的同时,能够处理很高的并发请求

在设计高并发系统时,就需要

  • 借助外力

分摊流量、引入中间件、完善监控告警来提升系统处理能力;

  • 提升自身处理能力

提升并发处理能力、维护系统稳定性、接口性能提升

来应对突发的流量洪峰。

一、分摊流量

主要运用分而治之的思想,分以下三个方面来实现流量分摊的目的

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、压测定位系统瓶颈

设计高并发系统,离不开最重要的一环,就是压力测试。就是在系统上线前,需要对系统进行压力测试,测清楚你的系统支撑的最大并发是多少,确定系统的瓶颈点,让自己心里有底,做好预防措施。

六、完善监控&告警

没有监控或者没有一个好的监控,导致你无法快速判断系统是不是健康的;没有告警或者没有一个精准的告警,当系统出问题时不能及时通知到你,并且告诉你哪里出了问题,影响是什么以及具体怎么解决。

监控告警的目标是能够预测故障、发现故障、快速定位故障以及故障快速解决。从而维护高并发系统的稳定性。


创作不易,麻烦大家转发、收藏、评论支持一下呀。有想要了解的知识也欢迎私信我

相关文章

程序编码优化-JAVA篇 编写高质量代码:改善java程序的151个建议

之前一篇博客介绍了C语言中一些基础的编码优化,实际上涉及到编译优化,所有语言进行编译时,相应的编译器都可以进行对应的优化;1. 字段访问相关优化基于逃逸分析的优化方式:进行锁消除、栈上分配、标量替换等...

史上最强Java架构师的13大技术能力讲解!| 附架...

从程序员进阶成为架构师,并非一蹴而就,需要系统化、阶段性地学习,在实战项目中融会贯通,这如同打怪通关,我们得一关一关突破,每攻破一个关口,就能得到更精良的装备,技能值也随之不断增长,直至大获全胜。...