laravel5.5+框架中安全的停止关闭运行中的队列

2023-06-01 00:00:00 框架 队列 停止

说到laravel就想到优雅二字,那么在laravel框架中如果优雅关闭/停止队列,如何安全的停止工作中的队列呢?


我们来看看队列相关命令

目前 Laravel5.5+未提供关闭队列的命令:

art | grep queue
  horizon:clear                  Delete all of the jobs from the specified queue
  horizon:forget                 Delete a failed queue job
  horizon:snapshot               Store a snapshot of the queue metrics
 queue
  queue:batches-table            Create a migration for the batches database table
  queue:clear                    Delete all of the jobs from the specified queue
  queue:failed                   List all of the failed queue jobs
  queue:failed-table             Create a migration for the failed queue jobs database table
  queue:flush                    Flush all of the failed queue jobs
  queue:forget                   Delete a failed queue job
  queue:listen                   Listen to a given queue
  queue:restart                  Restart queue worker daemons after their current job
  queue:retry                    Retry a failed queue job
  queue:retry-batch              Retry the failed jobs for a batch
  queue:table                    Create a migration for the queue jobs database table
  queue:work                     Start processing jobs on the queue as a daemon


解决方案:


启动队列:

queue:work 

有个参数 --stop-when-empty 可以让队列运行完成后退出


运行中的队列

queue:restart 

命令会等待队列中的 任务完成后 重启队列(优雅重启)


此命令同样作用于 Supervisor 运行的 

queue:work --daemon

不过需要在 supervisor 的配置中加入 

autorestart=true 进行设置。


队列 worker & 部署


因为队列 worker 是长生命周期的进程,所以在重启之前,任何的代码更改都不会生效。

因此,使用队列 worker 部署应用程序的最简单方法是在部署过程中重新启动 worker。

你可以通过执行 queue:restart 命令来优雅地重新启动所有的 

worker:

php artisan queue:restart


该命令将指示所有队列 worker 在完成当前任务后优雅地 “死亡”,这样就不会丢失现有的任务。

由于在执行 

queue:restart 

命令时,队列 worker 将被杀掉,因此你应该运行一个进程管理器 

(如 Supervisor) 来自动重新启动队列 worker。


技巧:

队列使用 缓存 来存储重启信号,因此在使用该特性之前,

你应该检查应用程序的缓存驱动程序是否正确配置。


相关链接:

https://learnku.com/docs/laravel/8.5/queues/10395#b08a06


相关文章