Come distruggere posti di lavoro accodati da lavoratori resque?
-
28-10-2019 - |
Domanda
Sto usando Resque su un progetto rails-3 per gestire i lavori che sono programmati per essere eseguiti ogni 5 minuti.Recentemente ho fatto qualcosa che ha fatto impazzire la creazione di questi posti di lavoro e lo stack ha raggiunto oltre 1000 posti di lavoro.Ho risolto il problema che causava la messa in coda di molti lavori e ora il problema che ho è che i lavori creati dal bug sono ancora presenti e quindi diventa difficile testare qualcosa poiché un lavoro viene aggiunto a una coda con oltre 1000 lavori. Non riesco a fermare questi lavori.Ho provato a rimuovere la coda dal redis-cli usando il comando flushall ma non ha funzionato.Mi sto perdendo qualcosa?perché non riesco a trovare un modo per sbarazzarmi di questi lavori.
Soluzione
Se apri una console rails, puoi eseguire questo codice per cancellare le code:
queue_name = "my_queue"
Resque.redis.del "queue:#{queue_name}"
Altri suggerimenti
Giocando con le risposte precedenti, se hai bisogno di cancellare tutte le tue code, potresti usare quanto segue:
Resque.queues.each{|q| Resque.redis.del "queue:#{q}" }
Resque ha già un metodo per farlo: prova Resque.remove_queue(queue_name)
(consulta la documentazione qui ).Internamente esegue Resque.redis.del()
, ma esegue anche altre operazioni di pulizia e utilizzando un metodo api (invece di fare ipotesi su come funziona resque) sarai più a prova di futuro.
Attività rake aggiornata per la cancellazione (in base alle ultime modifiche ai comandi redis): https://gist.github.com/1228863
Questo è ciò che funziona ora:
Resque.remove_queue("...")
Accedi alla console redis:
redis-cli
Elenca database:
127.0.0.1:6379> KEYS *
1) "resque:schedules_changed"
2) "resque:workers"
3) "resque:queue:your_overloaded_queue"
"resque:queue:your_overloaded_queue"
- db di cui hai bisogno.
Quindi esegui:
DEL resque:queue:your_overloaded_queue
Oppure, se desideri eliminare i lavori specificati in coda, elenca alcuni valori da db con il comando LRANGE
:
127.0.0.1:6379> LRANGE resque:queue:your_overloaded_queue 0 2
1) "{\"class\":\"AppClass\",\"args\":[]}"
2) "{\"class\":\"AppClass\",\"args\":[]}"
3) "{\"class\":\"AppClass\",\"args\":[]}"
Quindi copia / incolla un valore nel comando LREM
:
127.0.0.1:6379> LREM resque:queue:your_overloaded_queue 5 "{\"class\":\"AppClass\",\"args\":[]}"
(integer) 5
Dove 5 - numero di elementi da rimuovere.
È più sicuro e a prova di proiettile utilizzare l'API Resque piuttosto che eliminare tutto sul Redis di Resque.Resque fa un po 'di pulizia all'interno.
Se desideri rimuovere tutte le code e i lavori accodati associati:
Resque.queues.each {|queue| Resque.remove_queue(queue)}
Le code verranno ricreate la prossima volta che un lavoro viene accodato.