真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

laravel異步監(jiān)控定時(shí)調(diào)度器的實(shí)現(xiàn)-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)laravel異步監(jiān)控定時(shí)調(diào)度器的實(shí)現(xiàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的門頭溝網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

定時(shí)調(diào)度器是什么


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


執(zhí)行命令是php artisan schedule:run 來執(zhí)行,那放在哪里執(zhí)行呢,沒錯(cuò)這個(gè)調(diào)起還是需要依賴我們crontab來執(zhí)行,但是只需要配置一次,后續(xù)所有定時(shí)任務(wù)都在我們業(yè)務(wù)代碼進(jìn)行控制


場景


我們有一個(gè)導(dǎo)入數(shù)據(jù)的定時(shí)任務(wù)


//每分鐘導(dǎo)入庫數(shù)據(jù)
$schedule->command(self::SIGNATURE)->withoutOverlapping()->everyMinute()->runInBackground();

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


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

出現(xiàn)問題


這個(gè)任務(wù)在正常情況下都是非常完美的,因?yàn)橥粫r(shí)刻只有一個(gè)再跑,跑完就可以,但是一個(gè)場景出現(xiàn)
有一天我們的qa同學(xué)剛部署環(huán)境后,我們服務(wù)端就在默默的導(dǎo)入庫了,因?yàn)槭褂?code>withoutOverlapping($expire_at=1440)這個(gè)時(shí)候在redis就有一個(gè)鎖產(chǎn)生了,這個(gè)默認(rèn)帶參數(shù)是鎖的過期時(shí)間,默認(rèn)是一天,然后因?yàn)槲覀僤ocker環(huán)境需要更改參數(shù)然后進(jìn)行后端server服務(wù)的重啟,我們重啟也是比較暴力,就是直接發(fā)送kill的信號,導(dǎo)致所有在里面跑的進(jìn)程瞬間kill,而這時(shí)候我們的redis的鎖缺還存在,而且是1440分鐘左右,那當(dāng)我們server再啟動(dòng)后,發(fā)現(xiàn)鎖一直存在,沒辦法進(jìn)行后續(xù)的操作了,只能等著。


解決

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


后來我們一想,能否做到一個(gè)監(jiān)控程序呢,進(jìn)程退出后立馬監(jiān)控到過期呢,這樣就不用固定一個(gè)時(shí)間,這當(dāng)然是所有軟件開發(fā)者理想狀態(tài):要你開你就開,我掛了鎖也就去掉了,不論正常與否。

解決方案

laravel異步監(jiān)控定時(shí)調(diào)度器的實(shí)現(xiàn)

說明:

  • 這里命令啟動(dòng)時(shí)候,獲取進(jìn)程的pid,然后fork子進(jìn)程,可以將這個(gè)pid傳遞給子進(jìn)程。

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

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

看完上述內(nèi)容,你們對laravel異步監(jiān)控定時(shí)調(diào)度器的實(shí)現(xiàn)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


文章標(biāo)題:laravel異步監(jiān)控定時(shí)調(diào)度器的實(shí)現(xiàn)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://weahome.cn/article/cshpei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部