gpt4 book ai didi

laravel - 如果 worker 数量 > 1,Heroku worker 会在 laravel 应用程序中崩溃

转载 作者:行者123 更新时间:2023-12-04 07:56:45 24 4
gpt4 key购买 nike

几年来,我一直在使用 Heroku 来托管我的应用程序,然后才开始遇到工作队列积压的问题。我希望我可以通过增加运行的工作人员数量来解决这个问题,以便可以并行完成排队的作业,但是每当我增加我的工作人员数量时,除了一个崩溃之外,其他人都崩溃了。

这是我的 Procfile:

web: vendor/bin/heroku-php-apache2 public
worker: php /app/artisan queue:restart && php /app/artisan queue:work redis --tries=3 --timeout=30

这是当我将我的工作人员扩展到大于 1 的任何值时(在本例中,它只是将其扩展到 2 个工作人员)我的服务器日志的输出:

    Mar 16 06:04:51 heroku/worker.1 Starting process with command `php /app/artisan queue:restart && php /app/artisan queue:work redis --tries=3 --timeout=30`
Mar 16 06:04:52 heroku/worker.1 State changed from starting to up
Mar 16 06:04:54 app/worker.1 Broadcasting queue restart signal.
Mar 16 06:04:58 heroku/worker.2 Process exited with status 0
Mar 16 06:04:58 heroku/worker.2 State changed from up to crashed
Mar 16 06:04:58 heroku/worker.2 State changed from crashed to starting
Mar 16 06:05:09 heroku/worker.2 Starting process with command `php /app/artisan queue:restart && php /app/artisan queue:work redis --tries=3 --timeout=30`
Mar 16 06:05:10 heroku/worker.2 State changed from starting to up
Mar 16 06:05:14 app/worker.2 Broadcasting queue restart signal.
Mar 16 06:05:19 heroku/worker.1 Process exited with status 0
Mar 16 06:05:19 heroku/worker.1 State changed from up to crashed

如您所见,两个 worker 都尝试启动,但只有 worker.2 保持启动状态。

崩溃的工作人员每 10 分钟尝试重新启动一次,结果与上述相同。

当我运行 heroku ps 时,这是我看到的:

    === worker (Standard-1X): php /app/artisan queue:restart && php /app/artisan queue:work redis --tries=3 --timeout=30 (2)
worker.1: crashed 2021/03/16 06:05:19 -0600 (~ 20m ago)
worker.2: up 2021/03/16 06:05:10 -0600 (~ 20m ago)

(我的普通 web dynos 可以很好地放大和缩小,所以我没有在这里显示)。

关于可能发生的事情有什么想法吗?我的第一个想法是 Heroku 出现了问题,但我意识到情况并非如此。我的第二个想法是,我的工作人员的 Procfile 条目可能会导致问题,但我对该条目的了解还不够,无法知道可能是什么原因。

同样,这对 1 名工作人员来说已经运行了很长时间,只有当我尝试扩展到超过 1 名工作人员时才会发生崩溃。无论我尝试扩展到多少个工作器,只有一个不会崩溃并保持事件状态并且能够接收和处理作业。

杂项信息:

  • Heroku 堆栈:Heroku-18
  • Laravel 版本:8.*
  • 队列驱动:Redis

更新 - 我在暂存环境中扩展了测功机,并且能够在没有任何崩溃的情况下上下扩展工作人员。现在我在想可能存在某种附加冲突或其他事情。如果我发现任何其他问题,我会更新这个(已经联系了 Heroku 支持)。

最佳答案

问题出在 procfile 中的 php/app/artisan queue:restart 命令。正在启动的工作人员和正在调用的重新启动命令导致信号冲突,最终导致除一名工作人员外的所有工作人员崩溃。

我删除了那个命令,现在我可以毫无问题地扩展我的工作人员。

=== worker (Standard-1X): php /app/artisan queue:work redis --queue=high,default,sync,emails,cron --tries=3 --timeout=30 (2)
worker.1: up 2021/03/17 17:29:32 -0600 (~ 8m ago)
worker.2: up 2021/03/17 17:35:58 -0600 (~ 2m ago)

当对 Heroku 进行部署时,dynos 会收到一个 SIGTERM 信号,该信号会终止任何挥之不去的进程,然后重新启动 dynos。这意味着 php/app/artisan queue:restart 命令是多余且不必要的。

主要的困惑来自于 Laravel 对需要重启的队列 worker 信息的措辞方式:https://laravel.com/docs/8.x/queues#queue-workers-and-deployment .这对于不像 Heroku 那样处理测功机的服务器是必需的。

关于laravel - 如果 worker 数量 > 1,Heroku worker 会在 laravel 应用程序中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66662107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com