Как перемешать задания в очереди Resque? - PullRequest
5 голосов
/ 17 августа 2011

У меня есть очередь с именем check_integrity и много рабочих мест в ней. Когда я запускаю работника для этого, он получает работу первым в первом порядке. Можно ли перетасовать задания в этой конкретной очереди? Мне нужен работник, чтобы работать случайным образом. Пожалуйста, помогите.

Спасибо.

Ответы [ 4 ]

1 голос
/ 11 июня 2015

Один из способов сделать это - вытолкнуть записи из очереди, упаковать их, перетасовать пакет и затем снова вставить их:

key = "resque:queue:bulk"
total = Redis.current.llen(key)
batch_size = 5_000 # any value that is good enough for you

batch = []
total.times do |i|
  entry = Redis.current.lpop(key)
  batch << entry
  if batch.size == batch_size
    puts "re-inserting batch..."
    Redis.current.rpush key, batch.shuffle
    batch = []
  end
end

Это действительно полезно, когда вы ошибочно ставите несколькозадания, которые в конечном итоге побеждают за общими ресурсами, замками и т. д.

1 голос
/ 17 августа 2011

Посмотрите на этот плагин для Resque. Я думаю, это именно то, что вам нужно.

0 голосов
/ 08 марта 2012

Если вы не возражаете против восстановления патчей, тогда вы можете использовать это решение:

module Resque

  # Monkey patch Resque to handle queues as sets instead of lists. This allows
  # use to get jobs randomly rather then sequentially.
  def push(queue, item)
   watch_queue(queue)
   redis.sadd "queue:#{queue}", encode(item)
  end

  def pop(queue)
    decode redis.spop("queue:#{queue}")
  end

  def size(queue)
    redis.scard("queue:#{queue}").to_i
  end
end

Если вы используете rails, создайте файл внутри инициализаторов с этим кодом, и вы будете настроены.

0 голосов
/ 17 августа 2011

вы можете использовать Delayed_job

...