2014-02-07 3 views
0

Как я мог обойти все очереди Sidekiq, то есть обеспечить, чтобы каждое задание в очереди имело уникальный рабочий и аргументы.De-dupe Sidekiq queues

(Это происходит потому, что, например, объект сохраняется в два раза, что вызвало некоторую новую работу каждый раз,., Но мы хотим, чтобы это было обработано Так что я смотрю периодически очередями де-простофиля.)

ответ

1

Вы можете использовать драгоценный камень sidekiq unique jobs - похоже, он действительно делает то, что вам нужно.

Добавлено позже:

Вот основная реализация того, что вы просите - это не будет быстрым, но должно быть хорошо для небольших очередей. Я также столкнулся с проблемой this при переупаковке JSON - в моей среде необходимо было перекодировать json так же.

#for proper json packing (I had an issue with it while testing) 
require 'bigdecimal' 

class BigDecimal 
    def as_json(options = nil) #:nodoc: 
    if finite? 
     self 
    else 
     NilClass::AS_JSON 
    end 
    end 
end 

Sidekiq.redis do |connection| 
    # getting items from redis 
    items_count = connection.llen('queue:background') 
    items = connection.lrange('queue:background', 0, 100) 

    # remove retrieved items 
    connection.lrem('queue:background', 0, 100) 

    # jobs are in json - decode them 
    items_decoded = items.map{|item| ActiveSupport::JSON.decode(item)} 

    # group them by class and arguments 
    grouped = items_decoded.group_by{|item| [item['class'], item['args']]} 

    # get second and so forth from each group 
    duplicated = grouped.values.delete_if{|mini_list| mini_list.length < 2} 
    for_deletion = duplicated.map{|a| a[0...-1]}.flatten 
    for_deletion_packed = for_deletion.map{|item| JSON.generate(item)} 

    # removing duplicates one by one 
    for_deletion_packed.each do |packed_item| 
    connection.lrem('queue:background', 0, packed_item) 
    end 
end 
+0

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

+0

Но почему вы хотите удалить дубликаты вместо того, чтобы не создавать их в первую очередь? В приведенном примере - «объект сохраняется дважды, каждый раз запуская новое задание, но мы хотим, чтобы он обрабатывался (один раз)». Может, у вас есть другие случаи? –

+0

Если у вас установлены триггеры обратного вызова, может быть сложно предотвратить добавление одной и той же работы несколько раз. Еще один пример - получить уведомление об изменении какого-то экстремального URL-адреса - вы не хотите, чтобы он был выбран дважды. – mahemoff