工作中涉及一些对外开放的无需特殊权限的API,用户会因为某些需求而通过程序来频繁访问这些API,导致系统的负载陡增,可能影响系统其它功能的正常使用。虽然做了一些优化让这种API尽可能地轻量,但仍然不够,因此需要进行访问频率的限制。
由于这样的API并不多,所以我们并没有在Nginx这样的反向代理接入层中实现频率限制,而是API自己去实现,而且实现方案比较粗糙 - 基于Memcached的缓存自动过期特性。
方案的PHP示例实现如下所示:
// 每个IP一分钟10次
$limit = 10;
$cache = new Memcached();
$cache->addServer('127.0.0.1', 11211);
$key = __FUNCTION__.$_SERVER['REMOTE_ADDR'];
$requestNum = $cache->get($key);
if ($requestNum !== FALSE && $requestNum > 10) {
echo json_encode(array(
'code' => 403,
'message' => '请求太频繁,请一分钟后再试',
));
return;
}
$cache->add …