首頁  >  文章  >  php框架  >  laravel隊列如何一直執行

laravel隊列如何一直執行

王林
王林原創
2023-05-21 09:45:071116瀏覽

在使用 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
  1. 在專案根目錄下建立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
  1. ##執行以下指令,啟動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#.SQSm&m_wm_h_wm_ our_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 佇列一直執行的方法,透過守護進程、任務編排、第三方服務等方式,可以為佇列提供更穩定、高效的運作支援。每種方法都有各自的優點和適用範圍,具體選擇哪一種方法,需要根據自己的實際情況來做決策。

以上是laravel隊列如何一直執行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn