如何控制调用其它平台 API 的频率?

背景

  • 本平台调用第三方平台接口,部分接口需要保存数据至本平台数据库
  • 第三方接口有调用频率限制(可申请提升频率上限,但治标不治本)
  • 本平台使用 Swoole 协程请求接口,这是一个定时任务

例子

第三方平台接口 report/get,频率:50/分 AND 10000/天

<?php
// Task.php
go(function() {
    // 调用第三方接口 获取数据 并做相关业务处理
    // 略略略。。。
});

执行任务

$ php run task

问题

如何在不超频下进行任务?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
Epona

自己定义一个全局的缓存存储对应的频率应该就可以吧。大于指定值就停止调用接口

4年前 评论
cnguu

@Epona 假设使用 APC 缓存,定时任务可以获取到缓存?

4年前 评论
Shuyi

Laravel的话,可以在路由上放个中间器, 这个trottle限制为 每1分钟60次

Route::prefix("/api/")
   ->middleware("trottle:60,1")
   ->group(function() {
           Route::get("/") ....
           .........
        });
4年前 评论
cnguu

@Shuyi 一个任务中有多个协程,现在有多个任务,请问如何控制频率?

4年前 评论
巴啦啦

我只能从三个方面入手。1,在一定的时间内,控制任务个数,并控制每个任务协程个数。2,使用多个 token 突破第三方平台单个账号频率限制。3,缓存记录调用次数,超过则停止。这三者结合下呗。

4年前 评论
Shuyi

@cnguu trottle只按照你的session或者IP来算,你请求次数超过多少就把你断掉……跟多少个任务无关

4年前 评论
cnguu

@Shuyi 现在我使用的是定时任务去请求

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!