Celery Task Retry Backoff Jitter
Retry failing Celery tasks with exponential backoff and jitter, capping max delay, classifying retryable exceptions, and exposing stats.
Code
import random
from celery import Celery
app = Celery('shipping', broker='redis://localhost:6379/1')
app.conf.update(
task_acks_late=True,
worker_prefetch_multiplier=1,
task_reject_on_worker_lost=True,
)
class CarrierUnavailable(Exception):
pass
@app.task(
bind=True,
max_retries=5,
autoretry_for=(CarrierUnavailable,),
retry_backoff=2,
retry_backoff_max=600,
retry_jitter=True,
)
def book_shipment(self, order_id: str, carrier: str):
try:
if random.random() < 0.5:
raise CarrierUnavailable(f'{carrier} api warming up')
return {'order': order_id, 'carrier': carrier, 'tracking': 'TRK-88'}
except CarrierUnavailable as exc:
countdown = min(2 ** self.request.retries * 2, 600)
countdown += random.uniform(0, countdown * 0.3)
raise self.retry(exc=exc, countdown=countdown)
@app.task
def shipment_stats():
inspector = app.control.inspect()
active = inspector.active() or {}
reserved = inspector.reserved() or {}
return {
'active_tasks': sum(len(w) for w in active.values()),
'reserved_tasks': sum(len(w) for w in reserved.values()),
}Report a problem with this exampleOpens a pre-filled issue on GitHub.