laravel隊列如何一直執行

在使用 laravel 的開發中,隊列常常是必不可少的一部分。它能夠極大的提高應用程序的并發處理能力,讓大量的任務能夠得到有效的管理和處理。但是在實際開發中,我們經常會遇到這樣一個問題:隊列不穩定,任務多時隊列突然停止了,或者任務出現異常時隊列也無法自動重啟。這時我們就需要一些技巧,讓隊列能夠穩定的運行下去。下面就介紹幾種方法,幫助大家解決這些問題。

一、supervisor 守護進程

supervisor 是一款用 Python 寫的進程控制系統,是 Linux 服務器上管理進程的一種常見的工具,可以幫助我們在后臺不停的監控一個進程,如果這個進程因某種原因退出了,那么它能夠隨著宿主進程重新啟動。這就能保證你的隊列一直能夠運行下去。

安裝 supervisor

Centos 系統執行

yum install -y supervisor

Ubuntu 系統執行

apt-get install -y supervisor

打開配置文件

vim /etc/supervisord.conf

加入我們的 laravel-queue 配置節

[program:laravel-queue]
command=php /path/to/artisan queue:work redis –sleep=3 –tries=3
directory=/path/to/your/project
autostart=true
autorestart=true
user=www-data

說明:

  • program:定義進程的名稱
  • command:定義運行命令
  • autostart:開機自啟動
  • autorestart:自動重啟
  • user:運行進程的用戶

保存修改后加載配置

supervisorctl reload

啟動隊列

supervisorctl start laravel-queue

這樣就可以實現對隊列的守護進程了。如果隊列停止了,這個進程就會自動重啟,從而保證隊列一直在運行。當然,配置文件中也可以通過配置運行多個 work 進程,提高隊列處理能力。

二、使用 Hashicorp 的 Nomad 集成 Marathon

Hashicorp 的 Nomad 與 Marathon 操作類似,它們都是用于分布式任務編排的一款開源的工具。Nomad 通過抽象化任務的位置和決策,能夠對一組不同類型的任務進行編排。Nomad 與 Marathon 相比具有輕量、用戶體驗度高、易于配置的優勢。

使用 Nomad 需要 docker 環境,如果你沒有安裝 docker,可以先通過 apt-get 安裝:

apt-get install -y docker.io

  1. 創建 Nomad Job

在項目根目錄下創建 job.nomad 文件,通過配置創建一個 Nomad Job:

job “laravel_app” {
datacenters = [“dc1”]
type = “service”

group “app” {

task "laravel-queue" {   driver = "docker"    config {     image = "your_docker_image"     command = ["php", "artisan", "queue:work", "--tries", "1", "--timeout", "30"]     args = [       "--queue=critical,high,default,email,chat,sms",       "--sleep=3"     ]     ports = ["http"]   }    resources {     cpu    = 500     memory = 128     network {       mbits = 10       port "http" {}     }   }    service {     name = "laravel-queue"     port = "http"     check {       type     = "http"       path     = "/status"       interval = "10s"       timeout  = "2s"     }   }    restart {     attempts = 10     interval = "5m"     delay    = "25s"     mode     = "failures"   } }

}
}

以上的配置文件在單機模式下使用的是 docker 運行,在生產環境下根據實際情況進行修改。

  1. 啟動 Nomad Job

執行以下命令,啟動 Nomad Job:

nomad run job.nomad

至此就完成了隊列的啟動。Nomad 會在一個節點上運行我們的 Job,同時可以對該 Job 進行監控;當任務出現問題,Nomad 可以快速的重啟任務并更新狀態。Nomad Job 可以在集群中的不同節點間自動遷移,這樣可以減輕某個節點的負載,提高了總體應用程序的的魯棒性。

三、使用 AWS SQS

AWS 的 SQS(Simple Queue Service)是一款用于消息隊列的服務,它可以在分布式應用程序之間高效地傳遞和處理消息,并允許應用程序之間的消息處理能力實現水平伸縮。在 Laravel 框架中,SQS 可以非常方便地集成到我們的應用程序中,只需要安裝支持 SQS 的 Laravel Queue 包即可。同時,在 AWS 的 SQS 中,每一個隊列都有一個最小可生命周期(TTL),如果在該時間段內未被執行成功,則該任務會被 SQS 刪掉。這樣可以保證一個任務最終一定會被執行成功。

安裝 SQS

在 Laravel 中集成 SQS 相對比較簡單,只需要安裝支持 SQS 的 Laravel Queue 包即可。可以直接通過 Composer 安裝:

composer require “aws/aws-sdk-php ^3.0”

配置 SQS

在 .env 配置文件中添加以下內容:

QUEUE_DRIVER=sqs
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_DEFAULT_REGION=us-west-2
SQS_PREFIX=your_queue_prefix

替換 your_aws_access_key、your_aws_secret_key 和 your_queue_prefix 為你自己的。

啟動隊列

php artisan queue:work sqs –queue=default –tries=3 –sleep=3 –timeout=60

以上命令會啟動一個 SQS 隊列,并使用默認的 default 隊列,其中 –tries 參數表示隊列任務出錯嘗試的次數,–sleep 表示隊列處理完任務休息的時間,–timeout 表示隊列任務超時時的自動重試時間。隊列會不斷循環獲取任務并執行:

出現錯誤時,隊列會自動重試,直至隊列任務出錯嘗試的次數用完或者執行成功為止。

總結

在本文中,我們介紹了幾種讓 Laravel 隊列一直執行的方法,通過守護進程、任務編排、第三方服務等方式,可以為隊列提供更加穩定、高效的運行支持。每種方法都有各自的優點和適用范圍,具體選擇哪一種方法,需要根據自己的實際情況來做出決策。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享