具有多个队列工作人员的 Beanstalk 设置:产生另一个工作的工作

Beanstalk setup with multiple queue worker: Jobs that spawns another jobs

从一份工作中产生多个工作以便工人可以开始从事任何空缺工作是否安全?

目前我的设置是这样的。我有 20 名工人在等待任何工作被推送。其中一项工作是发送 iOS 推送通知,iOS 的问题,您无法发送群发消息。

当前:我所做的是,一项批量获取特定用户列表的工作,从我的数据库中获取每个设备令牌并开始发送通知。

场景:如果一个主题有 1000 个用户,我必须获取所有 1000 个用户和他们的设备,然后开始在每个设备上发送。这将在我的队列中推送一个新工作,并且 1 个工作人员会选择它的应用程序,而其他工作人员则空缺并等待新工作。如果在给定时间内没有工作可用怎么办,工人 1 必须完成所有工作发送,

我现在的工作。如果那份大工作会创造另一份工作,以便其他空缺的工人可以接手并完成工作,这是否安全?

P.S 所有作业都是 运行 一管。

这对我来说听起来很合理,将负载分摊给了一些工人。

有些事情我会小心 - 例如设置适当的优先级。如果创建数十个或数百个更多任务的任务的优先级高于实际执行发送的任务,那么您将很快获得数十万个任务,但工作人员可能不是 运行 他们,并且所以队列会被填满。

在优先级之间留出较大差距意味着您也可以安排真正重要的工作。更重要的客户的优先级可能接近于零,因此会先于较小的客户进行处理和发送。

其他需要考虑的事项包括帐户速率受限 - 如果您被限制为每秒 10 个通知,运行 20 个工作人员将无法启动。

我也会把新组的作业放到新的管子里(运行几十管也不贵)。您可以一次观看多个管道(从其中任何一个获取 'most important' 作业),但您不能在单个管道内计算不同类型的作业,因此将类型拆分到不同的队列中可以让您轻松查看每种类型的职位数量 运行。因此,如果发送进程正在增加,您可以暂时减慢创建拆分作业的速度,或者暂时将它们标记为更低的优先级。

最后,为了保留批处理作业的一些优势并避免一些开销,我可能会将 1000 多个作业分成每个作业可能包含 25-50 个通知的数据包。