后端、接口与数据 · 进阶
调用外部服务时的可靠性
一句话: 每一次外发调用迟早都会失败——唯一的问题是,你有没有为「那时会怎样」做过规划。
四个机制
超时。每次调用都要有,始终要有。没有时间上限的调用会一直占着资源,直到系统窒息。
带递增延迟的重试。只对可以安全重复的操作,只对临时性错误。对校验错误重试是浪费。
熔断器。连续失败之后,暂停一段时间不再尝试。这既保护你,也保护那个已经吃力的服务。
降级模式。服务不可用时系统显示什么:缓存数据、部分功能,或者一条清晰的提示。
重复的问题
当一次调用因超时而失败时,无法知道操作是否已经执行。对每一个有影响的操作——扣款、发送、创建——都要发一个唯一键,让对方能识别出这是重复。没有它,一次重试可能扣两次钱。
监控什么
按外部服务分别看错误率和响应时间,以及熔断器的状态。一次供应商故障在你这边表现为「系统很慢」,会浪费掉好几个小时的无谓排查。
深入一层
把关键依赖和次要依赖分开,并确保次要依赖不可能拖垮主路径。同步路径上的分析或数据丰富服务,是一个完全没有业务理由的故障点。