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

createh54个月前 (12-24)技术教程41


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

为什么做高并发系统

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

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

  • 借助外力

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

  • 提升自身处理能力

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

来应对突发的流量洪峰。

一、分摊流量

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

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高级用法之:绑定CPU的线程Thread-Affinity

简介在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核。为了充分利用现代CPU的功能,JAVA中引入了多线程,不同的线程可以同时在不同CPU或者不同CPU核中运行。但是对于JAVA程序猿来说...

2021年度最佳免费音乐服务:顶级流媒体应用程序和广播

尽管大流行隧道尽头的灯光已经隐约可见,并且我们在屋外再次度过了更多的时间,但我们中的许多人仍在远程工作。您可能需要调音才能工作-或在外出旅行时清醒头脑时可能需要音乐。无论哪种方式,虽然有很多值得付费的...

干货|互联网广告系统架构实践方案 (多图)

大家好,我是用白话文聊技术的女程序猿如意。广告,是互联网企业最常见的盈利手段之一。几乎是绝大部分互联网平台最主要的营收手段,业务的重要性不言而喻。从技术角度来说,广告业务主要涉及的技术方向有:算法、高...

深入理解Java IO:输入流和输出流的工作原理及应用

导言Java IO的作用和重要性Java IO(Input/Output)是Java编程语言中用于处理输入和输出的库。它提供了一组类和方法,用于读取和写入数据到不同的数据源,例如文件、网络连接、内存等...