Celery Task Retry Backoff Jitter

Retry failing Celery tasks with exponential backoff and jitter, capping max delay, classifying retryable exceptions, and exposing stats.

PythonResilience

Code

snippet
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()),
    }