以可变的时间间隔运行 Rake 任务
我正在使用每当(https://github.com/javan/whenever)ruby gem 在模型 X 的 after_create 回调中插入一个 crontab 条目。该条目指示作业每 45 分钟运行一次。但我想将控制权交给用户,他可以指定时间间隔。所以过程是这样的:
- 用户创建了一个 Model X,我插入一个 crontab 条目以在 45 分钟后执行作业。
- 用户发现 45 分钟不够好,他希望能够将 UI 的时间间隔更改为 30 分钟(请注意,这是一个 HTML/UI 控件,他应该能够做到这一点)。
- 稍后他应该能够多次更改时间间隔。
任何关于我们如何实现这一目标的宝石或任何想法都值得赞赏。我对任何版本的 Rails 持开放态度,并且可以在任何人中开始实施,因为此功能构成了功能的核心。
谢谢。
I am using whenever(https://github.com/javan/whenever) ruby gem to insert a crontab entry in after_create callback of model X. This entry instructs the job to run every 45 minutes. But I want to give the control to the user where by he can specify the time interval. So the process goes like this:
- The user creates a Model X, I insert a crontab entry to execute a job after 45 minutes.
- User sees that 45 minutes is not good enough, he wants to be able to change the time interval from UI to 30 minutes (please note that this is a HTML/UI control where he should be able to do that).
- Later on he should be able to change the time interval any number of times.
Any gem or any idea on how we can accomplish this is appreciated. I am open to any version of rails and can start implementation in anyone since this feature forms the core of functionality.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不喜欢你的解决方案的方法。这意味着,如果将来您的应用程序将有 2k 个用户,您将启动 2k 个 crontabs?
无需为每个用户创建一个 crontab,只需每分钟创建一个即可。在用户模型中存储有关该用户的 crontab 频率以及上次执行 crontab 时间的信息。
然后,当主 crontab 每分钟启动时,检查哪些用户的
last_crontab_at + 频率
Time.current
并为这些用户运行脚本。这样,无论用户数量有多少,应用程序都可以扩展。
另外,请记住 crontab 是服务器本地的。如果您必须更改服务器或创建集群,会发生什么情况?我建议您考虑使用后台处理服务或队列。
I don't like the approach of your solution. It means, that if in the future your application will have 2k users, you'll start 2k crontabs?
Instead of creating one crontab for every user, simply create one every minute. Store in the User model the information about the crontab frequency for that user and the last time the crontab was performed.
Then, when the main crontab starts every minute, check which users have a
last_crontab_at + frequency < Time.current
and run the script for these users.In this way, the application will scale regardless the number of users.
Also, remember crontabs are local to the server. What will happen if you have to change the server or create a cluster? I suggest you to think about using a background processing service or a queue.