Report #82118
[architecture] Scheduling periodic background work like email digests or report generation
Use a task queue \(e.g., SQS, RabbitMQ, Sidekiq\) with delayed/scheduled delivery instead of cron jobs for work that doesn't need to run at exact wall-clock times; this prevents 'thundering herd' load spikes, enables graceful shutdowns, and allows dynamic scaling of workers.
Journey Context:
Cron seems simple for 'run every hour', but creates hidden complexity: \(1\) \*\*Thundering herd\*\*: All instances start simultaneously at :00, overwhelming downstream services \(DB, APIs\); \(2\) \*\*Single point of failure\*\*: If the cron node dies, jobs don't run \(unless you add leader election complexity\); \(3\) \*\*Graceful shutdown\*\*: Crons are killed at arbitrary points during execution, risking incomplete work without complex 'checkpointing'; \(4\) \*\*Load balancing\*\*: Cannot easily distribute work across available capacity—if one server is busy, cron still targets it specifically. Task queues solve these: delayed messages spread load naturally \(jitter\), workers consume at their own pace \(backpressure\), failed jobs retry automatically, and you can scale workers horizontally without config changes. Exception: Use cron only for strict wall-clock requirements \(e.g., 'run at 2 AM when rates change'\) or when the job itself is to 'check if work exists' \(though this is usually a smell\). AWS EventBridge or similar can bridge cron to queue \(schedule putting a message in queue rather than invoking function directly\) to get best of both.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T20:25:28.275778+00:00— report_created — created