Laravel 隊列系統

使用場景

  • 異步 - 耗時任務延遲處理,縮短請求響應時間,提升反饋效率,避免程序超時
  • 重試 - 確保任務的可靠執行

配置

隊列驅動支持
config/queue.php每一個隊列驅動都基於底層鏈接,且經過屬性queue指定默認隊php

  • 原生支持Redis、Beanstalkd、Database(需:php artisan queue:table && php artisan migrate)、Sqs、IronMQ
  • 原生測試支持sysnc同步驅動(當即執行Job)null驅動(簡單丟棄Job)
  • 開源第三方驅動支持RabbitMQ、Kafka

Fail表準備html

php artisan queue:failed-table
php artisan migrate

Job建立

  • php artisan make:job MyJob(默認實現接口ShouldQueue以隊列化的異步執行)
  • 構造函數傳參model實例,則僅有ID會被序列化並存入隊列,消費時經過ID於數據庫從新取回
  • $myJob = new MyJob(); dispatch($myJob);
    • handle方法:Job消費邏輯
    • failed(Exception $exception)方法:Job失敗後的收尾邏輯
  • 同類型Job建議投遞到同一隊列上(好比短信Job郵件Job都投遞到notification隊列上)

Job定製

  • 指定延遲:$myJob->delay(Carbon::now()->addMinutes(10))
  • 指定隊列:$myJob->onQueue(指定隊)
  • 指定鏈接:$myJob->onConnection(指定鏈接)
  • 指定Job重試次數:public $tries = 3;(Job執行中發生Excepion則被退回隊列並重試)
  • 指定Job運行超時:public $timeout = 60;(秒)

##Queue執行數據庫

  • 保持運行直至手動中止
  • 長時間運行進程,並使用啓動時的代碼上下文
  • --queue參數前後順序可指定優先級
  • 留意在完成Job後釋放相關資源
# 啓動隊列執行器
* 生產環境(高效模式):php artisan queue:work --daemon [--quiet ] [--delay=3] [--sleep=隊列空後的休眠時間] [--tries=3] [--timeout=30] [--memory=默認128M] [--queue=隊列1,隊列2] [指定鏈接]
* 測試環境(每次重載上下文):php artisan queue:listen [--tries=3] [--timeout=30] [--sleep=隊列空後的休眠時間] [--queue=隊列1,隊列2] [指定鏈接]

# 重啓隊列執行器(以便在項目部署時重載代碼上下文)
php artisan queue:restart

Queue 超時&過時

  • 過時(隊列鏈接的retry_after屬性)指定了Job重試的等待時間
  • 超時(--timeout)指定了處理Job的子隊列執行器被kill前的超時時間
  • 超時應該確保比過時時間短几秒,這樣Job會先超時被kill,而後在到達過時時間後被重試

Job失敗

失敗流程bash

  • 每當Job失敗,執行failed(Exception $exception)方法中失敗後的收尾邏輯
  • 若是Job在最終嘗試後還失敗,則入表failed_jobs

FailedJob處理異步

  • 羅列 php artisan queue:failed
  • 重試 php artisan queue:retry all|jobID
  • 刪除 php artisan queue:forget all|jobID
  • 清空 php artisan queue:flush

Job監聽

# AppServiceProvider::boot 中註冊Job事件的監聽
//$event->connectionName
//$event->job->payload()
//$event->exception

Queue::before(function(JobProcessing $event){});
Queue::after(function(JobProcessed $event){});

Queue::failing(function(JobFailed $event){});

# queue worker請求Job前
Queue::looping(function(){
	# 可處理一些回滾
    while (DB::transactionLevel() > 0) {
        DB::rollBack();
    }
});

隊列消費服務

經過supervisor啓動隊列消費服務ide

  • 進程守護隊列消費服務
  • 多進程方式消費隊列中的Job

配置函數

# /etc/supervisor/conf.d/queue-worker-test.conf
    [program:queue-worker-test]
    process_name=%(program_name)s_%(process_num)02d
    directory=/var/www/html
    command=php artisan queue:work --daemon --quiet --delay=3 --sleep=3 --tries=3 --memory=1024 --queue=test
    autostart=true
    autorestart=true
    user=www
    numprocs=5 #當>1時, process_name必須有%(process_num)
    priority=997
    stopsignal=QUIT
    redirect_stderr=true
    stdout_logfile=/dev/null
    stdout_logfile_maxbytes=0
    stdout_logfile_backups=0
    stderr_logfile=/dev/null
    stderr_logfile_maxbytes=0
    stderr_logfile_backups=0

啓動oop

sudo supervisorctl reread
	sudo supervisorctl update
	sudo supervisorctl start queue-worker-test:*
相關文章
相關標籤/搜索