【问题标题】:Laravel - how to move jobs form one redis queue to other redis queue?Laravel - 如何将作业从一个redis队列移动到另一个redis队列?
【发布时间】:2019-01-02 00:16:40
【问题描述】:

例如,我有两个队列“高”和“低”。 我在“高”队列中有 1000 个工作,在“低”队列中有 0 个工作。 现在我想将例如 500 个作业从“高”队列移动到“低”队列。

首先,最好了解如何移动所有工作,而不仅仅是其中的一半。

我可以用这个命令得到所有的工作:

\Redis::lrange('queues:' . $name, 0, -1);

但是如何移动它们,知道吗?

【问题讨论】:

  • 我不确定在这里手动干预是否是个好主意。您是否考虑过重新调整队列工作程序(例如,在 Horizo​​n 的帮助下)? IE。对于长度为 0 的队列,可以减少工作人员,对于长度为 1000 的队列,可以增加工作人员。 Laravel Horizo​​n 会在 balance 模式 auto (see docs) 运行时自动为您执行此操作。
  • 别这样,你会被烧死的。像php artisan queue:worker --queue=high,low 这样启动所有工作人员,这意味着high 队列将首先得到处理。 high / low 主要是为您/开发人员命名队列。
  • @Namoshek 你说“我不确定是否手动干预”,但我猜 Horizo​​n 是手动做的?
  • 不,不是。 Horizo​​n 只是重新扩展队列工作进程。例如,您可以将其配置为默认情况下有 3 个进程用于 high 队列和 3 个进程用于 low 队列。但根据工作量,Horizo​​n 会将流程重新调整为 4:2 或 5:1。通过手动干预,我的意思是操纵 redis 队列。
  • 当然,使用两个队列是有优势的,即使您的工作人员同时处理这两个队列。因为他们仍然被优先考虑。当你使用php artisan queue:worker --queue=high,low 时,worker 将首先清除high 队列,然后才考虑处理low 队列。如果新作业到达high 队列,则工作人员在处理low 队列时也会跳回high 队列。如果您有两个工人,一个是--queue=high,low,一个是--queue=low,high,当他们有一些空闲时间时,他们会互相支持。

标签: php laravel redis laravel-5.2 laravel-5.5


【解决方案1】:

总结一下 cmets 中的讨论,这里有一些建议和其他信息。

手动调整 Redis 队列

不建议手动干预redis队列。不要手动更改队列。相反,让队列工作人员处理具有意外(高)工作负载的队列。您还可以临时生成额外的队列工作人员以更快地完成工作。

不过,在处理未来的功能时,可能会考虑到不平衡的队列负载。

修复队列工作负载

要解决队列工作负载,有多种解决方案。它们的共同点是我们在各个队列之间共享资源。唯一的区别是实现方式。

对于以下选项,我将使用一个非常基本的示例。想象一个简单的云应用程序,用户可以在其中购买一些计算能力(无论如何)。为了让事情更有趣,应用程序的用户还可以购买优先队列票,这保证了他们的优先处理。换句话说,他们的请求应该(但不是必须)优先处理。

1。重新调整队列工作进程

共享资源的一种方法是根据工作负载扩大和缩小队列工作进程。这意味着我们减少了一个队列的队列工作进程,以便为另一个队列提供更多队列工作人员的资源。

在我们的示例中,我们可能希望我们的用户使用 10 次中的 9 次非优先处理,因为他们不想为更快的处理支付额外费用。这意味着我们通常在low 优先级队列中有9 个工作项,而high 优先级队列中有1 个工作项。为了使优先级处理有意义,我们现在需要每个队列 3 个队列工作进程。我们将像这样启动流程:

  • 3x php artisan queue:work --queue=high
  • 3x php artisan queue:work --queue=low

如果现在高优先级队列突然有更多的工作项(例如,由于出售优先级队列票),我们需要相应地重新调整队列工作人员。为此,我们必须手动终止一些--queue=low 工作进程并启动更多--queue=high 工作进程。

因为手工操作很麻烦(而且我们开发人员也需要偶尔睡觉),所以有一个解决方案,称为Laravel Horizon。当正确配置balance 模式设置为auto 时,Horizo​​n 将确保具有较高工作负载的队列确实比具有较少工作负载的队列得到更多关注。换句话说,Horizo​​n 将尝试在队列之间实现相等的等待时间。

2。让队列工作者在多个队列上工作

一种不太复杂的方法是让队列工作人员在多个队列上进行侦听和工作。这可以通过将多个逗号分隔的队列传递给--queue 参数来完成:--queue=high,low

这样做时,我们指示队列工作程序处理high 队列上的工作项,其优先级高于low 队列上的工作项。这意味着工作人员在从low 队列中获取工作之前将始终完全清除high 队列。如果在处理low 队列上的作业后,工作人员在high 队列上找到了一个项目,他将跳回这个队列。所以每次worker寻找一个新的工作项,他会先去high队列,如果没有工作项,他会去low队列。

对于上面的示例,我们可以部署以下 6 个队列工作器:

  • 4x php artisan queue:work --queue=high,low
  • 2x php artisan queue:work --queue=low

在这种情况下,与low 队列相比,high 队列的工作资源(按比例)要多得多。但是,当他们没有任何优先工作要做时,这些资源将帮助low 队列的其他工作。

当然,我们也可以将 high 队列作为后备添加到我们的 low 队列工作人员:

  • 4x php artisan queue:work --queue=high,low
  • 2x php artisan queue:work --queue=low,high

通过这种方式,他们将能够帮助我们的high 优先队列工作人员,以防出现上述销售情况等工作超负荷情况。

结论

简单的解决方案通常更好。当您的工作负载没有突然爆发并且您可以很好地预测它们时,请使用第二种方法(但使用supervisor,这样您就不必一直手动启动工人,而且以确保它们在发生崩溃时重新启动)。

另一方面,如果您的工作量变化很大,并且您无法真正提前知道您需要多少队列工作人员,那么 Horizo​​n 可能值得一看。就我个人而言,我也将 Horizo​​n 用于相当简单的项目,因为它易于设置,并且可以让我省去我必须考虑很多负载和其他事情的工作。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多