由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

接口调用出错了怎么办?

架构设计 西门飞冰 2227℃
[隐藏]

1.说明

本文档根据B站UP主分享内容整理,视频原版连接:B站链接:超实用!接口调用出错怎么办?

2.介绍

在我们进行分布式业务调用的时候,各个服务之间的调用不可能是百分百成功的,所以我们在调用接口的时候,就要考虑如果调用出错了该怎么办。

3.故障转移

利用重试的机制,选择其他可用节点,完成我们的业务。

⾼可⽤的服务集群中,多数的服务——尤其是那些经常被其他服务所依 赖的关键路径上的服务,均会部署多个副本。这些副本可能部署在不同 的节点(避免节点宕机)、⽹络交换机(避免⽹络分区)甚⾄可⽤区 (避免整个地区发⽣灾害或电⼒、⻣⼲⽹故障)中。故障转移是指如果 调⽤的服务器出现故障,系统不会⽴即向调⽤者返回失败结果,⽽是⾃ 动切换到其他服务副本,尝试通过其他副本返回成功调⽤的结果,从⽽ 保证整体的⾼可⽤性。

image-20221117220540582

使用前提,需要做好接口幂等性才可以使用这种机制,否则应该使用快速失败。

4.快速失败

对于⾮幂等的服务,重复调⽤就可能产⽣脏数据,⽽脏数据带来的麻烦远⼤于单纯的某次服务调⽤失败,此时就应该以快速失败作为⾸选的容错策略。譬如,在⽀付场景中,需要调 ⽤银⾏的扣款接⼝,如果该接⼝返回的结果是⽹络异常,程序很难判断 到底是扣款指令发送给银⾏时出现的⽹络异常,还是银⾏扣款后返回结 果给服务时出现的⽹络异常。为了避免重复扣款,此时最恰当可⾏的⽅ 案就是尽快让服务报错,坚决避免重试,尽快抛出异常,由调⽤者⾃⾏处理。

image-20221117220644865

5.安全失败

安全失败体现出的安全是针对调用者来说,调用旁路业务无论成功还是失败,他都会返回一个成功的消息给调用者。

在⼀个调⽤链路中的服务通常也有主路和旁路之分,换句话说,并不是 每个服务都是不可或缺的,有部分服务失败了也不影响核⼼业务的正确性。譬如开发基于Spring管理的应⽤程序时,通过扩展点、事件或者 AOP注⼊的逻辑往往就属于旁路逻辑,典型的有审计、⽇志、调试信息,等等。属于旁路逻辑的另⼀个显著特征是后续处理不会依赖其返回 值,或者它的返回值是什么都不会影响后续处理的结果,譬如只是将返 回值记录到数据库,⽽不使⽤它参与最终结果的运算。对这类逻辑,⼀ 种理想的容错策略是即使旁路逻辑实际调⽤失败了,也当作正确的来返 回,如果需要返回值的话,系统就⾃动返回⼀个符合要求的数据类型的对应零值,然后⾃动记录⼀条服务调⽤出错的⽇志备查即可,这种策略 被称为安全失败策略。

image-20221117220754209

6.沉默失败

如果⼤量的请求需要等到超时或者⻓时间处理后才宣告失败,很容易由于某个远程服务的请求堆积⽽消耗⼤量的线程、内存、⽹络等资,进⽽ 影响到整个系统的稳定。⾯对这种情况,⼀种合理的失败策略是当请求 失败后,就默认服务提供者⼀定时间内⽆法再对外提供服务,不再向它 分配请求流量,将错误隔离开来,避免对系统其他部分产⽣影响,此即 为沉默失败策略。

image-20221117220836761

7.四种方案对比

image-20221117220853946

转载请注明:西门飞冰的博客 » 接口调用出错了怎么办?

喜欢 (1)or分享 (0)