Laravel Redis佇列的使用 配置Horizon和Supervisor守護程序
環境:lz用的是Homestead5.4.0 Laravel5.5
(一)佇列的配置檔案路徑:config/queue.php,Laravel為我們提供了多種驅動的配置:sync, database,beanstalkd,sqs,redis。
sync是預設的驅動,選擇該驅動任務會立即執行(同步),供本地使用。
附上官方文件的解釋:a synchronous driver that will execute jobs immediately (for local use)
(二)本文主要說Redis驅動,請確保QUEUE_DRIVER的值是redis
要使用Redis驅動確保環境中已安裝redis,以及redis依賴擴充套件,lz用的是predis
lz要實現的功能生成artisan命令,命令中分發任務
(1)生成任務
執行命令php artisan make:job TestJob,生成的檔案預設放在app/jobs目錄,由於主要想先把佇列跑通,所以這裡不寫具體的業務邏輯,只在任務的handle()方法裡列印個log,另一個job在此不提。
(2)分發任務 :artisan命令的程式碼
這裡lz想說下指定佇列和指定連線:
指定佇列連線:前面說過laravel為我們提供了多種佇列的驅動配置,只要安裝了相應的驅動,使用onConnection('')即可指定使用的驅動;
指定佇列:如果想指定佇列,使用onQueue即可,名字隨便取;
(3)執行佇列處理器
執行佇列處理器的命令為php artisan queue:work 。該命令執行後將一直在後臺執行,直至手動或者有錯誤導致退出。
示例:
php artisan queue:work redis --queue=test,sms
該命令引數redis指定了佇列的連線,你可以在這裡佇列配置檔案中的任何一種連線(一定要配好驅動),
該命令的--queue選項 有兩個作用 :指定了佇列為test,sms;同時也指定了佇列先後順序,列印log就能發現test佇列線上sms在後
執行此命令後會看到佇列處理器工作的日誌(後期補圖,忽略內容詳細資訊),如果沒有看到日誌請去檢查QUEUE_DRIVER是否配置為了redis
(4)Horizon
由於Horizon是Laravel官方擴充套件,看起來很高大上的樣子,不知道效能如何。
安裝過程:
-----安裝依賴composer require laravel/horizon;
-----釋出依賴php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider",此時會在config目錄下生成horizon.php檔案;
----負載均衡配置-可暫時按照預設設定;
----許可權配置修改AppServiceProvider檔案;
Horizon::auth(function ($request) {
//這裡可以寫許可權相應的邏輯,符合什麼條件才可以訪問監控面板
//最後應該返回true以確保我們可以在瀏覽器中訪問到面板
return true / false;
});
----執行php artisan horizon啟動面板,訪問 你的域名/horizon可以看到監控面板已處於啟用狀態,但是此時我們發現面板Metrics和Recent Jobs選單裡什麼資料都沒有展示,我們需要再執行下面的操作;
----在app/Console/Kernel.php檔案中新增命令$schedule->command('horizon:snapshot')->everyFiveMinutes();以獲取資料填充面板。
(5)要保證佇列處理器的正常執行我們需要安裝程序守護程式Supervisor
簡單介紹下Supervisor,Linux/Unix經常用它來維護程序,不支援Windows,當程序意外終止時Supervisor會自動將程序重啟,該工具由Python編寫,所以需要Python的執行環境。
安裝過程:
----安裝supervisor,執行命令yum install supervisor
----執行cat /etc/supervisord.會發現etc多了一個檔案和一個目錄;
/etc/supervisord.conf為主配置檔案,一般不建議把其它程序寫進主配置檔案;
/etc/supervisord.d目錄即為放置其他程序配置檔案的目錄;
----檢視/etc/supervisor.conf檔案最後一行,意思是配置檔案載入時會載入supervisord.d目錄下字尾名是ini的檔案,我們為監控面板和佇列執行器的配置守護程序時的配置檔案寫到這個目錄
----為後臺的horizon配置守護程序,新建 /etc/supervisord.d/horizon.ini程序檔案,內容為
[program:horizon-bg]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/share/nginx/html/operation/artisan horizon
autostart=true
autorestart=true
user=nginx
redirect_stderr=true
stdout_logfile=/root/queue/operation-horizon.log //日誌路徑,確保路徑存在
----為後臺的佇列處理器配置守護程序,新建/etc/supervisord.d/worker.ini程序檔案,內容為
[program:worker-bg]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/share/nginx/html/operation/artisan queue:work redis --queue=test_a,test_b --sleep=3 --tries=3
autostart=true //自動開啟
autorestart=true //自動重啟
user=root //啟動程序的使用者
numprocs=8 //程序數量
stdout_logfile=/root/queue/operation-worker-bg.log //日誌路徑,確保路徑存在
----啟動supervisor
supervisord -c /etc/supervisord.conf
supervisorctl -c /etc/supervisord.conf
執行後可以看到horizon有一個程序worker有個8個,佇列執行器的程序數可以在配置檔案中配置
================================================================================================================================================================================================
目前針對 多臺伺服器都要部署監控佇列服務 想到的解決方案:
在兩臺伺服器都需要配置horizon和supervisor服務;
supervisor守護程序需要為佇列執行器和horizon編寫配置檔案;
但是抓取資料的計劃任務只需要部署到一臺伺服器即可。
歡迎指正