Sidekiq 제한 용량 워커

참고: 제한 용량 워커에 대한 다음 설명은 보통 인수를 사용하지 않고 대신 사용자 지정 큐(예: PostgresSQL 작업 대기열)에서 작업을 가져오는 특정 유형의 워커와 관련됩니다. 이는 일반적인 Sidekiq 워커의 속도 제한에 사용할 수 없습니다. 일반적인 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)를 사용합니다. 이 워커에 전달된 *argsperform_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 재시도를 비활성화하고 오류를 로그에 기록하며 작업을 데드 대기열로 보냅니다. 이는 작업을 생성하는 단일 소스만 갖도록 하기 위해서이며 재시도는 먼 미래에 수행할 작업을 차지하게 됩니다.

cron 워커에게 새로운 작업을 대기열에 넣도록 합니다. 이것은 실행 즉시 작업이 다시 실패할 수 있기 때문에 우리의 재시도 및 백오프 메커니즘으로 볼 수 있습니다. 이는 실패한 작업마다 용량이 낮아지게 만들어서 cron 워커가 용량을 다시 채울 때까지 계속 실행됨을 의미합니다. 워커가 대기열을 얻지 않도록 하는 것이 중요하다면 #perform_work에서 예외를 처리하고 작업이 발생하지 않도록 해야 합니다.

작업은 :none 전략을 사용하여 중복 처리되지만 워커는 idempotent!로 표시되지 않습니다.

메트릭

이 concern은 워커 클래스 이름을 라벨로 사용하는 가우지안 타입의 세 개의 프로메테우스 메트릭을 노출합니다.

  • limited_capacity_worker_running_jobs
  • limited_capacity_worker_max_running_jobs
  • limited_capacity_worker_remaining_work_count