Sidekiq 제한 용량 워커
LimitedCapacity::Worker
concern을 사용하여 워커 클래스의 동시 실행 작업 수를 제한할 수 있습니다.
워커는 세 가지 메서드를 구현해야 합니다.
-
perform_work
: 해당 concern은 일반적인perform
메서드를 구현하고, 사용 가능한 용량이 있다면perform_work
를 호출합니다. -
remaining_work_count
: 수행할 작업이 남아있는 작업 수입니다. -
max_running_jobs
: 동시에 실행할 수 있는 최대 작업 수입니다.
class MyDummyWorker
include ApplicationWorker
include LimitedCapacity::Worker
def perform_work(*args)
end
def remaining_work_count(*args)
5
end
def max_running_jobs
25
end
end
이 워커를 대기열에 넣으려면 MyDummyWorker.perform_with_capacity(*args)
를 사용하세요. 이 워커에 전달된 *args
는 perform_work
메서드로 전달됩니다. 이 작업이 자체를 제한하고 다시 대기열에 넣는 방식으로 실행되기 때문에 항상 동일한 *args
를 제공해야 합니다. 사실, 해당 유형의 워커는 빈번히 인수와 함께 사용되지 않으며 대신 다른 곳(예: PostgreSQL)에 저장된 작업을 처리해야 합니다. 이 설계는 또한 일반적인 Sidekiq 작업을 인수와 함께 수행하고 LimitedCapacity::Worker
로 만드는 데 적합하지 않다는 것을 의미합니다. 따라서 이를 사용하려면 큐를 다른 곳에 저장해야 할 수 있습니다.
이 유형의 워커의 일반적인 사용 사례는 별도의 처리해야 할 작업을 주기적으로 수행하는 워커입니다(예: PostgreSQL에서 가져온 것). 이 경우, 주기적으로 해당 워커를 시작하는 추가적인 cron 워커가 필요합니다. 예를 들어, 다음 스케줄러에서:
class ScheduleMyDummyCronWorker
include ApplicationWorker
include CronjobQueue
def perform
MyDummyWorker.perform_with_capacity
end
end
실행 중인 작업 수는 얼마인가요?
거의 항상 max_running_jobs
가 실행됩니다.
cron 워커는 각 실행에서 남은 용량을 확인하고 최대 max_running_jobs
개의 작업을 예약합니다. 해당 작업은 완료되면 즉시 자체를 다시 대기열에 넣지만 실패하면 다시 넣지 않습니다. cron 워커는 해당 실패한 작업을 대체하는 역할을 담당합니다.
오류 처리 및 동일성 보장
이 concern은 Sidekiq 재시도를 비활성화하고 오류를 로깅하며 작업을 dead queue로 보냅니다. 이는 작업을 생성하는 소스가 단 하나뿐이어야 하고 재시도가 먼 미래에 작업을 수행하는 슬롯을 차지하게 되는 것을 방지하기 위해 수행됩니다.
cron 워커에게 새로운 작업을 예약하도록 합니다. 이는 작업이 즉시 실행되면 다시 실패할 수 있기 때문에 재시도 및 백오프 메커니즘으로 볼 수 있습니다. 즉, 각 실패한 작업에 대해 낮은 용량에서 실행하게 되며 cron 워커가 용량을 다시 채울 때까지입니다. 워커가 백로그를 보유하지 않도록 하는 것이 중요하다면 예외는 #perform_work
에서 처리되어야 하며 작업은 예외를 발생시키지 않아야 합니다.
작업은 :none
전략을 사용하여 중복 처리되지만, 해당 워커는 idempotent!
로 표시되지 않습니다.
메트릭
이 concern은 워커 클래스 이름을 레이블로 사용하는 gauge 유형의 프로메테우스 메트릭 세 개를 노출합니다:
limited_capacity_worker_running_jobs
limited_capacity_worker_max_running_jobs
limited_capacity_worker_remaining_work_count
대안
제한된 용량 워커가 아키텍처에 맞지 않는 경우 concurrency limit 속성을 사용하여 Sidekiq 워커의 동시성을 제한할 수도 있습니다.