使用多个队列工作程序设置Beanstalk:生成其他作业的作业

时间:2016-09-22 12:44:02

标签: multithreading message-queue task-queue beanstalkd

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

目前我的设置是这样的。我有20名工人正在等待推动任何工作。其中一项工作是发送iOS推送通知,iOS的问题,你不能发送批量消息。

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

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

我现在正在做什么。如果一个大工作,相反会创造另一份工作,以便其他空缺的工人能够接受并完成工作,这是否安全?

P.S所有工作都在1管中运行。

1 个答案:

答案 0 :(得分:1)

这对我来说听起来很合理,将负担扩散到一些工人中间。

我会注意一些事情 - 例如设置适当的优先级。如果创建数十个或数百个任务的任务具有比实际执行发送的作业更高的优先级,那么您将很快获得可能数十万个作业,但是工作者可能没有运行它们,因此队列将正在填补。

在优先级之间留出很大差距意味着您可以插入非常重要的工作。更重要的客户可能优先接近零,因此可以处理,并在较小的客户之前发送。

需要考虑的其他事项包括帐户受限制 - 如果您每秒只能说10次通知,那么运行20名工作人员将是非首发。

我还会把新的工作组放到一个新的管子里(运行数十个管子并不昂贵)。您可以一次观看多个管(从任何一个管中获取“最重要的”作业),但是您无法在一个管内计算不同类型的作业,因此将类型拆分为不同的队列可让您轻松查看每种类型的作业正在运行。因此,如果发送过程正在建立,您可以减慢分割作业的创建一段时间,或者暂时将它们标记为更低的优先级。

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