2012-03-28 15 views
11

Come si impedisce a Celery di eseguire un'attività periodica prima che l'esecuzione precedente sia stata completata?Come garantire che un'attività di Celery preveda la sovrapposizione delle esecuzioni delle attività di Celery

Possiedo un cluster di server, collegato a un server di database comune, esecuzione di attività di Celery e sto riscontrando che ogni server può eseguire occasionalmente la stessa attività contemporaneamente e diversi server che eseguono contemporaneamente la stessa attività. Questo sta causando molte condizioni di gara che stanno corrompendo i miei dati in modi dolorosamente sottili.

Sto leggendo tramite Celery's docs, ma non riesco a trovare alcuna opzione che consenta esplicitamente questo. Ho trovato un similar question, ma la soluzione suggerita sembra un trucco, poiché fa affidamento sul framework di cache di Django e quindi potrebbe non essere condivisa da tutti i server in un cluster, consentendo a più server di eseguire la stessa attività contemporaneamente.

Esiste un'opzione in Celery per registrare quali attività sono attualmente in esecuzione nel database e non eseguire nuovamente fino a quando il record del database non viene cancellato?

che sto utilizzando il modulo Django-sedano, e anche se fornisce pagine/admin/djcelery/taskstate/e/admin/djcelery/workerstate /, non ho mai visto qualsiasi attività o lavoratori a lungo in esecuzione mostrare lì.

risposta

2

Se fossi in te, configurerei una coda speciale per tutti i lavori che non possono essere eseguiti contemporaneamente. Quindi puoi semplicemente avviare un lavoratore separato solo per quella coda.

3

Il modo standard consiste nell'utilizzare il blocco condiviso tramite il meccanismo della cache standard di django. Vedere this recipe dalla documentazione ufficiale

+0

E come ho già detto, non è un meccanismo robusto in un'impostazione cluster ... Perché non esiste un'opzione che utilizza il database? – Cerin

+0

Utilizza il back-end memcached e otterrai la funzionalità cluster –

+1

@AlexLebedev, è un buon punto, ma * se e solo se * le macchine nel cluster condividono il back-end. Ad esempio, non è impensabile eseguire memcached localmente e utilizzare un backend memcached localhost su ogni box. Logicamente ovvio ma volevo solo indicarlo per paura che qualcuno pensasse "oh, sto usando memcached, problema risolto". – mrooney

Problemi correlati