在使用 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
- 創建 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 運行,在生產環境下根據實際情況進行修改。
- 啟動 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 隊列一直執行的方法,通過守護進程、任務編排、第三方服務等方式,可以為隊列提供更加穩定、高效的運行支持。每種方法都有各自的優點和適用范圍,具體選擇哪一種方法,需要根據自己的實際情況來做出決策。