兜底在系统设计中的重要性

系统调用关系

     生产环境存在如上图的调用关系,应用 AB 在往下游发起 RPC 调用时,都先去向全局的序列服务申请序列号,序列号用来作为全局流水号或者追踪号。TDSQL 架构如图:

TDSQL示意图

     三周前,TDSQL 做了序列服务数据库的机房迁移,从甲机房迁移到了乙机房,当晚验证没有问题。但是三周过后,硬件负载 F5 出了问题,导致 B 获取序列失败。由于 B 在实现上强依赖于序列服务,序列服务,整个 B 系统的所有交易都走不通了。但是 A 仍然可以正常发起 RPC 调用,因为 A 在实现上,如果调用失败,兜底的方案是会在本地生成序列。

     由于 A 应用依赖于 B 应用,而 B 缺少类似于 A 的兜底策略,导致整体对客的服务全都不可用。

     事实上,序列号只不过是用来追踪程序的一个功能,A 应用的情况,就算不走全局序列服务来生成,本地生成一个序列号也没有任何影响,只不过序列服务那边溯源的时候查不到这笔交易。但是总好过 B 应用,在序列服务出问题的时候,连核心的交易都走不通要好。

打赏
  • Copyrights © 2017 - 2025 杨海波
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信