0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

面试官:设计一个高流量高并发的系统,有哪些要点?

jf_ro2CN3Fa 来源:CSDN 2023-05-11 10:23 次阅读


我相信每一位开发同学多多少少都想参与或负责一个高用户、高访问、高并发的系统吧。一来可以增加自己实际的项目经验,有应对高并发场景的解决方案,二来是有个高并发的项目经验无疑是自己简历的一个大大的加分项。

但是奈何很多人都没有机会可以参与这样的项目,本文从以下几点介绍一下设计一个高流量高并发的系统需要经历哪些步骤以及考虑哪些因素(文章中的不足之处还请大佬们多多指点)。

1、设计原则

1.1、系统设计原则

在设计一个系统之前,我们先要有一个统一且清晰的认知:不要想着一下就能设计出完美的系统,好的系统是迭代出来的。不要复杂化,要先解决核心问题。但是要有先行的规划,对现有的问题有方案,对未来系统有预案。

在设计高并发的系统时要遵循以下几个原则:

无状态原则

什么是无状态?服务器不保存状态,对单次请求的处理不依赖别的请求就是无状态,主要是为了在应对高并发时方便水平扩展。

拆分原则

在我们的系统体积过于庞大或者承载不了大量的请求时,就要考虑拆分系统,将复杂问题简单化或将流量分散不同子系统分担压力。可以按照以下几个维度进行拆分:

  • 系统维度: 比如电商系统,我们可以拆分成商品、支付、优惠券多个子系统。
  • 功能维度: 将系统按功能再次拆分。
  • 读写维度: 按照读写比例将服务拆分成读服务和写服务。
  • 模块维度: 将系统按照基础架构、消息队列、分库分表 、组件等模块进行拆分维护。

服务化原则

当我们的系统被拆分的足够大时,一旦发生故障靠人工来处理是非常耗时耗力。这个时候就可以通过注册发现、限流、熔断、降级等方案让每个服务可以自己处理问题来帮助我们减少排障成本。

1.2、业务设计原则

在进行业务设计时要遵循一些最基本的原则比如:

  • 防重原则

在某些场景下要防止用户重复操作,例如:用户注册、用户下单、用户支付等。我们需要在客户端和服务端有一些方案避免这种问题。

  • 模块复用原则

在业务中每个功能多多少少是有联系的,在设计的时候模块尽量要独立,其他模块直接调用即可,调用减少代码的冗余。

  • 可追溯原则

在程序的运行中避免不了业务问题以及故障的发生,但是我们可以通过日志的方式快速定位问题,做到有据可查。

  • 反馈原则

系统对用户的响应应该是具体、详细的,举一个很简单的例子,用户登录失败后应该反馈给用户的是“用户名错误”或者“密码错误”,而不是“登录失败”。

  • 备份原则

做好代码备份、数据备份以及人员备份。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

2、客户端优化

在高并发高流量的系统客户端的优化是必不可少的,如果没有做好客户端的优化影响用户体验是一方面,有时候甚至是致命的。

这里分享下我之前惨痛的教训:之前参与过一个秒杀的业务,就是因为前端的没有做优化,大量用户在刷新页面时服务器的带宽被打爆,页面加载不出来,影响了系统的发展,这是非常致命的。主要原因还是没有经验,以为后端做好高并发抵抗就可以。

客户端优化主要集中以下几点:

资源下载

  • 减少不必要传输:例如减少cookie使用,因为cookie 随着请求发送而发送从而增加数据量。
  • 减少数据量输出:例如删除JS无效注释,一来可以减少体积,二来可以提高代码安全。或者可以将文件压缩后传输。
  • 减少请求 :将资源数目多、体积小、频繁创建http请求的文件合并,比如JS合并、矢量图 SVG。
  • 转移第三方:将请求转移至第三方,例如oss。

资源缓存

常见的资源缓存就是图片、样式和脚本。有些场景可以利用客户端的缓存帮助服务端分担压力,比如网约车中的预估价格,客户端可以缓存计算规则并缓存,减少向服务端的请求。

资源解析

我们知道页面中资源解析的顺序是从上到下,如果上面有改变下面也需要变动,所以我们要缩小回流、重绘的范围,比如虚拟dom。除此之外我们还可以利用懒加载和预加载进行优化:

  • 懒加载: 先加载基础的,再根据用户的操作进行局部加载。将原来一次性要加载的拆分成多次加载,减少下载数量和耗时。比如:树节点、折叠面板、二级菜单等。
  • 预加载: 当前页面对下个页面的解析、拉取资源。下面代码作为参考
