속도 제한
Queuety는 외부 API나 기타 제약된 리소스의 과부하를 방지하기 위해 핸들러별 속도 제한을 지원합니다. 핸들러가 한도에 도달하면 작업자는 해당 작업을 대기 상태로 두고 기간 내 여유가 생기면 다시 가져옵니다.
속도 제한 설정
작업을 디스패치할 때 속도 제한을 적용합니다.
use Queuety\Queuety;
Queuety::dispatch( 'call_openai', $payload )
->rate_limit( 10, 60 ); // max 10 executions per 60 seconds
두 인수는 다음과 같습니다.
$max- 기간 내 허용되는 최대 실행 횟수$window- 기간(초)
디스패치 시 설정한 한도는 작업을 디스패치하는 PHP 프로세스에만 등록됩니다. wp queuety work처럼 별도 프로세스에서 실행되는 작업자는 이를 확인할 수 없으므로 프로세스 간에 적용해야 하는 한도는 아래와 같이 핸들러의 config()에 설정하세요(#3).
핸들러 수준 속도 제한
모든 디스패치에 적용되도록 핸들러의 config() 메서드에서 속도 제한을 설정하세요.
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 로그 항목을 셉니다. 이 수는 공유 로그 테이블(공유 캐시가 설정된 경우에는 공유 캐시도 포함)에서 가져오므로 핸들러 수준 제한은 단일 작업자뿐 아니라 모든 작업자 프로세스에 적용됩니다. 실패한 실행은 한도에 포함되지 않습니다.
프로그래밍 방식으로 접근
속도 제한기에 직접 접근합니다.
$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 집약적인 핸들러를 제한해 다른 작업이 밀리지 않도록 합니다.