作为 Java 后端工程师,我们这行有个毛病:不管看什么,都想给它打个指标、测个延迟、看下 QPS。哪怕是庆功宴上的一杯酒。
三个月前,我们组接到核心订单中台的改造任务,历史代码跑得慢、链路又长,高峰期经常打满 CPU。上周终于全量上线,监控大盘一路飘绿,团队决定喝一杯。同事拎上来两瓶五粮春,说今晚不聊线上,就喝个尽兴。
可我第一反应还是那句话:“先看数据。”
先讲我们改代码的 “硬仗”
改造最大的痛点是下单链路。老系统里一次下单要串行调 5 个服务,最慢的库存服务经常 200ms 起,网关一过,整条链路超时率飙到 8%。我们做的第一件事,是给每个环节埋点、上链路追踪,把耗时分布拉出来看。
// 下单链路各环节 P99 耗时(改造前) mall-order.create : 120ms inventory.lock : 210ms ← 瓶颈 pay.placeholder : 45ms coupon.validate : 60ms order.commit : 160ms库存服务那 210ms,就是典型的慢 SQL 在作祟。排查时发现锁库存的 SQL 走了全表扫:
-- 改造前:索引没命中,高峰期这条SQL能把连接池打满 UPDATE t_stock SET locked = locked + 1 WHERE sku_id = ? AND warehouse_id = ?;后来加了联合索引,又改成带版本号的条件更新,把热点行锁换成批量预扣:
-- 改造后:命中联合索引,锁粒度细化 UPDATE t_stock SET locked = locked + ? , version = version + 1 WHERE sku_id = ? AND warehouse_id = ? AND version = ?;改完再压测,下单链路 P99 从 410ms 降到 95ms,超时率从 8% 拉到 0.2%,监控图基本贴着地板走。那几天大家熬红了眼,但看到那条漂亮的下降曲线,值了。
分布式事务的补偿逻辑
最棘手的,是订单状态和库存数据偶尔不一致。我们最终没上重量级的分布式事务框架,而是用消息队列 + 本地消息表做了补偿,核心就这一段:
// 本地消息表兜底:订单已创建但扣库存失败时,定时补偿重试 @Scheduled(cron = "0 */1 * * * ?") public void compensatePendingStock() { List<PendingMsg> pendings = msgMapper.selectTimeout(); for (PendingMsg m : pendings) { if (m.getRetryCount() >= 5) { msgMapper.markDead(m.getId()); // 超过5次进入死信人工处理 continue; } try { inventoryService.deduct(m.getPayload()); msgMapper.markSuccess(m.getId()); } catch (Exception e) { msgMapper.increaseRetry(m.getId()); log.warn("补偿失败, msgId={}, retry={}", m.getId(), m.getRetryCount()); } } }这段代码的注释写得很清楚 ——“超过 5 次进入死信”,那是一个周五晚上,我一边改一边给自己倒的水都快凉了。上线后数据一致性校验全绿,大家才敢松那口气。
庆功宴上的五粮春,和写代码是同一个道理
酒端上来,我下意识又想 “测一下”:
- 闻香(≈首屏体验):香气是复合的粮香,柔和、协调、不冲。不像有些酒一开瓶酒精味直冲鼻子,这点像我们优化后的入口 —— 不用 wait,首包就干净利落。
- 入口(≈P99 延迟):绵柔顺滑,没有尖锐的辛辣。中段饱满均衡,没有哪个环节明显拖后腿 —— 这正是我们盯指标盯出来的 “各组件性能均衡,无单点短板”。
- 回味(≈长期稳定性):余韵干净,尾段不燥不杂,喝完不难受。就像我们反复压测、灰度验证之后,系统长时间稳定不报警的踏实感。
之前也喝过一些浓烈但偏燥的酒,第一口猛,后面发苦、上头。对比下来,五粮春这种平衡感,特别对我们研发人胃口 —— 我们追求的从来不是某一段极致,而是整条链路的协调和稳定。这酒,有点像 “性能均衡没有明显短板的版本”,让人放心。
一句实在话
酒好,但量要适度。庆功助兴浅尝即可,第二天还得维护线上系统,保持清醒是职业底线。这杯酒,是我们三个月代码攻坚的一个注脚 —— 敬团队,也敬那段盯监控、改 SQL、压链路的日子。
项目上线不是终点,后面还有迭代。但我记住了这杯五粮春的味道,也记住了这次技术攻坚里,每一段被优化掉的慢 SQL、每一行补偿代码背后,团队一起熬过的夜。
#五粮春 #Java 后端 #项目上线 #代码人生