首页 > 其他分享 >仅仅是调用第三方接口那么简单吗?

仅仅是调用第三方接口那么简单吗?

时间:2023-05-28 22:11:47浏览次数:27  
标签:调用 接口 重试 失败 MQ 第三方

最近有个项目需要本地处理之后,然后调用第三方接口,本来开始觉得很简单得事情,不就是调用第三方接口吗?但是却一波三折。

初版

首先有了下面的第一版的设计。

这个设计很简单,也是最容易想到的。主要有下面几步

1、本地处理;

2、调用第三方接口;

3、本地日志打印,包括是否调用成功及失败原因等;

看似很简单的过程,却在线上出了问题,我们说看一个功能是否稳定,不是看99.9%的正常,而是看0.01%的失败。没错,线上报错了,问题出现在调用第三方接口的时候由于网络问题,超时了,真尴尬,

分析这个方案有以下几个不足,

1、没有重试功能;

2、调用接口记录未持久化;

为此在第一版的基础上做了修改;

优化版本

优化版本考虑了上面的两个不足之处,对调用第三方接口进行了重试,且把调用记录写进本地表;

改进方案有几个需要注意的地方,

1、重试,由于是第一次调用失败便要重试,要注意重试的次数,可以在系统中设计一个最大重试次数(比如5次),超过最大重试次数不再重试,每次的重试可以有一定的间隔,可以采用当前线程睡眠的方式,睡眠的时间可以随着重试次数增大二增加;

2、记录调用日志,这里调用日志记录在mysql中,mysql的表结构可参考,

另外,由于包含重试,对于调用日志的话,考虑是否要区分重试日志;还有一点就是是否需要一个最终的调用结果。

改进版上线后,返现确实线上调用第三方接口失败的情况很少了,但是还是存在失败的情况,由于已经把调用记录保存在了mysql中,为此针对重试仍然失败的情况可以单启一个定时任务,

好了,有了定时任务,针对调用失败的情况可以进行再次执行,那么成功的几率就很高了,换而言之失败的情况很少了。

如果还是有失败的情况,那么应该从调用方式、第三方接口是否正常等方面去排查,程序方面很难有所改进了。

其实针对重试这块还可以直接使用定时,这种情况对于实时性要求不高的情况完全可以,也就是下面的样子,

这就是直接定时扫描调用记录表,定时执行。不过,仍然会出现一直失败的情况,那就陷入死循环了,可以针对扫描范围作一个限制,比如最近7天的记录,超过这个时间即使失败也不会再执行定时重调了。

除了在程序中作重试外还有其他方案吗?

最优版本吗

日常的开发中肯定都用过MQ,用来生产及消费消息,那么这里的重试便可以使用MQ,把第一次调用第三方接口失败作为消息投递到MQ,再重启另外的服务去消费MQ,在消费者中进行重试。

这种方案适合调用第三方接口较多,而且对主程序性能要求较高的情况,把重试从主程序中分离开,可以避免重试成为影响程序性能的瓶颈。

这个方案的优点是将重试和主程序分割开来,起到了解耦的作用。可能有不少会问消费MQ如果第一次执行失败怎么办,MQ已经考虑到这个问题了,MQ可以重发,感兴趣的小伙伴可以了解下哦。

 

总结,通过上边的几种方案,可以看到调用第三方接口看似简单,其实内含玄机。到底采用哪种方案要根据实际情况而定,不要因为想使用什么技术而去采取相应的方案,只有适合的才是最好的。可以从下面几个方面考虑,

1、系统性能;

2、实时性;

3、系统调用量;

好了,读到这里的小伙伴,不知道对于调用第三方接口,有没有其他的想法,欢迎交流哦。

标签:调用,接口,重试,失败,MQ,第三方
From: https://www.cnblogs.com/teach/p/17438746.html

