91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

laravel怎么實現異步監控定時調度器

發布時間:2022-12-09 10:03:03 來源:億速云 閱讀:119 作者:iii 欄目:開發技術

這篇文章主要講解了“laravel怎么實現異步監控定時調度器”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“laravel怎么實現異步監控定時調度器”吧!

定時調度器是什么

laravel默認提供了一個命令定時任務的功能,在其他的php框架下面,沒有這個定時任務,我們要跑一些異步腳本怎么操作呢,只能依賴我們系統提供的crontab來做,這就導致我們每次發版本新增定時任務都要去服務器更改crontab代碼,獲取更新這個配置。

執行命令是php artisan schedule:run 來執行,那放在哪里執行呢,沒錯這個調起還是需要依賴我們crontab來執行,但是只需要配置一次,后續所有定時任務都在我們業務代碼進行控制

場景

我們有一個導入數據的定時任務

//每分鐘導入庫數據
$schedule->command(self::SIGNATURE)->withoutOverlapping()->everyMinute()->runInBackground();

這里導入長時間最好使用runInBackground(),表示異步執行,其實就是在shell腳本的末尾加上 & 符號,在linux上完全依賴系統的方式完成。

這里使用了withoutOverlapping() 表示在同一時刻只能有一個任務執行,主要邏輯使用的是排它鎖實現,依賴于我們cache的driver,我這里使用的是redis,后面作為鎖的過期直接redis提供的key過期來做。

出現問題

這個任務在正常情況下都是非常完美的,因為同一時刻只有一個再跑,跑完就可以,但是一個場景出現
有一天我們的qa同學剛部署環境后,我們服務端就在默默的導入庫了,因為使用withoutOverlapping($expire_at=1440)這個時候在redis就有一個鎖產生了,這個默認帶參數是鎖的過期時間,默認是一天,然后因為我們docker環境需要更改參數然后進行后端server服務的重啟,我們重啟也是比較暴力,就是直接發送kill的信號,導致所有在里面跑的進程瞬間kill,而這時候我們的redis的鎖缺還存在,而且是1440分鐘左右,那當我們server再啟動后,發現鎖一直存在,沒辦法進行后續的操作了,只能等著。

解決

那我把鎖的時間減少行不行,原來1天,我改成30分鐘,沒問題,開始第一版方案我們也是這樣做,官方也是可以這樣做的。

后來我們一想,能否做到一個監控程序呢,進程退出后立馬監控到過期呢,這樣就不用固定一個時間,這當然是所有軟件開發者理想狀態:要你開你就開,我掛了鎖也就去掉了,不論正常與否。

解決方案

laravel怎么實現異步監控定時調度器

說明:

  • 這里命令啟動時候,獲取進程的pid,然后fork子進程,可以將這個pid傳遞給子進程。

  • 子進程每隔10s進行一個探活,獲取父進程的id與傳入的pid是否一致,這里普及一個知識點,如果父進程異常退出,這個子進程未退出就會被init進程(pid=1)接管,那么這就是一個孤兒進程。

  • 同時子進程每次探活的時候就會更改redis的鎖的過期時間,如果探活時間間隔是10s,那么我們的過期時間設置就是14s,多冗余一點時間。

感謝各位的閱讀,以上就是“laravel怎么實現異步監控定時調度器”的內容了,經過本文的學習后,相信大家對laravel怎么實現異步監控定時調度器這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

揭东县| 清新县| 喜德县| 延庆县| 无锡市| 鄂托克前旗| 鄄城县| 偃师市| 凤城市| 靖州| 子长县| 武隆县| 乳山市| 通榆县| 泽州县| 利川市| 门头沟区| 孝感市| 祁连县| 绍兴县| 宜城市| 武功县| 高台县| 张家川| 政和县| 肇庆市| 宣恩县| 博兴县| 德清县| 孝义市| 霸州市| 庄河市| 正蓝旗| 萨迦县| 新乡市| 富锦市| 和田市| 巫溪县| 潞城市| 岐山县| 鸡东县|