【真实案例】一个亿级商品系统,如何做到 4 年零故障?

94 阅读4分钟

你有没有经历过这样的场景: 一次商品配置错误,导致全站价格显示异常; 一次同步延迟,让门店无法扫码出货; 甚至一次接口变更,引发下游连锁资损……

在高并发、多端协同的新零售场景下,商品系统一旦出问题,就是“火烧连营”。 它不仅是数据源,更是业务中枢——既要支撑 APP、门店、第三方平台等十余个下游,又要保证强一致性、低延迟、高可用。

那么,如何让它既灵活迭代,又稳如磐石?

我在一家头部新零售公司(BAT生态)负责商品核心平台的架构与稳定性建设。过去四年,我们实现了核心链路连续 1460 天零线上故障。这不是靠运气,而是一套可复制的工程实践。


一、变更不是自由发挥,而是“受控演进”

很多故障,源于“改了一行代码,崩了整个链路”。 我们做的第一件事,是把变更从“个人行为”变成“流程动作”:

  • 契约先行:所有接口/配置变更必须通过自动化校验(基于 OpenAPI + 自定义规则引擎),不合规的提交直接拦截;
  • 灰度兜底:
    • 高风险操作(如字段删除、路由切换)→ 双人审批 + 5% 流量验证 30 分钟 + 人工值守;
    • 低风险操作(如文案、非核心配置)→ 自动按 1% → 10% → 100% 逐级切流,异常自动暂停;
  • 自动巡检:双阶段验证,早发现、早止血
    • 小流量验证期:灰度放量后立即触发轻量探针(如商品查询、基础同步),若错误率突增或延迟翻倍,自动暂停放量,避免问题扩散;
    • 全量发布后:再执行完整的 20+ 核心业务回归(覆盖创建、多端同步、搜索、营销等链路),确保端到端一致性。

      对于涉及数据写入的链路(如商品创建),我们绝不盲目自动回滚。更务实的做法是:快速暂停流量、告警到人、提供一键回退能力,并辅以补偿脚本修复数据。


二、监控不是堆指标,而是“分层闭环”

我们曾被海量告警淹没,却漏掉真正的问题。 后来,我们构建了三层监控体系:

  • L1 业务层:商品同步成功率、端到端延迟——直接反映用户是否受影响;
  • L2 系统层:监控 DB 慢查、MQ 积压、服务错误率等系统指标,在业务受损前捕获异常信号;
  • L3 依赖层:上游服务 SLA、下游消费速率——避免被外部拖垮。

更重要的是:每个告警都绑定明确 SOP(谁处理、怎么查、如何恢复),且每周复盘误报/漏报。 目标不是“告警多”,而是“真问题不漏,假警报不扰”。


三、演练不必复杂,但必须“常态化”

我们重点不在于全链路、多故障叠加的复杂混沌演练(那需要专职团队和大促窗口),
而是聚焦高频、可自动化的单点故障验证:

  • 每月一次“5 分钟断网” :随机切断服务与某依赖的网络,验证熔断与降级;
  • 每季度一次“数据异常注入” :模拟主数据错乱,测试兜底逻辑与人工干预流程。

目标不是模拟“世界末日”,而是确保“日常小故障”不会演变成事故。
关键不是“搞多大”,而是让团队形成肌肉记忆——故障来临时,第一反应不是慌,而是按预案执行。


结果与思考

  • 双11 期间,P99 延迟稳定在 10ms 以内;
  • 因商品问题导致的资损事件归零;
  • 团队从“怕改代码”变为“敢迭代、有底气”。

真正的稳定性,不是不出问题,而是问题发生时,系统能自己兜住,人能快速恢复。

这套方法论,不仅适用于商品系统,也适用于任何强一致性、高可用要求的核心服务——比如订单、库存、用户中心。 稳定性不是大厂的专利,而是每个工程师都可以构建的工程习惯。


最好的架构,是让人感觉不到架构存在的架构——它安静、可靠,日复一日支撑着业务奔跑。

你在做核心系统稳定性建设时,遇到过哪些“看似小改动,实则大风险”的场景? 欢迎在评论区交流,一起把“不出事”变成可复制的能力。