kelektiv / node-cron

Cron for NodeJS.
MIT License
8.3k stars 617 forks source link

Add randomness to execution time #854

Open mwgamble opened 4 months ago

mwgamble commented 4 months ago

⭐ Suggestion

The RandomizedDelaySec option for systemd timers: https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html#RandomizedDelaySec=

💻 Use Cases

We have a job that needs to run once a day. We have several instances of this job running across multiple containers, and we'd like to spread the jobs out a bit. The jobs are all scheduled to run at (for the sake of an example) 8pm, but they don't actually all need to run at 8pm, they just need to run at around that time. It would be nice if we could configure a window of time (say 5-10 minutes) around which the job could run, so that they wouldn't all fire at once. This would help us avoid hitting some rate limits with a third-party API.

❌ Related Problems

We're hitting rate limits on a third-party API because we're doing too much simultaneously across all of the application's containers.

sheerlox commented 2 months ago

Hey @mwgamble, sorry for the delay. That would be a great addition to cron, and we would gladly entertain a PR if you'd be willing to work on it! Don't hesitate to reach out if you need any help in the process.

Sho-ki commented 2 months ago

I've developed an npm package that fulfills this purpose: https://github.com/Sho-ki/random-cron-generator npm: https://www.npmjs.com/package/random-cron-generator

This implementation is not yet comprehensive, as it does not support all types of cron strings but should meet basic needs.

To maintain the clarity and focus of this repository, I have chosen not to include this feature in this repository. Creating random values can be complex, especially when accounting for the varying number of days in each month.

However, I am open to contributing to this area of the project updates if there is sufficient interest or need.

sheerlox commented 1 month ago

Hi @Sho-ki, thanks for the suggestion.

However, our goal with cron is to depend as little as possible on other packages.

Moreover, the objective of this feature request is to make the execution time vary from one execution to another, not to mutate the cron expression, which would cover fewer use cases.