wsdl获取逻辑修改事故的复盘

一、事故描述

EDI在对SOAP服务进行调用的时候会解析商家的wsdl。

  • 初始逻辑是只获取http协议的地址,但是新上线的商家A的协议为https,导致无法获取请求地址,访问商家异常。
  • EDI侧修改解析wsdl获取地址逻辑,增加对https的支持;商家A恢复正常;

  • 此时商家B出现了问题,其wsdl中提供了两个地址,一个是http,一个是https,但是https的地址是不可用的。这次修改支持https后,错误的获取到了https地址,导致商家B调用异常。

  • EDI侧再次修改解析wsdl获取地址逻辑,优先使用与wsdl地址协议相同的地址,商家B恢复正常。

而由于组织变动,之前的运维监控团队解散,无人监控到商家B的异常。导致商家B的问题到次日才发现,造成了商家货物堆积现象。

二、事故初始反思

1)事故原因

  • 商家B的wsdl不符合规范,wsdl中暴漏的服务不可用
  • EDI侧修改没有完全兼容之前逻辑
  • EDI侧上线后没有完整检查所有受影响的商家
  • 运维团队解散,导致问题延迟发现,扩大了事故影响

2)事故预防

  • 规范上线流程
    • 上线前做完整商家测试
    • 上线前通知相关方做好监控
    • 上线时灰度验证,发现问题及时回滚
    • 上线时观察所有受影响商家是否正常
    • 增加监控指标,核查监控指标确定系统健康度

3)事故发现

  • 异常监控
    • 帮助新的运维团队订阅业务异常,做到及时发现故障
    • 分离http调用等异常为系统异常,由EDI侧研发监控

4)事故处理

  • 及时回滚,快速恢复故障
  • 及时复核受影响的所有商家,通知业务侧
  • 隔离重要商家到单独集群,降低故障率

三、更高维度反思

1)运维团队监控/EDI侧监控 ——> 多方边界

从监控职责上分为两方EDI平台侧和运维侧,而此次事故暴露出的是这个边界不清晰。由谁监控如果没有明确的边界,必然会造成事故延迟发现。

事故不光要从技术角度去看,还要从组织的角度上去看。一个中间件的使用方是多个部门,这时候如果没有厘清中间件、使用方、客户、实施运维团队的责任边界,那么会出现职责灰度地带。这些灰度地带一但出问题,必然没有人发现,直到问题扩大到更大的区域。

2)商家侧wsdl不合理 ——> 新功能开发要基于标准,不妥协

早期wsdl只支持http实际上是对商家侧不符合标准的一种妥协。作为一个中间件,这种在原则上是不允许的。当多个商家都不符合标准,且互相冲突的时候,平台根本无法兼顾。此时只有坚守标准,才能拉齐场景。

3)多次修改上线 ——> 上线要有正式书面完整流程

上线流程书面化,严格遵守,不要存在侥幸心理。

评论