08|调用第三方:下游的接口不稳定性能又差怎么办?
前置知识
- 深入了解
- 翻译
- 解释
- 总结
在微服务架构中调用第三方接口的可用性对系统稳定性至关重要。本文提出了一致性抽象、客户端治理、可观测性支持和测试支持等策略来保证第三方接口的可用性。通过屏蔽不同第三方平台 API 的差异、限流和重试、监控和告警以及提供mock服务等措施,有助于提高系统与第三方接口的高可用性。此外,文章还提供了面试准备中的重要策略,包括同步转异步、自动替换第三方和压测支持等亮点方案。这些内容为读者提供了全面的技术指导,帮助他们更好地理解和应对微服务架构中调用第三方接口的挑战。文章内容丰富,涵盖了技术实践和面试准备,对于从事微服务架构开发和面试准备的读者具有重要参考价值。
《后端工程师的高阶面经》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 我好像一点都不像程序员看文章的内容,让我想到我们部门负责的短信服务,它就需要接入多个短信供应商,并且保证高可用,因此它做了接口的抽象,一个发短信的接口可以支持指定供应商,不指定则根据系统设置的权重加上触达率以及价格成本选择最合适当前业务的供应商进行发送,如果某个供应商一直不可用,检测到也会暂时下线它,又由于公司的营销业务经常需要发大量的短信,因此我们又实现了批量定时短信能力,服务自己本身也实现了限流,重试,同时为了节约成本配合业务组压测,增加一个调试模式,此模式不会真正发送短信,也做了很多的数据面板可以分析哪个供应商的性价比最高,错误率多少,错误分类占比等,然后回答下第一个问题,公司用到的第三方服务都是比较成熟的产品,所以极少出现问题,如果出问题了,那么数据补偿或者业务补偿机制可以搞一下,如果第三方可以替换,比如短信提供商,那就要支持重试后自动替换,当然,为了安抚客户,最好是用比较友好的报错提示,不要直接报服务端的错误给到用户。
作者回复: 大佬!你们公司这个方面算是做得非常仔细了,比很多大厂做得还要仔细了。监控这部分,我是没想到还可以分析性价比,学到了!
2023-07-03归属地:广东314 - penbox1. 你们公司有没有出现什么第三方服务不可用引发的故障?后面有没有设计什么改进方案? 一个手机短信验证码登录的功能,遇到过因为短信服务商故障,导致系统有一个小时不能通过短信验证码登录。后续的改进方案就是引入另外一家短信服务商,并加入切换机制。 2. 你的工作经历中有没有什么内容是提高同事研发效率的?如果有,你是怎么向面试官介绍这个项目并让他相信确实提高了研发效率? 做过一个流程引擎的功能。 在企业软件开发中,流程审批是一个很常见的功能,流程也经常需要根据甲方要求做调整。在引入流程引擎前,都是靠代码来实现流程的流转,代码中充斥着条件判断,混杂了业务逻辑和流程处理逻辑,很难看懂也很难进行流程调整。 后来我引入了一套流程引擎,把流程和业务完全剥离开,代码变得更清爽,流程调整也变容易了。
作者回复: 1. 这边如果你要去面试的话,就要搞清楚切换机制的细节,比如什么时候触发切换,会不会换回来,如果都失败了怎么办?有没有可能切换本身就失败了?是人手工切换还是自动切换? 2. 这其实就是我说的很难说清楚研发效率。从你的描述里面,我能够感觉到应该是有提高的,但是就不清楚你究竟做到了什么地步。举个例子,就是同样的系统,你是做到了页面拖拉拽就生成一个新流程,还是说要写一大堆配置?还是说需要提供新接口实现。也就是难以证明我究竟提高了多少。因此你这一段话比较欠缺说服力。
2023-07-06归属地:四川4 - Geek_8755c4那该如何做呢?如何实现这个过程呢?理论上讨论起来似乎很简单,但是怎么落地执行呀。比如:压测支持,该如何落地执行。
作者回复: 没你想的那么难。压测这个就很难,因为第三方一般不会配合你做压测。你就可以用一个 Mock 服务来替换第三方,然后只测试自己这一部分。
2023-12-16归属地:北京 - Geek_8755c4这个需要怎么做:如何做好监控呢?
作者回复: 日志 + prometheus + tracing,然后在类似 grafana 之类的框架里面配置好告警,
2023-12-16归属地:北京 - Geek_6806321.调用第三方的路由是通过配置规则来确定的,第三方不可用导致出现失败订单,通过故障自动切换来解决这个问题;2.提供统一抽象接口,封装基础组件。
作者回复: 赞! 2. 这个地方证据还是比较薄弱的,或者说你只说了自己做了什么,但是面试官看不出来效果。
2023-10-17归属地:浙江 - lllweiz现在做的项目就是遇到了调用第三方导致的诸多问题,这篇文章让我恨恨地学习了,感谢大明
作者回复: 赶紧刷 KPI !
2023-08-12归属地:广东 - 码小呆有一个疑问,短信自动切换是如何实现的,难道是定义了多套代码,然后判断第一个出现错误,然后就请求其他短信发送接口?
作者回复: 不是,是换实现。 你可以理解为你有一个抽象地发送短信的接口,而后针对不同服务商有不同的实现。 那么在实现层面上,比较简单的就是你用一个数组装着所有的实现,然后当一个调不通,你判定已经寄了的时候,就挪一下数组下标,用下一个实现。
2023-07-04归属地:广东4 - 3.0的A71、之前公司,有个同事操作不规范,查询把 公司阿里云的 redis 搞挂了,结果一连串服务都用不了了。改进方案是,打开了阿里云 redis 后台的一些个检测规则😵💫,其实正常是应该代码 review 的,这样就可以发现。还有现在公司,经常有个服务一发版,就导致别的服务不可用了,咱也不知道为啥。 2、这个主要是写了写公共组件、平台给同事用。 我主要是写了一个日至组件,通过该组件日志可以输出到指定位置,然后通过 filebeat kafka es 进行收集展示,用户还可以进行设置指定级别的日志告警,保证业务出错第一时间发现。 还写了一个平台,吧啦吧啦
作者回复: 1. 是的,正常来说,应该是走变更流程,代码 review,能避免很多问题。不过之前我们出现过的大对象,那就真的是没有预料到,因为从代码上是看不出来这里会有大对象,然后寄了。 2. 你这里如果出去面试还是可以深入讨论你的平台是怎么设计的,
2023-07-03归属地:北京2 - peter请教老师几个问题: Q1:第一个图的“回调”是指什么? 是本系统收到响应后调用自身的某个函数吗?回调的箭头是从第三方指向自身系统,难道是指第三方调用本系统的某个函数? Q2:怎么知道第三方是接口幂等的? Q3:公司会同时使用Prometheus和Skywalking吗?感觉都是监控的啊,用一个不就可以嘛。两个都用会重复吗? Q4:异步处理,会有超时时间吗?
作者回复: 1. 打个比方,正常的调用方向是 A 调用 B,那么回到就是 B 反过来调用 A。比如说,A 调用了 B 之后,B 没有立刻给出响应,而是过了一段时间之后,B 再调用 A 的一个接口告诉了 A 响应。在微信平台里面,你支付成功之后,微信会回调你的接口,告诉你结果。 2. 这个你询问第三方接口就可以,一般他们都需要告诉你的。你也可以在研发阶段试试同一个请求过去会发生什么。 3. 有些公司会一起使用。它们的侧重点不同,正常来说,一家公司里面 metrics 类的监控和 tracing 类的监控就是两个工具。从采集的数据上来说,它们会有一部分重复,但是问题并不大。 4. 异步处理也可以有超时,比如说 A 调用 B,B 说一小时以内给你处理完,一小时没处理完,那么 B 就要告诉 A 超时了。异步超时一般是走回调通知机制。
2023-07-03归属地:北京2