【发布时间】:2017-02-14 00:30:09
【问题描述】:
我正在尝试对我的客户端 api 调用实施速率限制。由于每 15 分钟大约有 20 个 Symfony2 命令使用相同的 api(限制为 10 个请求/秒),因此我需要使用 RabbitMQ,因此我的进程不会耗尽内存或阻止下一个进程正确执行。
由于 api 调用是在命令和 RabbitMQ 工作人员中执行的,我也需要在 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
【问题讨论】:
标签: symfony redis rabbitmq throttling