2014-02-07 2 views
0

모든 사이드 키 큐를 중복 제거 할 수 있습니다. 즉, 대기열의 각 작업에 고유 한 작업자 및 인수가 있는지 확인하십시오. 사이드 키 대기열 제거

(예를 들어, 객체마다 새로운 작업을 트리거 두 번 저장되어 있기 때문이 발생;.하지만 우리는 단지 그것을 처리 할 그래서 주기적으로 해제 속는 큐를 찾고 있어요.)

답변

1

sidekiq unique jobs 보석을 사용할 수 있습니다. 실제로 필요한 것처럼 보입니다.

나중에 추가 :

여기에 당신이 무엇을 요구의 기본 구현 - 그것은 빠르지 않을 것이지만, 작은 큐에 대한 확인을해야한다. 또한 JSON을 재 포장 할 때 this 문제를 만났습니다. 제 환경에서 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