Skip to content

Instantly share code, notes, and snippets.

@balvig
Created November 28, 2016 05:12
Show Gist options
  • Save balvig/20c503d188046617c86305353602f772 to your computer and use it in GitHub Desktop.
Save balvig/20c503d188046617c86305353602f772 to your computer and use it in GitHub Desktop.
Removes duplicate jobs in resque
class ResqueDeduplicator
attr_reader :logs
def initialize(queue)
@key = "queue:#{queue}"
@logs = []
end
def run(dry_run: false)
duplicates.each do |duplicate|
if dry_run
log "DRY RUN: Will remove #{duplicate} from #{key}"
else
Resque.redis.lrem(key, -1, duplicate)
log "Removed #{duplicate} from #{key}"
end
end
end
def number_of_jobs
jobs.size
end
def number_of_duplicates
duplicates.size
end
private
attr_reader :key
def duplicates
@duplicates ||= begin
jobs_with_duplicates.map do |group|
group.last.drop(1)
end.flatten
end
end
def jobs_with_duplicates
jobs_grouped.select do |_, jobs|
jobs.size > 1
end
end
def jobs_grouped
jobs.group_by do |job|
JSON.parse(job)["args"].first.except("job_id").to_s
end
end
def jobs
@jobs ||= Resque.redis.lrange(key, 0, -1)
end
def log(str)
logs << str
end
end
ResqueDeduplicator.new("job_queue_name")
dedup.run dry_run: false
dedup.logs.each { |log| puts log }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment