您好,登錄后才能下訂單哦!
這篇文章主要講解了“l(fā)aravel異步監(jiān)控定時調(diào)度器如何實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“l(fā)aravel異步監(jiān)控定時調(diào)度器如何實現(xiàn)”吧!
定時調(diào)度器是什么
laravel默認(rèn)提供了一個命令定時任務(wù)的功能,在其他的php框架下面,沒有這個定時任務(wù),我們要跑一些異步腳本怎么操作呢,只能依賴我們系統(tǒng)提供的crontab來做,這就導(dǎo)致我們每次發(fā)版本新增定時任務(wù)都要去服務(wù)器更改crontab代碼,獲取更新這個配置。
執(zhí)行命令是php artisan schedule:run
來執(zhí)行,那放在哪里執(zhí)行呢,沒錯這個調(diào)起還是需要依賴我們crontab來執(zhí)行,但是只需要配置一次,后續(xù)所有定時任務(wù)都在我們業(yè)務(wù)代碼進(jìn)行控制
場景
我們有一個導(dǎo)入數(shù)據(jù)的定時任務(wù)
//每分鐘導(dǎo)入庫數(shù)據(jù) $schedule->command(self::SIGNATURE)->withoutOverlapping()->everyMinute()->runInBackground();
這里導(dǎo)入長時間最好使用runInBackground(),表示異步執(zhí)行,其實就是在shell腳本的末尾加上 & 符號,在linux上完全依賴系統(tǒng)的方式完成。
這里使用了withoutOverlapping() 表示在同一時刻只能有一個任務(wù)執(zhí)行,主要邏輯使用的是排它鎖實現(xiàn),依賴于我們cache的driver,我這里使用的是redis,后面作為鎖的過期直接redis提供的key過期來做。
出現(xiàn)問題
這個任務(wù)在正常情況下都是非常完美的,因為同一時刻只有一個再跑,跑完就可以,但是一個場景出現(xiàn)
有一天我們的qa同學(xué)剛部署環(huán)境后,我們服務(wù)端就在默默的導(dǎo)入庫了,因為使用withoutOverlapping($expire_at=1440)
這個時候在redis就有一個鎖產(chǎn)生了,這個默認(rèn)帶參數(shù)是鎖的過期時間,默認(rèn)是一天,然后因為我們docker環(huán)境需要更改參數(shù)然后進(jìn)行后端server服務(wù)的重啟,我們重啟也是比較暴力,就是直接發(fā)送kill的信號,導(dǎo)致所有在里面跑的進(jìn)程瞬間kill,而這時候我們的redis的鎖缺還存在,而且是1440分鐘左右,那當(dāng)我們server再啟動后,發(fā)現(xiàn)鎖一直存在,沒辦法進(jìn)行后續(xù)的操作了,只能等著。
解決
那我把鎖的時間減少行不行,原來1天,我改成30分鐘,沒問題,開始第一版方案我們也是這樣做,官方也是可以這樣做的。
后來我們一想,能否做到一個監(jiān)控程序呢,進(jìn)程退出后立馬監(jiān)控到過期呢,這樣就不用固定一個時間,這當(dāng)然是所有軟件開發(fā)者理想狀態(tài):要你開你就開,我掛了鎖也就去掉了,不論正常與否。
解決方案
說明:
這里命令啟動時候,獲取進(jìn)程的pid,然后fork子進(jìn)程,可以將這個pid傳遞給子進(jìn)程。
子進(jìn)程每隔10s進(jìn)行一個探活,獲取父進(jìn)程的id與傳入的pid是否一致,這里普及一個知識點,如果父進(jìn)程異常退出,這個子進(jìn)程未退出就會被init進(jìn)程(pid=1)接管,那么這就是一個孤兒進(jìn)程。
同時子進(jìn)程每次探活的時候就會更改redis的鎖的過期時間,如果探活時間間隔是10s,那么我們的過期時間設(shè)置就是14s,多冗余一點時間。
感謝各位的閱讀,以上就是“l(fā)aravel異步監(jiān)控定時調(diào)度器如何實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對laravel異步監(jiān)控定時調(diào)度器如何實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。