我正在用Laravel编写一个PHP项目。管理员可以将电子邮件警报排队以在特定日期/时间发送。自然的选择是将 Laravel 的 Queue 类与 Beanstalkd 一起使用(Laravel在内部使用 Pheanstalk(。
但是,管理员可以选择重新安排或删除尚未发送的电子邮件警报。我找不到删除特定任务的方法,以便我可以插入具有新时间的新任务。
完成这样的事情的常用技术是什么?我也对其他想法持开放态度。我不想使用 CRON,因为这些电子邮件的数量会很高,我宁愿重用已经测试过的解决方案来管理任务队列。
我自己在互联网上搜索过这样的答案。
这是我的发现:
豆茎
我认为 Beantalkd 中最简单的方法是使用它延迟作业的能力(给它几秒钟的延迟作为参数(。
然后,您可以执行日期数学运算,以捕获now()
与理想情况下作业运行的时间(以秒为单位(之间的时间差异,并将作业延迟很长时间。
这里有一个例子(参见SO问题的第一个答案 - 它是在Python中,但你可以得到这个人在说/做什么的要点(
请注意,这并不能保证任务按时运行 - 延迟只是使作业在 X 秒后可用。当延迟的作业可用时,队列在处理任务上的落后程度决定了作业在实际中的运行时间。(如果您由于大量作业而排队落后,那么它不一定会完全按时运行!
拉拉维尔
Laravel's Queue有一个更高的方法,你可以使用它来代替push
与 Push 一样,您可以执行以下操作:
Queue::push('Some'Processing'Class', array('data' => $data));
使用 later()
,您可以执行以下操作:
$delay = 14400; // 4 hours in seconds
Queue::later($delay, 'Some'Processing'Class', array('data' => $data));
SaaS 选项
- Google App Engine 可以安排任务
- iron.io 可以安排任务(与拉拉维尔配合得很好!
其他语言
- Python的Celery有类似的选项来延迟工作(具有相同的警告(
- Ruby的resque有一个时间表,也有点适合这个