"x-dns-prefetch-control"content="on">
'dns-prefetch"href="www.baidu.com">
preload"href="..js">
href="..js">

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

3、使用CDN

CDN应用在客户端——>服务端之前,能够实时的根据网络流量和各节点的连接、负载情况以及到用户的距离和响应时间等综合信息将用户的请求导向离用户最近的服务节点上,使用户可以就近取得所需内容,解决网络拥挤的状况,提高用户访问网站的响应速度和成功率。我们可以通过CDN服务商购买CDN服务,绑定我们的域名,其他的事就不用我们管了。

借用一张网络上的图片帮助理解下

63b12a14-ef5f-11ed-90ce-dac502259ad0.png

4、服务的集群

通常高并发系统都存在集群节点,为了抵抗大量的请求,也为了系统的高可用。根据业务场景利用负载策略将一个请求分发到集群中的某个计算节点。通过Nginx、LVS、Keepalived等集群组件可以轻松的实现这一功能。

依然是借用一张网络上的图片

63d83776-ef5f-11ed-90ce-dac502259ad0.png

5、服务端缓存

缓存的介入其实就是空间换时间,常见的缓存组件redis、memcache、guava都可以起到减少响应时间的作用,在高并发的项目中经常被使用到,适合读多写少、耗时长的查询场景。但是会带来开发人员学习、写代码、部署机器、维护的成本。在设计key时要有以下几点认知:

  • 尽量避免冲突碰撞。
  • sha-256冲突极低。
  • 查询key的速度取决于物理位置。

否则使用缓存的收益是非常低甚至没有必要的。

当然,缓存技术的引入也是可能会带来一些列缓存问题,比如缓存击穿、缓存穿透、缓存雪崩等,依然需要代码层面去解决,在使用时需要注意这些问题。

6、数据库优化

我们知道所有的业务数据最终都会落到数据库,随着数据量的增加会带来响应时间的增加,以及系统的负载不断上升,数据库单点压力会越来越大,这个时候对数据库的优化就不单仅是冗余、反范式、索引,可以根据业务场景参考以下方案:

  • 表分区

在mysql中一张表的数据对应一个ibd文件,当文件过大时查找数据就会变的很慢。表分区是将一张表按照hash、list、key等规则进行分流,在物理上将这一张表ibd文件分成多个文件,但是逻辑上还是一张表。访问量不大,但是表数据很多的表,可以采用这种方式,这样的好处就是查询的数据在一个分区时会很快的查到。

  • 分库分表

分库分表是真正的把一张表分布在不同的库或多张表,在访问量大的时候可以把一张表分多张表并且分布在不同的库减少单个数据库的压力,提高并发。或者按照业务划分进行分库分表达到数据隔离的作用。但是这种方式往往会带来分布式id、事务、join查询等一系列问题,我们只能通过代码层面来解决,无疑增加了复杂度。

  • 读写分离

在读多写少的场景下我们可以利用shardingjdbc、mycat等开源框架或组件路由到写库或者读库实现读写分离。同样读写分离也存在一定的问题,比如主从复制问题、时间差问题等,可以结合业务场景规避。

7、服务治理

在高并发的项目中,往往我们的后端服务是很庞大的,因为服务拆分所引发的如:服务调用、服务雪崩、节点故障问题,以及处理高并发请求的问题。如何解决这些问题,让服务更稳定地运行,我们管它叫作服务治理。通常有以下几种方案:

  • 降级: 在高并发的请求下,如果服务资源不足,我们可以丢车保帅,将功能减弱保障核心业务。
  • 熔断: 通常服务间的调用可能会发生服务雪崩的情况,为了防止这种情况发生,我们为单个服务设置保险丝,当外部系统不能访问后禁止调用。
  • 限流: 根据资源或者服务的QPS、线程数情况限制请求量或资源量进行自我保护。
  • 隔离: 隔离通常是为了达到不因某个资源异常而影响其他资源的正常使用。比如数据隔离(分库)、机器隔离(重要的用户单独配置服务器)、机房隔离等。

总结

做好一个高流量高并发的系统,不论前端还是后端,过程中每一个步骤都是至关重要的。设计一个系统除了满足功能性,还要考虑兼容性、易用性、可靠性、安全性、可维护性、可移植性等软件质量。同时要对系统的吞吐量、并发数、平均响应时间等指标要完全掌握,在指标异常时可以快速做出决策避免一系列问题发生。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2694

    浏览量

    47427
  • 服务器
    +关注

    关注

    12

    文章

    9119

    浏览量

    85312
  • 子系统
    +关注

    关注

    0

    文章

    109

    浏览量

    12392

