具有多个队列worker的Beanstalk设置:生成其他作业的作业



从一个工作中生成多个工作是否安全,以便工人可以开始在任何空缺的工作上工作?

目前我的设置是这样的。我有20个工人在等着裁员。其中一项工作是发送iOS推送通知,iOS的问题是,你不能发送批量消息。

Current:我所做的是,一个作业,通过批处理获得特定用户的列表,从我的db中获得每个设备令牌并开始发送通知。

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

我现在正在工作。如果一个大的工作,反而会创造另一个工作岗位,这样其他空缺的工人就可以接手并完成工作,这安全吗?

p。

我觉得很合理,把工作量分摊给几个工人。

有一些事情我要小心——比如设置一个适当的优先级。如果创建了数十个或数百个任务的任务比实际发送任务的任务具有更高的优先级,那么您将很快获得潜在的数十万个任务,但工人可能不会运行它们,因此队列将被填满。

在优先级之间留出较大的间隔意味着你可以插入真正重要的工作。更重要的客户可能具有接近于零的优先级,因此被处理,并在较小的客户之前发送。

其他需要考虑的事项包括速率限制的帐户-如果您被限制为每秒10个通知,那么运行20个worker将是不可能的。

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

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

最新更新