Facebook Api Exception:(#17) User request limit reached
当使用facebook Marketing API 出现 Exception:(#17) User request limit reached 时的思路处理
1,去官网查看Exception:(#17) User request limit reached原因:
API Level Rate Limiting
- Rate limiting is at the ad account level.
- Rate limitation happens real time on a sliding window.
- Each Marketing API call is assigned a score. Your score is the sum of your API calls.
- Updates are 10~100 more expensive than creates.
- There’s a max score, and when it’s is reached, the throttling error is thrown.
- Error, Code: 17, Message: User request limit reached
Recommendations:
- Verify the error code (17) and api end point to confirm the throttling type.
- The call will be blocked for a minute.
- During this time the max score will decay, being dropped to 0 after a maximum of 5 minutes.
- Switch to the other ad accounts and come back to this account later.
- It is better to create a new ad than to change the existing ones.
刚开始没细看,以为是ip受限,但各种尝试后不得不来啃这些英文;
受限原因是每个广告账号有一个初始分数,每次访问api接口都会减去一定分数,当我们要获取广告账号下的数据而轮训接口时很快就会受限;
我以我这边数据场景说下优化:
开发语言:php + crontab
广告账号:12个
轮训数据要求:每小时轮训一次,获取详细消费数据(AD账户、广告系列、广告组、广告)、今天的数据、昨天的数据、最后7天的数据、最后14天的数据;
为什么需要这么多数据,使用这些数据进行比对,然后根据规则调整广告组的预算或终止广告;
我使用db做了一个任务表(x_cron),主要字段如下:
Field | Type | Comment |
id | int(11) NOT NULL | |
path | varchar(100) NULL | 接口路径 |
ac_id | varchar(50) NULL | ad账号id |
param | varchar(255) NULL | POST/GET数据 |
method | varchar(10) NULL | POST/GET |
header | varchar(255) NULL | 请求 header |
status | tinyint(1) NULL | 状态 -1失败,0新的,2已执行 |
retry | tinyint(1) NULL | 重试次数 |
addtime | int(10) NULL | 添加时间 |
runtime | int(10) NULL | 运行时间 |
message | varchar(5000) NULL | 错误信息 |
crontime | int(10) NULL | 定时任务 |
hash | char(32) NULL | 避免重复添加任务,md5(path+param) |
priority | tinyint(1) NULL | 优先级 |
优化前:crontab 每4秒执行一次一条任务,任务积累严重,无法保证任务执行
优化后: crontab 每15秒执行一次30条任务,任务25分钟左右全部执行完成,受限的任务将持续执行10次
优化思路:
区分白天任务和夜间任务:
白天(8:00-20:00)只拉取今日数据,并创建傍晚定时任务(昨天、7day,14day);
傍晚(24:00-6:00)执行夜间任务;
受限后的策略,记录受限的ac_id,5分钟之内不再执行此ac_id的任务(官方说5分钟会回复账户分数,建议切换其它ad账户)
尝试次数,任务每执行一次,retry字段+1,执行结果出错就将 priority(优先级)-1,获取任务时按优先级排序,可以保证不被任务卡住;
尝试10次后,依然错误,将status置为-1,不再执行;
上线项目 Marketing Advertising Budget Rules