系统慢得像蜗牛,数据库CPU飙到百分之九十,产品经理天天催优化。你一拍脑袋,上Redis、上MQ、上分库分表,全都要上。且慢,饭要一口一口吃,路要一步一步走。这三样东西,上错了顺序,不但救不了系统,反而把自己拖进更深的坑。优化不是堆技术,是找准病根再下药。
先看瓶颈在哪,别闭着眼睛吃药
系统慢了,第一步不是想上什么中间件,是打开监控看哪里慢。是数据库查询慢,还是接口响应慢,还是消息处理慢?打开慢查询日志,看有没有全表扫描,有没有缺索引。很多时候,加一个索引就能解决的问题,你非要上分库分表,等于感冒去动手术。上来就堆技术,好比发烧直接化疗,药不对症反伤身。先用最便宜的手段验证,EXPLAIN看一眼,慢查询捞一圈,八成问题出在SQL本身。
Redis优先:成本最低,见效最快
如果确认数据库读压力大,热点数据被反复查询,Redis是第一选择。缓存扛读,立竿见影。商品详情、用户信息、排行榜,这些读多写少的数据往Redis一放,数据库压力瞬间降下来。Redis部署简单,改造成本低,一个注解就能把查询结果缓存起来。缓存是性价比最高的优化,没有之一。但注意,缓存要做好过期策略和击穿保护,别数据库没垮,缓存先雪崩了。缓存用好了,能撑到日活百万不用动数据库架构。
MQ其次:解耦和削峰,但不是万能药
数据库压力解决了,如果系统还有问题,看看是不是同步调用太多。下订单要扣库存、发短信、加积分、写日志,串行执行,用户等半天。这时候上MQ,把非核心流程异步化。订单写完就返回,短信和积分慢慢处理。流量洪峰来了,MQ当缓冲池,削峰填谷,保护下游不被打穿。MQ的价值不在快,在稳,让该急的急,该慢的慢。但MQ引入了一致性问题,消息丢了怎么办,重复消费怎么办,这些复杂度你得接得住。没到那个量级,别硬上。
分库分表最后:伤筋动骨,非必要不动
前两步做完,数据库还是扛不住,才考虑分库分表。这是大手术,动的是数据模型和访问层。分片键怎么选,跨库join怎么办,分布式事务怎么保证,每一件都够你喝一壶。而且分完以后,扩容、迁移、运维复杂度成倍上升。分库分表是最后的底牌,不是第一张牌。单表千万级以下,优化索引和SQL就能撑。几千万到亿级,先考虑读写分离和归档冷数据。真正到了十亿级,再动分库分表的刀。
读写分离是分库分表的前哨
在主从复制基础上做读写分离,写走主库,读走从库。这是比缓存和MQ更轻的横向扩展手段,改造成本适中,效果明显。一主三从,读吞吐量翻几倍。配合Redis缓存,能扛住绝大多数互联网场景。读写分离是分库分表之前最划算的一步棋。很多团队跳过这一步直接分片,白白增加了复杂度。
顺序背后是成本思维
Redis、MQ、分库分表,技术上没有高低之分,只有成本先后之别。Redis改几行代码,MQ改一个模块,分库分表改整个架构。用最小代价解决最大问题,才是架构师的功力。先上便宜的,验证有效再往前走。别为了简历好看,把简单系统搞成分布式迷宫。技术选型的第一原则永远是:能简单,绝不复杂。
系统优化像看病,先量体温,再验血,最后才做CT。Redis是退烧药,MQ是消炎药,分库分表是手术刀。顺序对了,药到病除;顺序错了,小病治成大病。找准瓶颈,小步验证,按需演进,这才是后端优化的正道。别被技术名词牵着鼻子走,你面对的是业务问题,不是技术展览。