Voiceware: Background Work · deep-dive
Celery Beat Is Not “Just Another Worker”
Why scheduled task orchestration deserves different lifecycle thinking from queue consumers.
I want to go one layer deeper on why scheduled task orchestration deserves different lifecycle thinking from queue consumers.
Mental model
producer -> queue/broker -> worker class -> task execution -> side effect
What the repository proves
I deployed Celery Beat separately from the worker roles instead of treating the scheduler as another worker replica.
Failure scenarios
The main failure I am concerned with is: Running multiple schedulers accidentally can create duplicate task dispatch depending on the scheduling design.
Trade-offs
What this came down to was this: Running multiple schedulers accidentally can create duplicate task dispatch depending on the scheduling design. From that I kept one rule: Schedulers and workers may share code while still requiring different scaling and availability rules.
What I check in practice
- Measure queue wait separately from execution time.
- Confirm workers consume the intended queue.
- Scale from workload pressure, not CPU alone.
- Keep scheduler semantics separate from worker semantics.
- Test process commands exactly as rendered in the pod spec.
If I remember one thing from this deep dive, it is Schedulers and workers may share code while still requiring different scaling and availability rules. That is the kind of boring infrastructure I want: easy to explain, easy to inspect, and hard to misunderstand during an incident.