我正在尝试在客户端api调用上实现速率限制。由于大约有20个Symfony2命令每15分钟使用相同的api(限制为10 reqs / sec),我需要使用RabbitMQ,因此我的进程不会耗尽内存或阻止下一个正常执行。
由于api调用是在命令和RabbitMQ worker中执行的,我还需要在RabbitMQ中限制它们。我知道工人不应该在我的情况下做那种工作,但我没有时间重构整个事情。
那么,是否可以限制我的RabbitMQ工作程序中所有这些命令的常用方法?我正在尝试使用https://github.com/jaytaph/RateLimitBundle和https://github.com/snc/SncRedisBundle(在我的系统上安装并运行了predis库和Redis),但我有点陷入困境。
当速率限制接近最大值时,我该如何处理?我需要一个事件监听器吗?我是否必须检查Redis的速率限制以及它是否接近限制?
我的方法看起来像这样
/**
* @RateLimit(limit=10, period=60)
*/
protected function apiRequest($query)
{
$url = $this->getApiUrl().$query.$this->getUsernameAndApiKey();
echo $url. "\r\n";
$xml = $this->getWithCurl($url);
$xml = simplexml_load_string($xml);
// if ($xml === false) {
// $this->slack->sendMessage($this->getError($url));
// }
if($xml)
return $xml;
}
Redis配置:
snc_redis:
clients:
default:
type: predis
alias: default
dsn: redis://localhost
速率限制配置:
noxlogic_rate_limit:
enabled: true
storage_engine: "redis"
redis_client: default
rate_response_code: 429
rate_response_exception: Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
display_headers: true
headers:
limit: X-RateLimit-Limit
remaining: X-RateLimit-Remaining
reset: X-RateLimit-Reset
答案 0 :(得分:1)
只需使用$Research = Researches::find($request->id);
$Research->Member->all();
foreach ($Research->member as $id){
$id->pivot->member_id = $new_id ;
$id->pivot->save();
}
Redis命令(https://redis.io/commands/incrby)。该命令的响应将在增量后为值,因此在代码中您可以将此值与您的限制进行比较,如下所示:
INCRBY
由于Redis的单线程原子性质,它将处理许多同时处理的请求,因此不会处理超过$ limit的请求。