当前位置: 首页 > news >正文

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

所谓高并发系统,是指能同时处理大量并发请求,并及时响应,从而保证系统的高性能和高可用

那么我们在设计一个高并发系统时,应该考虑哪些方面呢?

1. 搭建集群

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

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

2. 微服务拆分

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

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

3. 分库分表

在高并发的场景下,大量请求访问数据库,如果表存储的数据量太大,会影响 MySQL 性能,此时可以考虑分库分表

不管是分库还是分表,都有两种切分方式:水平切分和垂直切分

  • 分表
    • 垂直分表:表中的字段较多,将字段拆分到多个表
    • 水平分表:表中的数据较多,将数据拆分到多个表
  • 分库
    • 垂直分库:数据库表太多,按照业务逻辑进行切分,比如用户相关表放在一个数据库,订单相关表放在另一个数据库
    • 水平分库:指将单张表的数据切分到多个数据库,每个数据库都具有相应的表,只是表的数据不同
4. 主从分离

单机 MySQL 支撑的请求访问是有限的,如果遇到双十一这种情况查询请求量会非常大。这时可以做主从分离,实时性要求不高的读请求都去读从库,写请求或者实时性要求高的请求才走主库,提高了系统的吞吐

5. 使用缓存

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

6. CDN

CDN 就是内容分发网络,它表示将静态资源分发到位于多个地理位置机房的服务器,可以做到数据就近访问,加速了静态资源如图片、视频等的访问速度,让系统更好处理正常别的动态请求

7. 异步处理

在类似双十一的活动可能会遇到流量暴涨,系统处理不过来,造成请求阻塞,系统崩溃。这时可以引用消息队列,将请求写入消息队列,系统再以合适的速率从消息队列获取请求处理,避免造成阻塞,提高系统性能

8. 熔断降级

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

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

9. 限流

大流量过来时,如果系统资源有限,实在没办法处理全部处理,可以采用限流机制,控制接口发送或接收请求的速率,当超过阈值时,限制新的请求对系统的访问,从而保证系统的稳定性

http://www.lryc.cn/news/281089.html

相关文章:

  • 基于WebRTC技术的EasyRTC视频云服务系统在线视频客服解决方案
  • 黑马程序员——2022版软件测试——乞丐版——day04
  • uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -创建图文投票实现
  • Spring系列学习九、Spring MVC的使用
  • 开源内容管理系统Wagtail本地安装运行并结合内网穿透实现公网访问
  • 【蓝桥杯/DFS】路径之谜 (Java)
  • Go语言的内存分配器
  • Swift单元测试Quick+Nimble
  • 详解电源动态响应的测试方法及重要性 -纳米软件
  • 计算机网络系统结构-2020期末考试解析
  • 二叉树的遍历 Java
  • 数据结构之str类
  • Java电影购票小程序在线选座订票电影
  • 24-1-9 bilibilic++音视频
  • 备案(三)
  • Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化
  • impala元数据自动刷新
  • 骑砍战团MOD开发(35)-射击精度系统
  • 树莓派非常实用的程序-3 vcdbg
  • jmeter分布式服务搭建
  • vue中el-radio无法默认选中
  • 分布式I/O应用于智慧停车场的方案介绍
  • node后端+vue前端实现接口请求时携带authorization验证
  • SourceTree管理git
  • 【数模百科】一篇文章讲清楚灰色预测模型GM(1,1)附python代码
  • openssl3.2 - 官方demo学习 - mac - hmac-sha512.c
  • pycharm的使用技巧
  • 如何通过内网穿透实现公网访问Portainer管理监控Docker容器
  • Redis原理篇(Dict的收缩扩容机制和渐进式rehash)
  • Microsoft Remote Desktop for Mac 中文正式版下载 微软远程连接软件