拓冰建站拓冰建站
首页 / 资讯中心 / 正文

后端技术栈一年复盘:哪些组件真正撑住了业务增长

一年前在流量峰值预测会上技术总监把增长目标定在三倍。我们连夜梳理后端技术栈准备替换掉那些看起来“过时”的模块。一年后四倍的增长真实落地复盘数据摆在面前真正扛住压力的却不是当时力推的新架构而是几个被我们反复嫌弃的基础组件。这个结果多少有点讽刺但正是这种讽刺构成了最值得记录的一课。复盘时我们没有按“用了多少新技术”来评价而是逐个统计了故障次数、P99延迟和容量水位。排序结果出来后我发现一个规律业务增长真正考验的不是系统有没有新能力而是在资源被耗尽时谁还能保持输出。业务增长不是技术秀场而是对每个组件抗压能力的考试。数据库慢连接和高流量之间的一场赛跑核心 MySQL 集群在平时 CPU 只有 70%但一到峰值就开始剧烈抖动。我们起初怀疑慢查询可慢查询一直存在增量并不大。真正引发雪崩的是连接获取业务请求量翻四倍后大量线程阻塞在等待连接上数据库连接池被瞬间打满。我们调整了 HikariCP 参数又从共享池拆出了订单池、支付池最后用读写分离削弱非关键读流量。这次救火让我明白数据库真正撑住增长的不是存储引擎而是连接生命周期管理和资源隔离。订单表的大表问题早就知道所以一年前就按 user_id 拆成了 64 张表。因为拆得早单表数据量被压住索引效率没有恶化。但拆表也有代价所有 join 都被我们禁止应用层要吞下那些曾经交给 SQL 的关联逻辑。更麻烦的是如果想从 64 张扩到 128 张rehash 会变成一次停机噩梦。复盘后我承认这次拆表是在赌业务增长的方向好在赌对了。分库分表的第一受益人不是性能而是未来的确定性但绝不能在业务模式还没稳定时就动手。Redis暴露业务抽象漏洞的工具我们部署了三主三从的 Redis 集群大促前加缓存时充满信心。真正的麻烦来自热点商品某个爆款 key 过期瞬间几千个请求同时回源数据库。当时最直接的反应是加分布式锁但一加锁反而让部分请求错过了秒杀窗口。后来我们用本地缓存挡掉绝大部分热点把分布式锁换成针对单一 key 的单飞策略才彻底解决问题。下半年我们又给核心缓存键上了预热机制。每天凌晨把前一日的热点数据扫出来写回缓存高峰期的 miss 率从 28% 降到了 5%。商品详情链路里还引入了 Caffeine 做短缓存利用版本号控制 5 秒刷新。这让 Redis 的 QPS 下降了约 60%效果出乎意料。事后复盘时团队达成共识Redis 本身不是瓶颈真正的问题永远出在缓存策略和过期时间上。最接近用户的缓存往往比距离用户最远的缓存更有价值。还有一次数据丢失更值得玩味。会议里业务方反复说“某些推荐位的记录可以容忍短时丢失”于是我们只写了 Redis没有开启持久化。结果遇到主从切换丢失了少量最近写入的数据导致第二天用户的推荐位短暂回退。业务方确实没有投诉但工程师心里清楚这是拿架构的默认假设在赌。Redis 最危险的用法不是设置短过期时间而是你从心里希望它永不丢数据。Kafka高吞吐背后的责任转移Kafka 在一整年里没有掉链子topics 的消息吞吐支撑住了峰值流量。问题出在消费端。增长后消费者 lag 经常冲到百万团队第一反应是“加消费者线程”但线程越多下游 MySQL 的压力就越大。我们复盘发现真正脆弱的不是 Kafka而是消费者把好几个业务动作串在一条消息里落库、发通知、写历史库任何一个环节抖动整条链路的消费就卡死。我们后来把消费者按业务域拆分每个消费者只处理一件事并增加了死信队列。Kafka 本身可以支撑增长但如果消费者没有稳定的持久化状态再高的吞吐都将变成泡影。更深刻的反省是我们一度把 Kafka 当作万能异步工具。团队内部同步调用慢就往中间塞一条消息事务边界不清晰也想靠消息“最终一致”来兜底。最终一致没有出现不一致倒是经常发生。后来我们砍掉了一大批不必要的异步链路改回同步调用反而更稳。有些系统之所以失败是因为用了 Kafka 来掩盖原本应该同步完成的事务。Kubernetes弹性带来的隐形成本K8s 的自动扩缩容在流量突增时起了大作用。以前凌晨大促我们需要提前人工加机器现在只需设置好 HPAPod 数量会跟着 CPU 和 QPS 一起生长。但它不是没有代价。一次链路追踪发现某服务在高峰时响应变慢查了整整半天才定位到是服务网格里某个 sidecar 的内存增长把 Pod 拖进了反复重启的循环。面对一整个运行时的黑盒我们过去对单台主机的直觉全部失效。Kubernetes 给了我们横向扩缩容的尽头却也拿走了开发者对机器的一点直觉。另外我们曾把带状态的服务硬搬上 K8s结果 Pod 频繁重建导致连接全部重连反而触发瞬间高负载。后来还是把数据库、Redis 等有状态组件挪回裸机或托管云实例。无状态服务可以享受容器化红利有状态服务最好不要随便承诺滚动升级。有状态服务的容器化是云计算领域最大的忽悠之一只适合支持数据独立的副本。网关最容易被忽视的流量闸门增长期间多轮大促带来了十倍于平时的峰值流量如果没有网关做限流核心链路可能早就被打穿了。我们最初只把网关当成转发工具后来才在上面加了一层按用户维度的令牌桶限流把搜索、推荐等非核心接口的流量挡在门外。那次大促后端各服务的负载曲线比以前平滑很多。与其在每个服务里重复实现限流不如在入口处一次性把流量规则说清。好的网关不是简单地挡请求而是在系统最前面分发与业务匹配的优先级。对象存储与分析引擎沉默的功臣这一整年对象存储和 CDN 几乎没有进过故障列表。几十亿次资源访问图片、视频、日志备份全部放到 S3 兼容存储后团队彻底忘了“文件该存在哪里”。相比其他组件的复杂调优它给我的感觉像是一个体面的保险没有惊喜但是绝对可靠。对象存储是用钱买来的确定性和技术团队最值得的投入。分析引擎是下半年才补上的。业务量涨了老板要看实时库存、渠道转化、订单漏斗原先的 MySQL 查询开始吃力。我们引入 ClickHouse通过 binlog 把订单数据同步到分析集群查询性能从十几秒提速到几百毫秒。它带来的深远影响不是报表快了而是产品和运营敢于提出更细致的问题反过来推动了后端接口的演进。分析引擎的价值不在于算得快而在于让团队有时间对问题想得深。还有一层最容易被忽略。Prometheus 监控、链路追踪、统一告警这些“观察组件”从未直接处理请求但它们决定了故障发生时我们能在几分钟内定位根因。今年两次较大的线上问题都是靠监控告警提前发现才把影响范围控制在最低级别。真正撑住业务增长的不只是业务链路里的组件还有那些用来观察链路的组件。一年经营下来这份复盘报告的结论并不性感最稳的组件没有新鲜故事最险的故障反而都是人为复杂导致的。那些真正撑住业务增长的东西具有几个共同特征——语义简单、接口稳定、有明确的失败模型。我们对新技术的幻想太多对基础能力的敬畏太少。技术栈复盘的结论往往很乏味稳定地做好常见的事好过勇敢地承担你不了解的风险。今年我们已经开始清理技术栈把那些只在一个项目里出现过、没人说得清为什么存在的小中间件全部下线。比起引入新组件我更大的兴趣是去掉多出来的依赖。也许下一个十倍增长到来时我们会发现真正能陪我们走下去的不是某个更聪明的框架而是团队敢删代码的决心。真正的技术核心竞争力是知道什么可以去掉。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门