关于调用外部接口的注意事项

拭目以待 发布于

背景:

当公司业务扩大至一定规模后,会对外提部分业务接口,借用外部力量来完善自身业务,由此产生一些强依赖这些外部接口模式的公司。而这些公司的程序员将要在开发中受限于接口来源公司。

我从14年开始做facebook广告投放系统正是这样一种模式,虽然只是做前端工作,但是由接口调用失败导致的一些问题,回想起来依旧是刻骨铭心。

类似拥有大业务的公司,在开放对外接口的同时,又不得不防止接口被恶意调用。因此衍生出一些防止恶意调用的机制,这些机制会对调用接口的系统进行一定的限制,如果没有把对应的外部接口调用模式搞清楚就盲目的进行系统开发,并且真的撞上了如同facebook这种大爷级别的外部接口来源公司,所付出的代价将是惨重的。我们曾经由于沟通障碍、API文档简陋,导致长时间耗费人力去试错,且通过技术手段规避后的产出差强人意。


以facebook为例:

下面就以facebook对外接口调用的一些限制为例。各大开放平台或多或少都会有些类似的情况,举一反三吧。

注:时间已过去许久,鉴于facebook接口文档的易变性。为了不误导,下面所使用的具体数字都是打比方,不为具体数值,只谈模式。

facebook首先会根据你使用的账号所在的账号池来决定你每分钟所能调用接口的次数,高级的账号现在已经不能直接获取了。如今获取高级账号的方式分为两种:一种是通过长年累月良好的调用记录,另外一种就只能是一笔大数目的美刀了。高级别的账号,虽然说同样会受到次数限制,但是会宽松的多。通过申请所能拿到的普通账号属于base账号,以下就拿普通的账号来说事。再次声明,以下使用数字不为具体数值,只为说模式。

比方说,一个普通账号每分钟只能调用100次,而这100次并不是说,你前10秒就可以调用100次,而真的是一分钟能调100次,因为除过分种的限制,还会有30秒级的,10秒级的爆发式限制。所谓的每分钟调100次,并不是你所想像的样子,平台所允许的爆发式调用也会受到10秒限制的。比方说限制10秒只能调50次,而你却在前10秒调用了60次,虽然你这一分钟不会再有其它调用,但是你前10秒调用超过了爆发式限制,依旧会压到facebook的火线,从而导致调用接口失败。而且这并不是全部,这些调用错误会被记录下来,你的账号会如同有过犯罪前科一样烙上印记,而我上面所说过的升级账号将会受到这些印记的影响。另外提醒一下:如果过于频繁的触压火线,就不仅仅只是升级受影响了,连你现在所处的账号池可能都会被调整。


如何解决:

1、首先筛选合并一些请求,把能省的调用都省下,把那紧巴巴的几个数值留给真正有用的接口。这一步所说的基本上大家都会这么去做。

2、其次就是获取每分钟所能调用的峰值,这个facebook文档中是有的,其它的平台是否有,需要去查阅文档。也可以通过其它方式获取:邮件、电话或者是公关。

3、接下来是获取爆发式的峰值,这个facebook的文档是处于呵呵状态的,且沟通结果是“请参考文档”。我上面所举例子中的那些比方数值背后所对应的都是一行行的试错代码和程序员的心酸。至于像淘宝这些公开平台是否会提供这些这些爆发算法需要使用者具体考证。

4、最后,一旦这些数值到了程序员手中,就再没有什么了。每分种允许100次,那就设置个队列,每一分只调用100次,多的排队。而爆发式算法,是在队列的基础上去检查,最近1分钟和10秒内是否存在接口调用,如果没有,则调用爆发所允许峰值的请求数。


为了不误导,再次声明:上述篇幅只讲模式,具体数值需要具体对待。各位,珍重!