【问题标题】:De-dupe Sidekiq queues重复数据删除 Sidekiq 队列
【发布时间】:2014-02-08 06:36:25
【问题描述】:

我如何对所有 Sidekiq 队列进行重复数据删除,即确保队列中的每个作业都有唯一的工作人员和参数。

(这是因为,例如,一个对象被保存了两次,每次都会触发一些新作业;但我们只希望它被处理。所以我希望定期对队列进行重复数据删除。)

【问题讨论】:

    标签: ruby unique sidekiq


    【解决方案1】:

    您可以使用sidekiq unique jobs gem - 看起来它确实可以满足您的需求。

    稍后添加:

    这是您所要求的基本实现 - 它不会很快,但对于小队列应该没问题。我在重新打包 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
    

    【讨论】:

    • 这只能避免两次运行相同的作业并且是基于时间的,我正在尝试通过删除重复来清理现有队列。
    • 但是为什么要删除重复项而不是一开始就不创建它们呢?在提供的示例中 - “一个对象被保存两次,每次都会触发一些新作业;但我们只希望它被处理(一次)”。也许您还有其他情况?
    • 如果您设置了回调触发器,则很难防止多次添加相同的作业。另一个例子是收到一些极端 URL 更改的通知 - 你不希望它被获取两次。
    • 我添加了代码以直接删除所有重复项。另一种选择可能是考虑任务入队的时间和上次完成此任务的时间 - 如果它早于入队然后最后一个任务完成 - 我们不需要这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2016-06-17
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多