2017-02-08 3 views
0

클라이언트 측 API 호출에 속도 제한을 구현하려고합니다. 15 분마다 동일한 api (10 reqs/초로 제한)를 사용하는 약 20 개의 Symfony2 명령이 있으므로 RabbitMQ를 사용해야하므로 내 프로세스가 메모리가 부족하거나 다음 프로세스가 올바르게 실행되지 않습니다.Symfony2, RabbitMQ 및 Redis 스로틀

api 호출은 명령과 RabbitMQ 작업자에서 실행되므로 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; 

    } 

레디 스의 설정과 같습니다

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

그냥 INCRBY 레디 스 명령 (https://redis.io/commands/incrby)를 사용합니다. 이 같은 한도로이 값을 비교할 수있는 코드에 있도록 명령의 응답은 증가 후 값이됩니다 :

그것은 많은 동시 요청과 함께 작동합니다
$counter = $redis->increment($key); 
if ($counter > $limit) { 
    //deny logic here 
} 

때문에 레디 스의 단일 스레드 원자 특성으로 처리되고 따라서 $ 제한 요청은 처리되지 않습니다.