API 访问频率控制
友好速搭的开放 API,对访问总次数,并没限制。限制的是访问频率,并且是以 access token 为单位。参考访问频率限制。
当在开发对接开放 API 的应用时,需要在应用中,控制好访问 API 的频率。
私有应用的频率控制
对私有应用,由于只有一个 access token,可以直接 sleep 来控制频率。如果使用多线程操作,需要通过 lock 控制好线程之间的同步。当应用是分布式部署时,那就需要分布式锁,来同步不同进程的访问频率。
简单的分布式锁,可使用 Redis 的 SETNX 命令实现。可以用 token 作为 Redis 的 key,使用 SETNX 赋值后,如果成功,返回整型 1,说明获取锁成功,可以访问 API,访问结束后,进行 sleep,然后删除 key,来释放锁。返回整型 0,获取锁失败,无法访问 API。
开放应用的频率控制
对开放应用,应用安装到不同网站,会生成不同的 access token。此时,建议采用外部存储,来记录不同 token 的频率,进而实现频率控制。例如,可以使用 Redis 的 Hash 结构,将 token 作为 Redis key,对应 Hash 值中,存储两个字段:
- count,初始值为 0,访问 API 后,置为 Response Header 中
X-YHSD-SHOP-API-CALL-LIMIT
的访问次数 - time,上次访问 API 的时间
在应用中,访问 API 前,应执行如下操作(伪代码):
limit_hash = redis_get(token)
seconds = time.now - limit_hash['time']
used = limit_hash['count']
# API 中的漏出频率,每秒 2 个
leaked = seconds * 2
# 可访问次数
spared = used - leaked
if spared < 40
# 可以执行 API 访问
else
# 需要等待后才可反问
end