Symfony2,RabbitMQ和Redis限制

时间:2017-02-08 15:56:04

标签: symfony redis rabbitmq throttling

我正在尝试在客户端api调用上实现速率限制。由于大约有20个Symfony2命令每15分钟使用相同的api(限制为10 reqs / sec),我需要使用RabbitMQ,因此我的进程不会耗尽内存或阻止下一个正常执行。

由于api调用是在命令和RabbitMQ worker中执行的,我还需要在RabbitMQ中限制它们。我知道工人不应该在我的情况下做那种工作,但我没有时间重构整个事情。

那么,是否可以限制我的RabbitMQ工作程序中所有这些命令的常用方法?我正在尝试使用https://github.com/jaytaph/RateLimitBundlehttps://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

1 个答案:

答案 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的请求。

相关问题