【发布时间】:2019-07-02 22:16:22
【问题描述】:
我需要实现监控和取消队列中已经运行的作业的能力。
有很多关于删除 QUEUED 作业的答案,但没有一个已经在运行的作业。
情况是这样的:我有一个“工作”,它由数据库上的成千上万行组成,需要针对 Web 服务逐个查询。
需要提取每一行,针对 Web 服务进行查询,存储响应并更新其状态。
我已经将它作为命令工作(从控制台启动/输出到控制台),但现在我需要实现队列,以便从更多用户那里堆积更多工作。
到目前为止,我已经看到了 Horizon(由于缺少进程控制库,它不能在 Windows 上运行)。但是,在周围看到的一些演示中,它缺少(我相信)我需要的几件事:
- 可动态配置超时(整个作业可能需要 12 小时以上,具体取决于所选作业要处理的行数)
- 能够取消已经运行的作业。
我还考虑了将每个请求生成为新作业的选项,而不是将“作业”视为整个行集合(这将克服超时问题),但这会给我一个 Horizon“待定作业”列表每个作业有数十万条记录,这会杀死浏览器(我知道 Redis 可以完全不痒地处理这个问题)。此外,我想不可能取消“所有属于 X 标签的工作”。
我一直在考虑使用 API 路由、启动作业并将其与应用程序分离,但我发现这需要分叉进程。
为了能够取消,我将使用 job_id 实现一个数据库,当用户点击 API 取消作业时,我会将其标记为“已暂停”。在每个循环中,我都会检查它的状态,如果它发现“已停止”,那么就杀死它自己。
如果我遗漏了任何方面,请大声疾呼,我会添加或澄清它。
所以我在这里寻求建议,因为我是 Laravel 的新手:我怎么能做到这一点?
【问题讨论】:
标签: queue laravel-5.8