ActiveJob에서 sidekiq을 사용하고 있습니다. 대기열의 균형을 유지하려고합니다. 그래서 나는이 방법을 사용한다.Sidekiq의 queue.size가 실시간으로 업데이트되지 않습니다.
while queue.size < 10
SomeJob.perform_later(some_args) # This should add one job to the queue right away, but it doesn't, it takes some time for the job to enter the queue.
end
이것은 잘못된 방식으로 실패합니다. 그러면 50, 60 개 이상의 작업이 예약됩니다. 그 이유는 대기 행렬이 작업에 의해 직접 채워지지 않고 대신 작업이 대기열에 들어가는 데 시간이 걸리기 때문입니다. 따라서 queue.size
메소드는 몇 초 동안 0
을 반환하고 실제 대기열 크기를 가져옵니다.
업데이트 : 문제점을 발견했습니다. 내가 작업을 스케쥴하는 데 사용하는 클래스가 구성된 것으로 밝혀졌습니다. 어떤 시점의 구성은 SomeJob.set (wait : wait_time)이고 wait_time은 0이었습니다. 활성 작업은 일정 시간 동안 작업을 스케쥴링 된 세트에 넣을 것입니다 1 초 미만) 대기열에 들어갑니다. 이것이 queue.size가 내가 큐에있을 것으로 기대했던 것을 반영하지 않은 이유입니다.
과 같은 proc을 사용하십시오. Sidekiq이 Redis list를 대기열로 사용하고 있습니다. 문제는 Redis 클라이언트를 작성하여 큐 크기 또는 큐 내용을 확인하는 데 사용하더라도 올바른 크기를 즉시 반환하지 않습니다. 이것은 레디스가 어떻게 작동하는지 아닙니다. Redis는 단일 스레드이므로 요소를 목록에 넣은 다음 크기를 확인하면 목록이 이미 업데이트되고 크기가 올바른지 확인합니다. –
이것은 Sidekiq이 대기열 인구를 어떻게 든 지연시키고 있음을 의미합니다. –
아마도 대기 시간이 잠깐 지연되는 것처럼 지연되는 것 같지 않습니다. https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/api.rb#L218 상관없이, 당신의'queue.size'는 루비 인터프리터에 의해 한번 읽혀지고, 왜냐하면'queue.size'는 정수이기 때문입니다. proc 도움이됩니다. –