본문으로 건너뛰기

속도 제한

Queuety는 외부 API나 기타 제약된 리소스의 과부하를 방지하기 위해 핸들러별 속도 제한을 지원합니다. 핸들러가 한도에 도달하면 작업자는 해당 작업을 대기 상태로 두고 기간 내 여유가 생기면 다시 가져옵니다.

속도 제한 설정

작업을 디스패치할 때 속도 제한을 적용합니다.

PHP
use Queuety\Queuety;

Queuety::dispatch( 'call_openai', $payload )
    ->rate_limit( 10, 60 ); // max 10 executions per 60 seconds

두 인수는 다음과 같습니다.

  1. $max - 기간 내 허용되는 최대 실행 횟수
  2. $window - 기간(초)

디스패치 시 설정한 한도는 작업을 디스패치하는 PHP 프로세스에만 등록됩니다. wp queuety work처럼 별도 프로세스에서 실행되는 작업자는 이를 확인할 수 없으므로 프로세스 간에 적용해야 하는 한도는 아래와 같이 핸들러의 config()에 설정하세요(#3).

핸들러 수준 속도 제한

모든 디스패치에 적용되도록 핸들러의 config() 메서드에서 속도 제한을 설정하세요.

PHP
use Queuety\Handler;

class CallOpenAIHandler implements Handler {
    public function handle( array $payload ): void {
        // Call the API...
    }

    public function config(): array {
        return [
            'rate_limit' => [ 60, 60 ], // 60 requests per minute
        ];
    }
}

작동 방식

속도 제한은 핸들러 이름별로 추적됩니다. 작업을 가져온 후 작업자는 핸들러의 config()에서 한도를 등록하고 속도 제한기를 확인합니다. 핸들러가 한도에 도달하면 작업자는 지연 없이 시도 횟수를 소모하지 않고 작업을 즉시 pending로 되돌린 다음 QUEUETY_WORKER_SLEEP초 동안 대기하고 다시 확인합니다. --once로 시작한 작업자는 대신 종료됩니다.

각 작업자는 메모리 내 카운터를 유지하고 5초마다 queuety_logs 테이블을 확인해 지난 $window초 동안 해당 핸들러에 대해 기록된 completed 로그 항목을 셉니다. 이 수는 공유 로그 테이블(공유 캐시가 설정된 경우에는 공유 캐시도 포함)에서 가져오므로 핸들러 수준 제한은 단일 작업자뿐 아니라 모든 작업자 프로세스에 적용됩니다. 실패한 실행은 한도에 포함되지 않습니다.

프로그래밍 방식으로 접근

속도 제한기에 직접 접근합니다.

PHP
$limiter = Queuety::rate_limiter();

// Register a rate limit
$limiter->register( 'call_openai', 60, 60 );

// Check whether a handler has reached its limit
$limited = $limiter->is_limited( 'call_openai' ); // true while the limit is reached

// Seconds until the current window resets
$wait = $limiter->time_until_available( 'call_openai' );

register() 및 is_limited()은 현재 PHP 프로세스의 제한기에 적용됩니다. 여기에 등록한 한도는 별도로 실행 중인 작업자가 적용하는 한도를 변경하지 않습니다.

사용 사례

  • 외부 API 제한. 속도 제한을 API의 할당량에 맞춥니다(e.g. 예: OpenAI의 분당 60회 요청).
  • 이메일 제한. 짧은 시간 내에 너무 많은 이메일을 보내지 않도록 합니다.
  • 리소스 보호. CPU 집약적인 핸들러를 제한해 다른 작업이 밀리지 않도록 합니다.