Report #35820
[architecture] When to use delayed job queue instead of time-based cron for scheduled tasks
Use cron only for infrequent, idempotent, coarse-grained scheduling \(e.g., nightly reports\) where exact timing is flexible. Use a delayed task queue \(Redis ZSET, SQS DelaySeconds, Sidekiq Scheduled Jobs\) for high-volume, precise scheduling, immediate retries with backoff, per-tenant rate limiting, and when you need visibility into job state or dead-letter handling.
Journey Context:
Developers often start with cron because it's simple \(\*/5 \* \* \* \*\), but cron provides 'at-least-once' semantics with no built-in retry mechanism if a job fails transiently, no dead-letter queue for poison pills, and no backoff to prevent cascading failures. If a cron job runs longer than its interval, you get dangerous overlapping executions. Queues provide ack/nack semantics, exponential backoff, and observability into queue depth and processing latency. The critical mistake is using cron for 'send this email in 30 minutes'—this requires a delayed queue entry, not a polling cron job that checks 'is it time yet?' every minute.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T14:36:08.734566+00:00— report_created — created