相关文章

  • Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询
     一、引言MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么今天说说MP怎么自定义sql语句吧。 二、具体实现使用注解实现:在我们Mapper接口中定义自定义方法即可。/***@Date:2019/6/1014:40*@Description</span>:User对象持久层*/p......
  • 通过this(...)调用兄弟构造器的作用
    packagecom.Demo1;publicclassTest{publicstaticvoidmain(String[]args){//掌握在类的构造器中,通过this(...)调用兄弟构造器的作用Students1=newStudent("李四",26,"家里蹲大学");//如果学生没有学校,那么学校默认就是黑马程序员......
  • 转载-如何结合FT2232HL/CMSIS-DAP+Eclipse+OpenOCD软硬件工具使用SWD调试接口在Window
    原文链接:https://blog.csdn.net/zhuwade/article/details/121944736由于我们公司自己需要开发烧录工具,本人通过google搜相关文档和看ARM公司的技术文档,终于实现了这个功能。因为涉及的内容知识点比较多,对于玩嵌入式MCU的小白来说要普及的知识,逐个介绍篇幅会比较长,本文中只介绍......
  • httprunner4.x学习6 - 两种方式处理接口关联
    第一种方式:使用export导出变量,变成全局变量当登录用例写完后,后面想继续写其他用例,可以导入前面的login用例,当成下个用例的步骤使用导入前一个用例之前,需先export导出变量,变成全局变量。登陆用例:创建文件夹login,在文件夹下分别创建两个文件login.yml和useinfo.ymllogin.yml......
  • Python+Requests零基础系统掌握接口自动化测试
    Python+Requests零基础系统掌握接口自动化测试download:3wzxit666com设计高性能的售票系统在当今数字化时代,一个高性能的售票系统对于任何企业或机构来说都是至关重要的。无论该系统服务于电影院、剧院、运输公司还是其他类型的场所,它必须始终可靠、快速和易于使用。以下是几个要......
  • 同步程序中调用异步的方法
    我们平时碰到很多,同步的主程序中需要用到一些工具类是异步的,这样主程序还不能加上异步的task等标识,就会报错.而直接调用似乎又等不到返回结果.将调用包装在Task.Run<>(async()=>awaitFunctionAsync());实际winform项目内参考的下边的例子作为备忘publicclassLo......
  • 预置第三方apk( 可卸载)
    修改文档:vimdevice/mediateksample/k61v1_64_bsp/device.mk添加属性值:PRODUCT_PACKAGES+=   新建mk文档;内置apk时,  Android.mk基本内容:+LOCAL_PATH:=$(callmy-dir)+include$(CLEAR_VARS)+LOCAL_MODULE:=BaiDu+LOCAL_MODULE_CLASS:=APPS+LOCAL_MODUL......
  • API接口对电商平台有怎样的帮助?如何获取API接口?
    ​ API(ApplicationProgrammingInterface)接口对电商平台有很多帮助,下面列举几点:1.提高效率API接口可以让电商平台的不同模块之间进行快速的数据交互,帮助平台实现更高效的业务处理。比如,在订单管理和支付等方面,API接口可以让卖家直接与快递公司和支付渠道进行对接,从而提......
  • drf——全局处理异常、接口文档、jwt介绍、based64编码与解码
    全局异常处理原理#对于前端来讲,后端即便报错,也要返回统一的格式,前端便于处理{code:999,msg:'系统异常,请联系系统管理员'}#只要三大认证,视图类的方法出了异常,都会执行一个函数: rest_framework.viewsimportexception_handler#drf只要出了异常就会执行这是drf的配置文件......
  • 我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)
    好家伙,天天拖,终于写完了 代码已开源(Gitee)PH-planewar:个人开发的全栈小游戏前端:vue2+element-ui后端:Springboot+mybatis-plus数据库:mysql目前实现功能:1.注册登陆2.游戏数据保存3.游戏运行(gitee.com)(前后端放一起了)怎么说呢,感觉比较简洁,但是问题......