摘要:對于定時任務(wù)的基本用法,官網(wǎng)文檔已經(jīng)描述得很詳細(xì)了,這里不再多說。這種情況下如果定時任務(wù)能夠并行執(zhí)行,就不會有這樣的問題。這個時候我們希望能夠像隊列那樣,將定時任務(wù)分散到多臺服務(wù)器上。
定時任務(wù) Scheduled Tasks 是 Laravel 提供的組件之一,稍微上點規(guī)模的項目應(yīng)該都會用到,比如開發(fā)微信應(yīng)用時通過定時任務(wù)去刷新access token,比如每天定時發(fā)推送提現(xiàn)用戶要記得簽到。對于定時任務(wù)的基本用法,官網(wǎng)文檔已經(jīng)描述得很詳細(xì)了,這里不再多說。
本文主要是介紹定時任務(wù)在實際應(yīng)用中的兩個小技巧:
1. 多個任務(wù)并行執(zhí)行先簡單介紹一下 Laravel 定時任務(wù)組件的基本原理:
當(dāng)cli初始化完畢之后,系統(tǒng)會調(diào)用 AppConsoleKernel::schedule 方法,也就是我們定義定時任務(wù)列表的地方,這個方法里每調(diào)用一次 $schedule->command() 就會生成一個 IlluminateConsoleSchedulingEvent 對象并保存在 $schedule->events 數(shù)組里。當(dāng)執(zhí)行 php artisan scheduled:run 時,系統(tǒng)會遍歷 $schedule->events,把當(dāng)前時間需要執(zhí)行的任務(wù)放在一個集合中,最后依次 串行執(zhí)行 這些任務(wù)。
這樣做在大多數(shù)情況下是沒有問題的,但有一些特殊的情況,比如在每個月的第一天要給100W個用戶發(fā)送郵件,同一批次的定時任務(wù)必須等到這些郵件全部發(fā)送完畢之后才會被執(zhí)行,假如這些任務(wù)里有對執(zhí)行時間十分敏感的任務(wù),比每5分鐘一次的數(shù)據(jù)快照,就會導(dǎo)致那個時間點數(shù)據(jù)的缺失。
這種情況下如果定時任務(wù)能夠并行執(zhí)行,就不會有這樣的問題。Laravel 實際上提供了解決方案,但很奇怪文檔里面并沒有提到,就是 runInBackground 方法,在定義定時任務(wù)時 $schedule->command("foo:bar")->everyMinutes()->runInBackground(); 就可以了。
2. 負(fù)載均衡隨著業(yè)務(wù)邏輯的增多,定時任務(wù)也會越來越多,定時任務(wù)服務(wù)器的負(fù)載也會越來越高,甚至導(dǎo)致任務(wù)執(zhí)行緩慢,然而我們卻只能在一臺服務(wù)器上設(shè)置定時任務(wù),如果在多臺服務(wù)器上同時配置了定時任務(wù),還會導(dǎo)致定時任務(wù)的重復(fù)執(zhí)行。這個時候我們希望能夠像隊列那樣,將定時任務(wù)分散到多臺服務(wù)器上。
截止 v5.4.15,Laravel 還沒有提供內(nèi)置方案來解決這個問題,但只需要簡單的改造就可以實現(xiàn)我們需要的效果。首先我們把將每個定時任務(wù)里 handle 方法提取出來創(chuàng)建一個新的Job并繼承 ShouldQueue,然后在定時任務(wù)的 handle 里直接 dispatch 對應(yīng)的Job即可,這樣原本的業(yè)務(wù)邏輯就會被隊列處理掉,當(dāng)系統(tǒng)有多臺服務(wù)器在處理隊列時,也就實現(xiàn)了我們需要的負(fù)載均衡。
但是這樣畢竟還是麻煩,每個定時任務(wù)都要創(chuàng)建一個Command和一個Job,太費勁,于是我提交了一個 Proposal ,目前已經(jīng)實現(xiàn)并且merge入5.4分支,相信下個版本大家就能用上了。用法也很簡單,只需要創(chuàng)建一個繼承 ShouldQueue的Job,然后在AppConsoleKernel::schedule 方法里定義
$schedule->job(new FooBarJob())->everyMinutes();
就可以了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22487.html
摘要:高性能高精度定時服務(wù),輕松管理千萬級定時任務(wù)。支持任務(wù)到期觸發(fā)和。支持創(chuàng)建延時任務(wù)和定時到期任務(wù),和原生保持相同接口,輕松使用。不支持任務(wù)輸出任務(wù)鉤子及維護(hù)模式。是不指定任務(wù)名時自動生成,每個任務(wù)名必須唯一,相同任務(wù)名重復(fù)定義將會自動覆蓋。 Forsun高性能高精度定時服務(wù),輕松管理千萬級定時任務(wù)。 定時服務(wù)項目地址:https://github.com/snower/forsun l...
摘要:在中注冊發(fā)布之后,我們會產(chǎn)生一個監(jiān)聽器,文件已經(jīng)存儲在本地,獲取該文件信息將文件上傳至七牛云存入數(shù)據(jù)庫上面的部分代碼沒寫,大家可以去自己去試下,加深對七牛云及的理解,完全可以達(dá)到目的。 最近項目用戶徒增,購買的服務(wù)器還是和公司另外一個項目共用的同一臺服務(wù)器,想著要是服務(wù)器崩了,還沒個容災(zāi)方案,萬一。。。不得被用戶整死 選用方案 laravel-backup 配合laravel的任務(wù)調(diào)...
摘要:當(dāng)查詢數(shù)據(jù)時,本地范圍允許我們創(chuàng)建自己的查詢構(gòu)造器鏈?zhǔn)椒椒ā_@樣便會知道這是一個本地范圍并且可以在查詢構(gòu)造器中使用。某些查詢構(gòu)造器不可用或者說可用但是方法名不同,關(guān)于這些請查閱所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可編寫出干凈,可用可調(diào)試的...
摘要:原文來自問題在中,如果我們想使用定時任務(wù)的話,對應(yīng)我們開發(fā)人員來說非常簡單,只需要參照官網(wǎng)的定時任務(wù)文檔基本就可以實現(xiàn)了??偨Y(jié)以上就簡單實現(xiàn)了執(zhí)行用戶自定義定時任務(wù)的需求。 原文來自 https://www.codecasts.com/blo... 問題 在 Laravel 中,如果我們想使用定時任務(wù)的話,對應(yīng)我們開發(fā)人員來說非常簡單,只需要參照官網(wǎng)的定時任務(wù)文檔基本就可以實現(xiàn)了。 然...
摘要:大家有好的文章可以在評論下面分享出來共同進(jìn)步本文鏈接數(shù)組使用之道程序員進(jìn)階學(xué)習(xí)書籍參考指南教你在不使用框架的情況下也能寫出現(xiàn)代化代碼巧用數(shù)組函數(shù)框架中間件實現(xiàn)沒錯,這就是面向?qū)ο缶幊淘O(shè)計模式需要遵循的個基本原則令人困惑的在中使用協(xié)程實現(xiàn)多任 大家有好的文章,可以在評論下面分享出來, 共同進(jìn)步! 本文github鏈接 php PHP 數(shù)組使用之道 PHP程序員進(jìn)階學(xué)習(xí)書籍參考指南 教你...
閱讀 2452·2021-10-09 09:44
閱讀 3819·2021-09-22 15:43
閱讀 2939·2021-09-02 09:47
閱讀 2568·2021-08-12 13:29
閱讀 3882·2019-08-30 15:43
閱讀 1693·2019-08-30 13:06
閱讀 2198·2019-08-29 16:07
閱讀 2760·2019-08-29 15:23