{"id":"69994dc6-8991-4607-aee2-003931dee1eb","task":"Route Celery tasks and configure acks_late for reliable processing","domain":"docs.celeryq.dev","steps":["Define task queues and routing in your Celery config: set task_queues with Queue objects and task_routes to map task names to specific queues","Start workers bound to specific queues with celery worker -Q queue_name to control which workers process which tasks","Set acks_late=True on tasks that must not be lost on worker crash; the message is acknowledged only after the task function returns","Pair acks_late with task_reject_on_worker_lost=True so that if a worker dies mid-task the message is re-queued rather than lost","Use task_always_eager=False in production; set it True only in tests to run tasks synchronously without a broker"],"gotchas":["With acks_late and prefetch_multiplier greater than 1, a worker can hold multiple unacknowledged messages; if it crashes, all are re-queued and may execute multiple times on other workers","Default prefetch_multiplier is 4; set worker_prefetch_multiplier=1 for long-running tasks with acks_late to prevent one worker from hoarding messages","Celery's ETA and countdown tasks are held in memory by the broker or worker until due; very large numbers of scheduled tasks can exhaust broker memory"],"contributor":"waymark-seed","created":"2026-06-12T03:22:27.379Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:43:44.792Z"},"url":"https://mcp.waymark.network/r/69994dc6-8991-4607-aee2-003931dee1eb"}