ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

三高设计核心解析:高并发、高性能与高可用架构实战

三高设计核心解析:高并发、高性能与高可用架构实战 聊到三高设计很多后端开发的第一反应是面试题。高并发、高性能、高可用这三个词几乎成了系统架构领域的标配考点。但真正在实际业务里把三高落地和面试时背概念完全是两码事。我在一线做后端开发和架构设计这些年见过太多系统在流量洪峰面前花式宕机也总结了不少教训。这篇内容是系列文章的第一章先把三高设计这件事的整体框架讲透包括它到底解决什么问题、由哪些核心技术构成、架构演进通常走哪几步以及最容易踩的坑在哪里。无论你是刚接触分布式系统的初中级工程师还是准备做技术选型的技术负责人这篇文章都值得你花几分钟仔细读一遍。1. 先弄清楚三高到底指的是哪三高三高不是一个官方术语而是国内互联网行业对系统核心指标的通俗概括。很多人张口就说我的系统要支持三高但对这三高具体衡量什么、彼此之间是什么关系其实并没有清晰的认识。我先把定义掰开揉碎了讲清楚。1.1 高并发不是单纯的人多高并发指的是系统在单位时间内需要同时处理的请求数量。衡量它的核心指标是QPS每秒查询数和TPS每秒事务数。注意并发和并行是两个容易混淆的概念。并发是逻辑上的同时大量请求在同一时间段内到达并行是物理上的同时多个任务真正在不同CPU核心上同时执行。一个单核CPU也能通过时间片轮转处理高并发请求只是每个请求的响应时间会变长。我在实际工作中评估一个系统的并发能力通常先看两个数据一个是平均QPS一个是峰值QPS。平均QPS决定了日常资源水位峰值QPS决定了系统的上限设计和扩容策略。举个直观的例子。一个商品详情页系统平时每秒收到2000个请求这不算高并发但到了大促预热期运营一挂活动瞬时流量冲到每秒8万这时候系统面临的就是高并发问题。高并发就像早高峰地铁站台上人潮涌动所有人同时往车门挤考验的是闸机和列车的吞吐能力而不是某个乘客的跑步速度。1.2 高性能快但不是只拼单机高性能关注的是单个请求被处理的速度核心指标是RT响应时间。日常开发中我看得最多的不是平均耗时而是P95、P99这类百分位耗时。P99耗时代表着99%的请求都能在这个时间内返回这个指标比平均值更能反映真实体验因为平均值会被极快请求拉低掩盖长尾请求的问题。高并发和高性能的区别在于高并发是同时能接多少活高性能是每个活干得多快。一个系统可以有很高的性能单请求5毫秒返回但只能同时处理100个并发另一个系统可能单请求50毫秒返回却能扛住10万并发。现实中两者往往互相制约又互相成就——性能优化做得好单请求占用资源的时间短单位时间内能处理的请求数自然就上去了。高性能涉及的面很广从网络传输、DNS解析、负载均衡到应用层的代码逻辑、线程模型再到数据层的SQL查询、缓存命中、磁盘IO任何一环成为瓶颈整体响应时间都会被拖垮。我在性能排查时经常强调一个原则先看链路再看单点。盲目优化某个环节往往解决不了整体问题。1.3 高可用从能用到一直能用高可用指的是系统在面对故障硬件损坏、网络分区、程序崩溃、流量异常时仍然能够持续对外提供服务的能力。它的量化指标是SLA即服务可用性计算公式是可用性 正常运行时间 / 总时间。99.9%和99.99%看起来只差一个小数点实际差距巨大。一年8760小时99.9%可用意味着允许宕机8.76小时而99.99%只允许52.6分钟。很多核心交易系统追求99.99%甚至更高这意味着任何计划内维护都要做到无缝切换任何故障都要在分钟内完成恢复。高可用不是靠某一次设计就一劳永逸的它是一套组合拳冗余部署、故障检测、自动转移、快速恢复每一环都必不可少。我见过不少系统做了多副本部署却忘了配健康检查导致某台机器已经挂了流量还在往那边打——这就是典型的看起来高可用实则一戳就破。2. 三高问题的源头流量模型与业务场景很多人一上来就谈架构选型、技术栈比较但我建议先搞清楚一个问题你的业务为什么需要三高流量模型长什么样不同的业务场景对三高的侧重完全不同搞反了会做出又贵又难用的系统。2.1 读多写少与写多读少两个完全不同的战场互联网业务大致可以分成两类流量模型。第一类是读多写少型典型代表是内容平台、商品详情页、资讯信息流。这类系统99%的请求都在读数据只有1%在写数据。应对这种场景的核心手段是缓存——把热点数据放在离用户更近、访问更快的地方把数据库的读压力卸掉。对这类系统来说高并发和高性能往往是一回事缓存命中率上去了响应时间自然快系统能支撑的QPS也更高。第二类是写多读少型典型代表是订单系统、交易支付、日志采集、评论互动。这类系统的写入量巨大而且往往伴随状态流转下单→支付→发货→完成。直接同步写数据库会很快把数据库打垮业界通用的解法是引入消息队列做异步化——请求先进入队列快速返回后台异步落库同时把突发流量削峰填谷。我在设计订单系统时深有体会如果所有写入都走数据库事务高峰期数据库连接池会瞬间被打满整个系统进入雪崩边缘引入队列之后系统反而变得非常平稳。2.2 峰值流量才是设计的真正对手设计三高系统一定不能盯着平均流量做规划。我最常举的一个例子某系统日均请求量1亿平均下来每秒约1157 QPS听起来不算高。但用户的行为天然有波峰波谷——凌晨低谷可能只有200 QPS晚上8点黄金时段可能飙到5000 QPS如果运营再搞个秒杀活动瞬间冲到5万 QPS也不是不可能。平均流量决定了你的成本基线峰值流量才决定了你的架构形态。我在做容量评估时通常会找三个数日常平均流量、日常峰值流量、大促/活动期的预估峰值流量。然后按照峰值流量30%冗余来做资源规划。注意冗余不是浪费是给系统留缓冲空间。没有缓冲的系统就像走钢丝不带安全网任何一次预估偏差都可能造成线上事故。3. 支撑三高的核心技术底座三高设计不是凭空搭出来的它有实实在在的技术底座。我把最核心的几块单独拿出来讲这些也是后面章节展开的骨架。3.1 无状态应用水平扩容的前提谈到高并发很多人第一反应是多部署几台机器不就行了。没错水平扩容是应对高并发的终极手段但有一个前提——应用必须是无状态的。什么是无状态简单说任何一个请求打到任何一台机器上处理结果都一样。这就要求应用不能把用户会话、临时数据等状态保存在本地内存里。我排障时经常遇到一种情况系统明明部署了5个节点某个节点出问题后挂在它上面的用户全部掉线这就是典型的Session粘滞问题也就是有状态设计导致的故障放大。无状态化的标准做法是把状态外置Session放到Redis文件放到对象存储本地缓存只放可重建的数据。做完了这一步扩容才真正简单——新增几台机器接入负载均衡流量均匀分发系统容量线性扩展。我接手过的系统里凡是坚持无状态设计的大促扩容半小时搞定凡是Session本地化的扩容完还要操心用户登录状态丢失的问题工作量完全不是一个量级。3.2 缓存与异步高性能的两板斧读场景靠缓存写场景靠异步这是我做架构设计时给自己定的两条铁律。缓存能把毫秒级甚至秒级的数据库查询变成微秒级的内存访问。但缓存不是银弹它引出了三个经典难题缓存穿透查一个必然不存在的数据每次都打到数据库、缓存击穿某个热点key过期的一瞬间大量请求同时打到数据库、缓存雪崩大量key同时过期数据库压力瞬间爆表。这三个问题我在后面的章节会专门展开讲解决方案这里先记住一个结论缓存设计好不好直接决定了系统能扛多高的读并发。异步化解决的是写压力的瞬时尖峰问题。消息队列是异步化的核心组件它起到三个作用削峰把瞬时高流量转成平稳的消费速率、解耦生产者和消费者各自独立演进、异步化请求快速返回后台慢慢处理。我在实际项目中习惯把核心链路和非核心链路做异步拆分——下单成功是核心链路发短信通知是非核心链路绝对不能让非核心拖慢核心。3.3 冗余与降级高可用的落地手段高可用最朴素的思路就是冗余数据库做主从复制、应用多副本部署、服务多可用区部署。冗余的意义在于当某个节点故障时其他节点能无缝接管流量。光有冗余还不够必须有故障检测和自动化恢复机制。健康检查、心跳机制、负载均衡摘除故障节点这些是标配。更高阶的做法是故障转移的预演——我在一些团队看到过做得好的混沌工程实践定期在测试环境随机杀掉某个服务节点验证整个系统的自愈能力这种演练比任何文档都管用。在流量异常或依赖故障时降级策略是保命手段。降级分为两类一类是主动降级比如大促期间关闭商品评价功能把资源让给核心交易链路另一类是被动兜底比如下游服务超时后返回兜底数据而不是让整个请求失败。降级的核心是先保核心再保体验——真正的三高系统必须接受部分功能不可用这个现实换取核心链路的整体稳定。4. 从单体到三高架构的演进路线三高系统不是一开始就设计成微服务分布式全套的。我在很多创业团队和业务快速发展期的公司待过最深的感受是架构演进要匹配业务阶段过度设计比不做设计更可怕。4.1 单体阶段先把业务跑通业务初期用户量小功能简单单体应用加单机数据库完全够用。这个阶段的核心任务是快速验证业务模式而不是追求高大上的架构。我见过太多团队在业务还没跑通时就上微服务结果光服务治理就把研发效率拖垮了。单体不是贬义词。单体阶段做对三件事后续演进会很顺利第一代码模块化按业务领域划分清晰边界为后续拆服务打基础第二数据库做好索引和慢查询优化这是所有高性能的基础第三关键业务埋好日志和监控否则后面排查问题会非常痛苦。4.2 垂直拆分与水平拆分当单体应用撑不住流量时第一步是垂直拆分——按业务模块拆成多个服务比如用户服务、订单服务、商品服务。每个服务独立部署、独立扩容把流量分散开。然后是水平拆分——单库数据量太大、写入并发太高就需要分库分表。用户表按用户ID分片订单表按时间分片这是常见的拆分策略。分库分表解决容量问题的同时带来了新难题跨库事务变成分布式事务、跨库Join查询失效、分页排序变复杂。我在实际项目中有一句忠告能用缓存扛住的读写分离就别急着分库分表分库分表是最后的手段不是最优的手段。4.3 微服务与容器化基建就位之后的必然服务拆细之后运维复杂度指数上升。这时容器化Docker和编排平台K8s就成了必然选择。容器化带来的最大红利是弹性伸缩——根据流量指标自动扩缩容流量高峰自动加机器流量回落自动释放资源这在物理机时代是不可想象的。微服务架构的关键配套是可观测性。链路追踪、指标监控、日志聚合这三件套缺一不可。我说句实话服务数超过20个之后没有链路追踪系统线上问题基本靠猜有了全链路追踪才能快速定位到底是哪个环节慢了、哪个服务挂了。可观测性建设应该和服务拆分同步进行而不是出事故后再补。5. 三高设计的取舍与常见误区最后聊聊三高设计中最容易被忽视的部分——取舍。真正的架构师不是什么都用最好的技术而是用最合适的方案解决当前最关键的问题。5.1 没有最好的架构只有最合适的架构一个常见的误区是大厂用什么我也用什么。大厂用自研分布式数据库、自研消息队列、自研微服务框架是因为它们有足够的技术团队和业务规模来支撑这些投入。但对大多数中小团队来说用成熟的开源组件、云厂商托管服务是性价比高得多的选择。我在技术选型时会先列一个表把方案A和方案B在性能、成本、运维难度、团队熟悉度四个维度上做对比然后挑综合分最高的而不是单项最强的。举个例子自建K8s集群和用云托管K8s自建灵活但运维成本极高云托管贵一点但省心很多。对十人不到的基础设施团队我通常建议直接上托管服务把宝贵的人力投入到业务研发上。5.2 高频踩坑过早优化、过度设计、监控缺位最后说三个我在实际项目中反复看到的教训。第一个教训是过早优化。业务还在验证期就引入一整套分布式事务、分库分表、多级缓存结果系统复杂到没人敢改代码。我做架构评审时经常问一句话当前这个阶段最需要解决的瓶颈是什么回答不上来就是在过度设计。第二个教训是忽略数据冷热分离。很多系统到了后期才发现90%的请求都打在10%的热数据上却把所有数据一视同仁地存储和处理。做数据分层、冷热分离往往比增加机器更经济有效。第三个教训也是我认为最要命的是监控和告警建设滞后。我接手过的一个系统平时跑得好好的从来没人看过监控面板。直到一次大促数据库连接数被打满服务大面积超时团队才发现压根没有配置连接数告警。好的监控应该像汽车的仪表盘不是你撞车了才低头看而是随时知道车速、油温和胎压。我自己做系统时有个习惯每个核心指标配置好告警之后会故意做一次故障演练验证告警真能触发——这条经验帮我避免过至少三次监控配了等于没配的事故。三高设计这条路没有终点。系统在成长流量在变化架构也要跟着演进。我这个系列后续会逐章深入展开下一章计划讲清楚高并发场景下流量治理的完整打法。欢迎持续关注也欢迎把你在实践中遇到的问题抛出来一起讨论这些没有标准答案的架构难题。
返回列表