如何扛住十万级流量洪峰?扒开高并发架构的五层防御体系
在互联网的残酷战场上流量既是黄金也是洪水。试想这样一个场景你们公司花重金请了一位顶流代言人晚上 8 点准时开启一场“一元秒杀”活动。时间一到原本平时只有几百 QPS每秒请求数的系统瞬间涌入了十万、甚至百万级的并发请求。如果你的系统只有最基础的“Web服务器 数据库”两层架构那么在活动开始的第 0.1 秒Tomcat 线程池就会被打满第 0.5 秒数据库连接池耗尽CPU 飙升到 100%第 1 秒整个系统在一片TimeoutException的哀嚎中彻底宕机。面对暴增的高并发流量真正的架构师从来不会指望靠单一的“银弹”来解决问题而是采用“分层防御、多管齐下”的策略。就像剥洋葱一样在流量到达最终极其脆弱的数据库之前将其层层化解。今天我们就来扒开顶级互联网公司的高并发架构底裤看看这套坚不可摧的“五层防御体系”到底是怎么建立起来的。第一层防御前哨站 —— 流量控制与自我保护网关层当十万大军压境第一步绝对不是想办法把他们全放进来而是立规矩。系统必须具备极强的“求生欲”宁可拒绝部分请求也绝不能让整个盘子崩溃。限流Rate Limiting无情的保安这是最暴力也最有效的防御。在系统的入口如 Nginx、API 网关设定严格的阈值例如“每秒最多只放行 5000 个请求”。多出来的 95000 个请求怎么办直接返回“系统繁忙请稍后再试”。底层通常采用令牌桶算法或漏桶算法保证流量以系统能够承受的恒定速度流入。降级Degradation弃车保帅在大促期间服务器的 CPU 和内存是极其宝贵的。架构师会提前配置好降级开关一旦发现系统压力过大立刻切断那些“非核心、非关键”的功能。比如关闭“猜你喜欢”推荐栏、暂停用户积分的实时计算。把所有算力全部集中保卫“交易下单”这条生命线。熔断Circuit Breaking物理保险丝如果下游某个微服务比如短信服务挂了一直在超时报错。上游的调用方如果继续死等会导致大量的线程被阻塞。熔断机制会在发现下游错误率飙升时果断“切断”调用链路直接返回默认的失败结果。等下游服务缓过气来再尝试恢复。第二层防御调度中心 —— 分流与横向扩展负载均衡层挡住了致命的超出阈值的流量后接下来要处理合法放进来的这 5000 个并发请求。单台服务器肯定扛不住我们需要“群殴”。负载均衡Load Balancing智能交警在所有的业务服务器前面挡着一个高性能的负载均衡器如云上的 SLB、或者自建的 HAProxy/Nginx。它的唯一任务就是把源源不断的请求按照某种算法轮询、权重、IP 哈希均匀地分发给背后的 10 台、50 台应用服务器绝不让任何一台服务器闲着也绝不让任何一台被撑死。无状态设计与横向扩容Scale-Out这要求我们的应用服务器如 Spring Boot 节点必须是“无状态”的——不能在本地内存里存用户的 Session全部统一存到 Redis 里。 为什么因为只有无状态结合 KubernetesK8s等容器化技术我们才能在监控到 CPU 飙升时在短短几分钟内依靠自动化脚本瞬间拉起 100 台新的服务器加入集群共同分担火力。第三层防御缓冲大坝 —— 削峰填谷异步与消息队列到了应用层很多初级程序员会犯一个致命错误让用户干等着所有业务逻辑全部串行跑完。 比如扣减库存200ms - 写订单记录200ms - 增加积分300ms - 发送成功短信500ms。一个请求要耗时 1.2 秒高并发的艺术在于“异步”与“缓冲”。引入消息队列MQ面对极端的秒杀请求应用层绝对不去直接写数据库。而是把这些海量的下单请求当作一条条文本消息疯狂地扔进 Kafka 或 RocketMQ 里。 MQ 就像是一个巨大的三峡大坝它凭借极其恐怖的磁盘顺序写能力瞬间把十万洪峰拦截在水库里。异步泄洪大坝下游的真正“订单处理程序”完全不理会外面的狂风暴雨只根据自己连接池的承受能力以每秒 2000 个的舒适速度慢悠悠地从 MQ 里拉取消息并写入数据库。这就是高并发架构中最经典的*“削峰填谷”。主链路极速返回“排队中”非核心链路全部异步化处理。*第四层防御极速护盾 —— 多级缓存体系缓存层绝大多数的高并发互联网系统都有一个共同特征读多写少比如 100 个人看一件商品只有 1 个人下单。 如果每次读取都去查数据库那是极大的浪费。我们必须把数据放在离用户最近、速度最快的地方。CDN 边缘节点缓存把商品的图片、视频、前端静态页面全部缓存在全国各地的 CDN 节点上。大部分请求在用户家门口的基站就被拦截返回了根本打不到你的核心机房。分布式缓存Redis集群在应用服务器和数据库之间铺设庞大的 Redis 集群。把商品详情、库存余量等高频热点数据全部加载到内存中。内存的并发读取速度是物理磁盘的万倍以上它可以替底层的 MySQL 挡下 90% 以上的读取炮火。本地缓存JVM Cache对于那些极度热门比如秒杀商品的基础信息且几乎不怎么变化的数据连 Redis 的网络开销都可以省掉。直接用 Guava Cache 或 Caffeine 将数据缓存在应用服务器自己的内存里实现真正的“零网络延迟”读取。第五层防御背水一战 —— 数据库底层死磕持久层经过了前面四层的拦截、分流、缓冲和缓存最后能真正落到关系型数据库MySQL上的请求其实已经十不存一了。但数据库依然是整个系统中最脆弱的命门必须严防死守。读写分离搭建主从架构Master-Slave。主库只负责处理高价值的写操作如INSERT订单、UPDATE库存而将所有无法被缓存挡住的读操作SELECT全部分摊给背后的多个从库去抗。分库分表Sharding当订单表的数据量突破两千万B 树的层级变高查询速度开始呈指数级下降。此时必须挥刀“分库分表”。按照用户 ID 或者时间将一个庞大的单库拆散成 10 个甚至 100 个物理库分布在不同的机器上将底层 I/O 压力彻底打散。慢 SQL 斩首行动在极端的并发下一条没有命中索引的慢查询会引发连锁反应瞬间锁死整张表拖垮整个集群。必须建立严格的监控体系对线上的慢 SQL 进行零容忍的打击与优化。总结所谓的高并发架构其实从来没有什么神奇的黑科技它的本质是一场“资源的调配与妥协的艺术”。为了保护系统的存活我们妥协了体验引入了限流与降级。为了化解瞬时的洪峰我们妥协了实时性引入了MQ 异步削峰。为了极致的读取速度我们妥协了强一致性引入了多级缓存。当你在键盘上敲下每一行代码设计每一个架构图时请脑补出那十万并发流量在网线中呼啸而过的画面。理解了这五层防御体系的物理意义你才能在真正的流量洪峰到来时稳如泰山。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2625463.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!