一般而言有些會阻塞運行程序的任務浮创,我們會采用隊列服務已經異步調用果正,這樣可以實現非阻塞服務。之前有個需求是調用支付寶的服務郑叠,因為調用第三方的服務時間和成功不可控,所以處理成隊列異步服務明棍,發(fā)現功能竟然不可用乡革,所以一步一步排查后解決這個問題。
- 首先要確認的是隊列的代碼是否正確摊腋,Lumen和Laravel一樣沸版,都是需要繼承虛擬基類Job,并且在handle方法中實現業(yè)務代碼兴蒸。
class DeleteBill extends Job
{
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
*****
}
}
- 確認調用處調用隊列服務的地方是否正確视粮。這里需要注意的是,Laravel文檔里是用的dispatch分發(fā)調用:$this->dispatch(new DeleteBill()); 另外還有一種方法是使用Queue對象的push方法:Queue::push(new DeleteBill());這兩種方式都是可以調用成功橙凳,它會把任務塞到相應的隊列中蕾殴。
- 接下來是要檢查系統(tǒng)的隊列服務配置是否正確笑撞,可以查看config文件夾下的queue.php的配置。隊列一般支持"sync", "database", "beanstalkd","sqs", "iron", "redis"這幾種区宇,我們可以自定義自己的具體配置方式:
'default' => env('QUEUE_DRIVER', 'sync')
類似于這樣配置娃殖,在env文件中想要配置哪種都可以值戳。本人使用的是redis服務议谷,然后在database.php查看redis配置:
'redis' => [
'cluster' => env('REDIS_CLUSTER', false),
'default' => [
'host' => env('REDIS_HOST', '121.41.13.126'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
'password' => env('REDIS_PASSWORD', null),
],
]
- 查看服務器對應的配置和服務器redis啟動參數是否正確,可以使用命令:ps aux | grep redis-server來查看服務是否啟動以及對應的端口號堕虹。
- 這些都正確卧晓,然后來看下Laravel&Lumen啟動隊列服務,使用php artisan queue:work來消費隊列中的服務赴捞,至于隊列錯誤重復次數設定還有超時時間等增強功能可以查看Laravel文檔來仔細解讀逼裆。
- 最后我們使用Supervisor來監(jiān)控隊列,它將會在失敗時自動重啟queue:listen或queue:work命令赦政,這樣就可以達到隨時分發(fā)的任務都可以被消費胜宇,這是比較方便的。以下是安裝以及配置Supervisor的相關命令:
sudo apt-get install supervisor
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02dcommand=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemonautostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
sudo supervisord -c /etc/supervisord.confsudo
supervisorctl -c /etc/supervisor/supervisord.conf
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
這次排查整個隊列服務恢着,使得對于框架整個隊列服務有了深刻的理解桐愉。以這邊文章來記錄整個過程。
大家喜歡可以訪問我的個人網站:http://www.yingminxing.com
如有疑問掰派,歡迎溝通交流:QQ:370399195, 微信:yingminxing1988