我的网站有一个脚本,当用户访问特定页面时,该脚本将调用外部API。
访问页面并以xml格式返回响应时,将发出API请求。
我正在使用通常的卷曲请求。
现在,由于API方面的新实现,如果API收到过多的请求,它将抛出异常并拒绝该请求。
我想将我的网站对API的调用总数限制为每秒仅8次。
我该如何实现?有人建议我排队请求,但我以前从未做过这样的事情,而且我很难找到解决方案。
对不起,如果我的英语有错误。任何帮助表示赞赏。
例如:如果100个用户同时全部访问了该网页,则我需要将这些API请求每秒8个之后排队8个,依此类推,直到全部完成。
答案 0 :(得分:0)
{{1}}
对于每个API调用:
-在变量中记录当前时间(仅秒)。
-进行API调用。
-增加通话计数器。
-再次检查当前秒数是否等于先前存储的值,以及您的呼叫计数器是否小于8。如果您的呼叫计数器小于8,则可以拨打另一个电话。
答案 1 :(得分:0)
我建议您使用一个api生成来创建令牌并在每个请求上匹配令牌,并在一段时间后过期或删除令牌。因此可以解决您的多个请求问题。
答案 2 :(得分:0)
您可以将API请求延迟几微秒,这是示例代码
usleep(1250000);//1 sec = 10,000,00 ms
function _callAPI(){
// Your code here
}
当用户访问您的网站时,请求将在几微秒后触发,这样您就可以延迟请求。
您还可以在针对API触发请求并根据上一个请求处理下一个请求时维护日志。
答案 3 :(得分:0)
每秒8个呼叫的值较低,因此可以将每次尝试的呼叫保存在数据库中,并每次计算最近5秒的呼叫次数。
对于较大的值,通常在nosql数据库中使用计数器,例如Cassandra或Aerospike。 也就是说,对于每个请求,您都会获得当前时间,并增加计数器名称“ counter” + second,直到获得所需的限制。
如果负载非常高(1000+ cps),Aerospike最适合此操作,它提供了非常低的延迟。 Cassandra使用起来更简单,并且需要更少的内存。
减少了甚至更少的内存。