接入第三方接口的设计
更新记录:
- 2016年02月26日 加入对于 接口错误返回的处理。
今天遇到一个错误。这个接口在正确时,返回的结果节点里有子xml,通过CDATA的。错误的时候不会返回,程序就出错了。其实我在接入好几个接口时完全没考虑到错误情况,大大的不应该啊。 2016年02月26日 接口的测试账号一般有使用次数限制,不要当成正式的用。
产品需要跑一个数据。我就直接在开发环境跑了,结果跑了一点接口就报错:查询数量已达到上限。这导致开发环境以后无法测试了。。。如果没有什么问题的话,最好把开发机的IP也加入第三方接口的生产环境。这样跑数据什么的就不用上线执行了。
- 2016年02月26日 如果接口提供方有IP白名单的限制,一般还会同时限制白名单IP个数,一般是10个这样。
这种情况,就需要特殊的机子专门复杂与接口交互,其他的机子调用这个机子。
最近接入了几个第三方接口。现在总结一下。
概述
接入接口,最重要的是稳定性。而接入接口的这个系统,和其他的普通系统不一样,是由两个部分决定的。一个是接口的稳定性,一个是接入系统的稳定性。
接入系统是我们自己写的,是可控的,所以稳定性是可以不断优化的。而第三方接口的稳定性,我们很难干预,如果在投入使用后发现第三方接口的稳定性不达标,是很难补救的。原因有几点,第一,我们使用第三方提供的接口,接口对我们来说是个黑盒,所以如果出了问题,我们是不明白其中的原理的,如果是偶发的问题,在与第三方交涉上,会更加麻烦。第二,如果第三方的技术实力有限导致了接口不稳定,这就不是几句话能解决的问题了。一旦你陷入了不稳定接口的坑里,代价是非常大的,因为在不稳定系统上建立稳定系统是非常非常困难的。如果最后选择了换一个接口,那么付出的时间成本和人力成本也是非常浪费的。
所以在接口接入的调试期,必须调研清楚,多和接口提供方的对接人员沟通。以下几点你需要搞明白:
1.接口是异步的还是同步的?
这一点对于系统的设计影响非常大,同步的接口在一个请求内就会返回结果,简单直接。而异步接口,第一次请求发送参数,第三方一般会返回一个请求识别码。过一段时间后,我们再用识别码去请求结果。对于一些接口,并不保证获取结果时,结果已经可用,那有可能还得继续请求。期间识别码还可能失效,总之各种复杂。
2.如果接口是同步的,调用耗时大致是多少?
接口的耗时直接影响了你的系统的响应时间。所以一般需要测试一下接口的耗时,是否使用,看的是你对于系统的要求了。对于响应时间超过10秒的接口你一定要注意。如果你在脚本中调用这个接口或许还好,但是如果你在用户的请求中调用改接口,就会导致页面长时间等待,甚至超时。
3.接口的调用次数有什么限制?
许多接口,尤其是免费接口,有每天调用次数限制。对于有限制的接口,需要在代码里准好准备。
设计
同步接口的设计:
对接程序
是对接口的最直接包装,函数与接口一一对应。
而外部系统只能调用对外封装
,对外封装结合了现在系统的特点,针对业务定制。
异步接口设计:
相较于同步复杂很多。大体上可以分为两步。
第一步,调用接口登记参数,在数据库中记录返回的中间结果。
第二步,调用获取结果结果,在数据库中更新结果,同时如果业务需要的话,调用callback
继续第一步中中断的业务。
数据库设计
1 | create table xxx_api( |
该数据库设计上,在记录参数和结果时,记录的是完整的原始请求参数和原始返回结果。
我在接入第一个接口时,设计的接口不是这样的,我是把接口中的信息提取出来,每个作为一个字段。因为我觉得我们需要的就是这些信息,作为字段,看起来方便查起来方便用起来方便。但是后来我就发现,这种设计,出问题就不方便啦。。。因为因为对方一般会说:把接口的放回结果发给我们看一下。然后我就懵逼了。。。
注意
日志
一定要多打日志,每一步主要逻辑都要打日志。数据库里的信息也记得全一点。因为一旦涉及接口调用的系统出了问题,需要排除是我方问题还是他方问题,如果他方问题,也得收集详细信息供他们调试。
坚决拒绝爬虫式接口
我曾经接入过一种爬虫式接口,是查询x保的。一开始,这种接口的文档看起来和正常的同步接口无异,只是有点麻烦,需要先获取特定城市页面输入格式,页面验证码,然后提交输入,获取结果。
后面才意识到,这家公司其实根本没有x保的信息,他们是写了全国各个城市网站的爬虫,首先他们获取页面输入,返回给我们,然后我们输入信息后(包括验证码),他再模拟登录,爬取下一个页面。
这种恶魔般的接口会带来非常多的问题。第一,接口的流程变长了,需要调用4个接口(获取城市,获取城市输入,获取验证码,获取结果)才能获取结果。而且这4个接口的调用是必须在那个爬虫的生命周期里的。流程变长,本身就会带来很多不稳定因素。加上必须是在一个爬虫生命周期里的,那么意味着对方不能同时接口很多的查询。(我是在开发中才发现,对方其实同时只能8个查询在进行。。。)。第二,因为结果是对方爬虫现爬的,速度没有保障,和读取数据库是有好几个数量级的差别的。我接入的那个结果,获取结果需要近20s。这个直接导致了用户页面的超时。第三,爬虫不稳定性很高。所以经常会得到各种莫名其妙的错误。实在是没精力帮对方测试啊。。
这个结果我折腾了两周都没有稳定下来(一般同步接口需要3天)。算是一个血的教训。
总结
- 测试期,调研清楚,不靠谱的接口,和PM反馈
- 开发期,注意打日志,数据库记录原始信息
这些是我一些浅薄的总结,有问题直说啊。