【发布时间】:2019-01-02 00:16:40
【问题描述】:
例如,我有两个队列“高”和“低”。 我在“高”队列中有 1000 个工作,在“低”队列中有 0 个工作。 现在我想将例如 500 个作业从“高”队列移动到“低”队列。
首先,最好了解如何移动所有工作,而不仅仅是其中的一半。
我可以用这个命令得到所有的工作:
\Redis::lrange('queues:' . $name, 0, -1);
但是如何移动它们,知道吗?
【问题讨论】:
-
我不确定在这里手动干预是否是个好主意。您是否考虑过重新调整队列工作程序(例如,在 Horizon 的帮助下)? IE。对于长度为 0 的队列,可以减少工作人员,对于长度为 1000 的队列,可以增加工作人员。 Laravel Horizon 会在
balance模式auto(see docs) 运行时自动为您执行此操作。 -
别这样,你会被烧死的。像
php artisan queue:worker --queue=high,low这样启动所有工作人员,这意味着high队列将首先得到处理。high/low主要是为您/开发人员命名队列。 -
@Namoshek 你说“我不确定是否手动干预”,但我猜 Horizon 是手动做的?
-
不,不是。 Horizon 只是重新扩展队列工作进程。例如,您可以将其配置为默认情况下有 3 个进程用于
high队列和 3 个进程用于low队列。但根据工作量,Horizon 会将流程重新调整为 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