搜索页和结算页,为什么两个价不一样?

发布 · 视频 1:52 · 约 2 分钟读完 · #后端#降级#高可用

章节

  1. 0:00两个价不一样
  2. 0:20一个卡住,全都在等
  3. 0:52先不算红包
  4. 1:18关空调,保冰箱

快捷键:K/空格 播放暂停 · J/L 上/下一章 · ↑/↓ 切换章节

大促时,搜索页的到手价和结算页的价格对不上,这不一定是 bug(也可能是 bug,或者某些优惠本来就只在结算时才算),很常见的一种原因是网站在降级(graceful degradation):舍掉次要部分,保住最要紧的那一段。下面分 4 步讲清楚。

4 步看懂降级

1. 两个价不一样#▶ 从这里看

  • 本例里的「到手价」不是存好的一个数字,而是每次实时算出来的:商品价格减去优惠券、红包等优惠(有的系统也会提前算好存起来)。
  • 不同页面可以算得不一样。大促时搜索推荐页可能不算红包,红包服务正常时,结算页照常计算红包。

2. 一个卡住,全都在等#▶ 从这里看

  • 到手价计算要同步调用多个服务,全部返回才能出结果。其中一个变慢,计算就跟着等,线程、连接一直被占着。
  • 购物车到结算页这条价格计算链路,是整个网站最要紧的一段,叫核心链路。一个依赖卡住、沿调用链拖垮整条链路,就是常说的雪崩(级联故障)。

3. 先不算红包#▶ 从这里看

  • 自动降级:红包服务异常时,计算先不把红包算进去,照样给出到手价。红包本身没被使用,仍在用户账户里。
  • 降级发生在同一条同步链路上:把红包从「硬依赖」(缺了就失败)变成「软依赖」(缺了也能给出结果)。12

4. 关空调,保冰箱#▶ 从这里看

  • 主动降级:大促前,为了把资源留给购物车、结算页这条核心链路,提前关掉搜索推荐页里的红包计算,避免红包服务资源不够用。结算页照常算红包。这种「大促前按预案提前关掉非核心功能」的做法,在厂商文档和技术社区里都有描述。34
  • 这也解释了开头:搜索页的到手价没算红包,到了结算页才算上。
  • 「扛住高峰」四招:消息队列排队、不容易丢、限流守住门口、幂等只扣一次钱、降级先保核心。

深入一问

降级和限流有什么区别?
限流管「进来的请求太多」,在门口按数量放人;降级管「资源不够或依赖出问题时做什么」,主动舍掉次要功能,保住核心结果。两者常一起用。

参考资料

Footnotes

  1. AWS Well-Architected Framework 可靠性支柱,《REL05-BP01 Implement graceful degradation to transform applicable hard dependencies into soft dependencies》(持续更新的官方文档,访问于 2026-10-13):https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_graceful_degradation.html ↩

  2. Microsoft Azure Well-Architected Framework,《Self-preservation / graceful degradation》(持续更新的官方文档,访问于 2026-10-13):https://learn.microsoft.com/en-us/azure/well-architected/reliability/self-preservation ↩

  3. 阿里云 AHAS 文档,《主动降级业务功能》(lastModifiedTime 2022-05-25,访问于 2026-10-14;该功能模块据公告已于 2025-03-31 停止服务,这里只引用它对「主动降级」概念的说明):https://help.aliyun.com/zh/ahas/use-feature-switches-to-implement-active-degradation-for-business ↩

  4. JavaGuide,《服务降级与熔断详解》(社区技术文档,非厂商官方;页面未显示日期,访问于 2026-10-14):https://javaguide.cn/high-availability/fallback-and-circuit-breaker.html ↩

幕后

这部片子完全由代码生成。