原文标题:面试官:设计一个高流量高并发的系统,有哪些要点?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【明天会更好】教你避开外企面试“高级”错误

    前对提问没有足够准备,轮到提问机会时不知说什么好。而事实上,好的提问,胜过简历中的无数笔墨,会让面试官刮目相看。   八、对个人职业发展计划模糊   对个人职业发展计划,很多人只
    发表于 03-09 10:53

    怎样读懂面试官的心

    的应聘者的成功率,远高于那些目不斜视、笑不露齿的人。项对52名人力资源专家进行的实验:让这些专家通过观看以前进行过的面试录像决定请谁来参加第二轮面试。  这些专家被分成两组,
    发表于 11-22 17:09

    面试时,自我介绍三禁忌

    格,对同一个应聘者的回答,会有不同的评判。“你回答3000元,有的面试官会觉得你很踏实,实事求是。还有的面试官会觉得你欲望不高,没有上进心。”因此,白斌建议在校大学生,要学会察言观色。“跟各种各样的人
    发表于 11-25 19:57

    7面试禁忌回答

    的诚实令人钦佩,但这样的回答,在面试过程中是无用且不被面试官认可的。  2、“我不了解贵公司”  如果你说不了解这家公司,面试官将会怀疑你为什么申请这个职位,是否只是为了金钱,而非职业。  3、“不,我
    发表于 12-06 18:53

    以下五种人面试最难成功

    马马虎虎急急忙忙地就赶到面试的公司,迟到不算,衣着打扮也不合时宜,给面试官的第印象是连自己的形象都不注重,这样的人怎么放心把工作交付给他?  不注重个人职业形象者,通常很难让HR
    发表于 12-15 21:41

    善用“微表情”打动面试官

    部位,帮助求职者矫正不良“微表情”。学生发微博称,微表情很给力。  洞察HR“微表情”可投其所好  “微表情”不是求职者的专有名词,HR也有“微表情”。求职者如果能“察言观色”,也可以洞察面试官
    发表于 01-02 15:42

    千万别这么回答面试官问题!

    就可以,没有可发挥的空间,我希望参与新的、挑战性的工作。03 为什么应聘我们公司噎死面试官的回答 :别的公司都没面上所以来这儿看看千万别这样回答 :以去腾讯面试举例:第,我自认为符
    发表于 03-08 14:28

    汽轮机保护系统一定是和DCS品牌吗

    如题,曾经去单位面试,因为工作经历中有一个是热电厂,所以
    发表于 12-26 10:09

    华为面试改革,你怎么看?

    提问与讨论 15 分钟。每位面试官给出独立评价意见。现场编程对程序员来说是件非常要命的事情 !你可能有过这样的经历: 面试官通过电子邮件给你发
    发表于 05-06 11:00

    未来用机器人做面试官,可靠吗

    小鑫的遭遇备受关注,事件的另主角——机器人面试官,也由此进入了人们的视线。机器人测试结果是否可靠?未来招聘中是否会大规模应用人工智能?
    发表于 06-27 14:55 1499次阅读

    面试官谈软件工程师面试技巧

    我最近直在进行软件工程师面试面试开始时,我都会问面试官问题,但至今没有得到令我满意的回答:
    的头像 发表于 10-25 10:33 4493次阅读

    来自一线面试官的AI领域校招建议

    作为京东集团2019秋招的名算法岗面试官,来为大家解读下如何在AI领域的校招中脱颖而出。
    的头像 发表于 11-28 15:06 3330次阅读

    java软件工程师的面试经历

    早上10点20分,进入了面试官的办公室,面试官示意我坐下后,递给了我面试题,叫我先做下,题目不多,10道,简答题和
    的头像 发表于 07-11 16:28 3187次阅读

    并发系统的艺术:如何在流量洪峰中游刃有余

    尤为重要。用户对在线服务的需求和期望不断提高,系统并发处理能力成为衡量其性能和用户体验的关键指标之并发
    的头像 发表于 08-05 13:43 276次阅读
    <b class='flag-5'>高</b><b class='flag-5'>并发</b><b class='flag-5'>系统</b>的艺术:如何在<b class='flag-5'>流量</b>洪峰中游刃有余

    程序员去面试只需技能征服所有面试官

    车辆工程专业的研究生去面试面试官最后问他会不会嵌入式。虽然应聘的岗位不是嵌入式工程师,但看来老板还是希望他能懂点这方面的知识。这个小插曲就说明了
    的头像 发表于 11-05 19:35 192次阅读
    程序员去<b class='flag-5'>面试</b>只需<b class='flag-5'>一</b><b class='flag-5'>个</b>技能征服所有<b class='flag-5'>面试官</b>!