任務(wù)調(diào)度總結(jié)(一)

背景和目的

? ? ? 在日常的開發(fā)中,我們經(jīng)常會遇到各種異步的處理碍庵,業(yè)務(wù)的補償和定時的業(yè)務(wù)處理映企。這個時候,我們可能第一反應(yīng)就是静浴,起一個定時任務(wù)堰氓。沒錯,就是定時任務(wù)苹享。

? ? ? ?目前所在的這家公司双絮,由于交易系統(tǒng)是在我職責(zé)范圍之內(nèi),而交易系統(tǒng)中很多業(yè)務(wù)都是通過異步定時來處理的得问。之前發(fā)生了好幾次由于定時任務(wù)觸發(fā)異常導(dǎo)致的種種生產(chǎn)問題囤攀,不得不使我停下忙碌的腳步,靜下來思索并總結(jié)宫纬。此文屬個人經(jīng)驗總結(jié)焚挠,如有雷同,純屬巧合漓骚。好蝌衔,那我們開始入正題。

定時任務(wù)的演變

“演變”可能說的有點嚴(yán)重蝌蹂。還記得我07年剛畢業(yè)的時候噩斟,在第一公司,那個時候印象還沒接觸定時任務(wù)叉信,隱約在自己買的一本spring的書中亩冬,了解到spring-quartz。后來到了第二家公司硼身,當(dāng)時還是平安集團(tuán)信息管理中心(后獨立成平安科技)硅急,接觸到了spring-quartz的應(yīng)用場景。到現(xiàn)在佳遂,我們互聯(lián)網(wǎng)技術(shù)不斷發(fā)展营袜,分布式任務(wù)調(diào)度層出不窮〕笞铮基本可以概括如下:

spring-quartz階段:

早期的方式一般采用quartz結(jié)合spring來實現(xiàn)集群中的定時任務(wù)的啟動荚板。有興趣的朋友可以看看quartz的12張表的作用。大家一直認(rèn)為quartz就是屬于spring,其實是一個誤解吩屹。只是我們當(dāng)時的框架是ssh而已跪另。

這個階段,更多的是保險煤搜、金融免绿、銀行會用的比較多,做一些企業(yè)級應(yīng)用擦盾。而企業(yè)級應(yīng)用一般是集群部署嘲驾。集群部署需要考慮的是定時任務(wù)的重復(fù)跑問題。quartz在這一點做的還是挺到位的迹卢。只是配置比較復(fù)雜辽故。我還清晰的記得,當(dāng)時在熟悉quartz的時候腐碱,那些oracle數(shù)據(jù)庫的表誊垢,讓我很頭疼≈⒓看了很久才明白喂走。其實他的思想還是挺不錯的⊥彩危基本是以節(jié)點任務(wù)搶占的方式來實現(xiàn)缴啡。用戶數(shù)據(jù)庫悲觀鎖的方式來實現(xiàn)共享資源的搶占。

山寨版實現(xiàn):Thread.sleep

這個相對來說就比較簡單了瓷们。用while循環(huán)业栅,循環(huán)中用sleep來處理,當(dāng)然谬晕,這種實現(xiàn)碘裕,最好用線程來處理,異步的啟動攒钳。否則會阻塞應(yīng)用帮孔。

spring注解Scheduler

spring的scheduler,其實是一種集成框架,支持JDK Timer、concurrent文兢、quartz三種晤斩,這三種任務(wù)調(diào)度方案在實現(xiàn)機(jī)制和調(diào)用方法上都不同,但spring通過對其包裝姆坚,使得基于spring能用統(tǒng)一的配置和編碼風(fēng)格來使用這三種schedule方案澳泵。

jdk的timer實現(xiàn)

jdk推陳出新,在1.3的時候推出了timer兼呵。主要包括任務(wù) TimerTask 兔辅、任務(wù)隊列:TaskQueue queue和任務(wù)調(diào)試。具體大家自行研究下击喂。一段時間風(fēng)靡维苔。

但是官網(wǎng)上有這樣子的一段話:

Timer類會自動啟動一個新線程,而多個Timer類則會有開辟多個線程懂昂,同時Timer類的線程是非daemon(守護(hù))線程介时,所以一旦啟動除非明確cancel掉,是一直存在的忍法。

因此潮尝,很容易出現(xiàn)oom。

分布式任務(wù)調(diào)度框架

隨著電商互聯(lián)網(wǎng)時代的到來饿序,追求效率的攻城獅們勉失,需要做分布式任務(wù)處理。不再滿足于一臺機(jī)器處理一個任務(wù)原探,而需要多臺機(jī)器處理一個任務(wù)乱凿。用空間來換時間。

分布式任務(wù)調(diào)度框架(輪子)產(chǎn)生了咽弦。我清晰的記得徒蟆,當(dāng)時在一號店,研究了下淘寶的tbscheduler型型,而且還改寫了部分源碼的實現(xiàn)《紊螅現(xiàn)在想想,當(dāng)時還做了部分的無用功闹蒜,但是一定程度上加深了我對整體框架的認(rèn)識和原理的熟悉寺枉。從此一發(fā)不可收拾的走上了架構(gòu)這條路。

基本當(dāng)前階段主流的任務(wù)調(diào)度框架(我所說的可能是基于我的認(rèn)知)如tbscheduler绷落、es-job姥闪。原來還是基于spring進(jìn)行實現(xiàn)。當(dāng)然砌烁,不排除現(xiàn)在各家公司自己造輪子筐喳。開源出來的比較有名的就是這些了。es-job其實和tbscheduler原理一樣。當(dāng)初看到這個開源框架的時候避归,甚至懷疑是抄襲tbscheduler的荣月。畢竟在11年的時候,就開始讀tbscheduler的源碼了槐脏。

以上喉童,基本能概括目前的主流定時任務(wù)實現(xiàn)撇寞。

任務(wù)的部署方式

看了以上的演變過程顿天,我想應(yīng)該已經(jīng)喚醒大家沉睡多年的記憶了^_^。

集群時代

時間回到07年左右蔑担,那個時候牌废,保險金融業(yè)大多采用了小型機(jī)+pc server+oracle+ssh的架構(gòu),混搭啤握。滿天飛的存儲過程鸟缕,數(shù)據(jù)同步是etl和golden-gate。土豪的時代排抬。

言歸正傳懂从,weblogic的時代,采用集群方式部署蹲蒲。必然會考慮定時任務(wù)的啟動問題番甩,數(shù)據(jù)的重復(fù)跑問題,而quartz正好能解決規(guī)律届搁。所以缘薛,那個時候,定時任務(wù)隨著應(yīng)用一起部署卡睦。


通過數(shù)據(jù)庫的鎖方式宴胧,規(guī)避了任務(wù)的重復(fù)自行,這個時候表锻,任務(wù)是隨機(jī)搶占恕齐,無狀態(tài)。記錄日志瞬逊,和任務(wù)的批次執(zhí)行結(jié)果显歧,配合監(jiān)控報警÷肽停基本完美解決了問題追迟。

缺點很明顯:實現(xiàn)復(fù)雜。我想骚腥,那12張表敦间,就已經(jīng)很折騰人了。

單機(jī)時代

隨著電商、互聯(lián)網(wǎng)的興起廓块,效率和速度厢绝,成了大家首要追求的目標(biāo)〈铮“天下武功昔汉,唯快不破”。這個時代拴清,有個口號:去IOE靶病。

去IOE,有幾個原因:

1、成本口予。之所以放首要娄周,是因為電商很多燒錢,成本放在第一位沪停。印象中oracle的licence一個每年都是十幾萬煤辨,golden-gate跟著licence也是靠近10w。一般數(shù)據(jù)庫都是集群部署木张,那么單db這塊众辨,每年就很多錢。更不用說小型機(jī)和EMC的存儲設(shè)備了舷礼。

2鹃彻、效率和性能。電商的場景和傳統(tǒng)的場景有很大的差別且轨,對于并發(fā)的要求浮声、對于中間件的性能有很多的考量。而付費產(chǎn)品旋奢,很多不開源泳挥,且有使用限制,制約了平臺的擴(kuò)展性至朗。因此屉符,很多公司喜歡自己造輪子。這里最典型的就是bat中的A锹引。

以上矗钟,是我理解的兩個主要原因∠颖洌可能還有其他的吨艇,我也不過多的去贅述了。

另外腾啥,除了以上东涡,還有一些點很重要冯吓,我覺得有必要提下。那就是電商和互聯(lián)網(wǎng)是不建議存儲過程以及觸發(fā)器和函數(shù)等操作的疮跑。也是基于資源和性能的考慮组贺。

還記得一號店曾經(jīng)進(jìn)行過去存儲過程、trigger和函數(shù)的行動祖娘。原因就是數(shù)據(jù)庫資源太寶貴了失尖,相比應(yīng)用的優(yōu)化空間,真的有限渐苏。而應(yīng)用層面掀潮,有很多優(yōu)化的措施,如緩存整以,水平擴(kuò)容等等胧辽。且db在一定程度上是共享資源,小范圍說公黑,會影響某個業(yè)務(wù)域的集群,大了說摄咆,會影響整個公司的業(yè)務(wù)開展凡蚜。

回到正題,這個時候吭从,我們推崇的是簡便朝蜘,快捷,性能涩金。所以定時任務(wù)單獨部署谱醇,和應(yīng)用解耦。


優(yōu)點:

顯而易見步做,和應(yīng)用分離副渴,任務(wù)掛或者發(fā)生死鎖,不影響業(yè)務(wù)全度。

缺點:

單獨部署煮剧,沒有實現(xiàn)集群方式。任務(wù)一般作為補償将鸵,非主鏈路手段勉盅。且有消息保證。(當(dāng)然顶掉,也可以剝離開來進(jìn)行集群草娜,但是那個時候沒想這么復(fù)雜),更多的是分離痒筒。

分布式時代

先上個圖:


屌絲的福音宰闰。

因為再也不用去考慮任務(wù)的搶占嗜暴,任務(wù)的效率問題了。分布式任務(wù)框架能很好的解決這些問題议蟆。

我這里總結(jié)下框架出現(xiàn)的原因:

1闷沥、效率:原來是并發(fā)執(zhí)行,也就是一個cpu處理多個事件咐容。這個時候舆逃,我們發(fā)現(xiàn),其實資源沒有被充分利用起來戳粒÷肥ǎ可以進(jìn)行并行執(zhí)行。多核并行蔚约。我們想充分利用資源奄妨,提升執(zhí)行效率。用空間來換事件苹祟。

2砸抛、規(guī)范:這里的規(guī)范是任務(wù)的實現(xiàn)規(guī)范。我想大家更多的是考慮的第一點树枫。但是我當(dāng)時在一號店去引入tbscheduler的動因直焙,還有一個,就是書寫的規(guī)范砂轻。但是各種任務(wù)書寫形式奔誓,層出不窮,以上列舉的可能都有出現(xiàn)搔涝。拍拍貸習(xí)慣叫收口厨喂,那么我姑且借用下,叫“收口”任務(wù)的實現(xiàn)方式庄呈。

分布式任務(wù)框架的出現(xiàn)蜕煌,在一定程度上解決了如下問題:

1、部署的問題抒痒。

2幌绍、資源使用的問題。

3故响、任務(wù)分片的問題傀广。

如下一一解釋:

1、部署問題:原先的部署彩届,涉及到數(shù)據(jù)庫伪冰,應(yīng)用。且要考慮任務(wù)的搶占樟蠕。low之余多了一點復(fù)雜≈簦現(xiàn)在框架集群部署靠柑,甚至支持docker。任務(wù)的注冊采用zookeeper或者consul等開源框架吓懈,任務(wù)的調(diào)度由sdk植入應(yīng)用歼冰。簡單明了。

2耻警、資源使用問題:

早期的定時任務(wù)隔嫡,要么就一臺機(jī)器使用,要么就輪著來甘穿。簡單粗暴腮恩。但是資源使用率不高。

如今温兼,手槍換大炮秸滴。可以給機(jī)器設(shè)置權(quán)重募判,資源多的機(jī)器荡含,多執(zhí)行任務(wù)。資源少的兰伤,執(zhí)行一個或者跳過内颗。

3、任務(wù)分片問題:

這個是分布式的理念敦腔,用空間換時間。我不做過多的贅述恨溜。

結(jié)合業(yè)務(wù)

相信以上說了這么多符衔,大家塵封已久的記憶已經(jīng)被徹底喚醒。那么糟袁,接下來判族,我將要結(jié)合具體的業(yè)務(wù)場景,來說說项戴,我們在使用過程中需要注意的點形帮。我將分幾塊進(jìn)行說明:

一、任務(wù)和場景

二周叮、任務(wù)和鎖

以上辩撑,結(jié)合自己的一些經(jīng)驗和總結(jié),希望對大家有幫助仿耽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末合冀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子项贺,更是在濱河造成了極大的恐慌君躺,老刑警劉巖峭判,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棕叫,居然都是意外死亡林螃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門俺泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗认,“玉大人,你說我怎么就攤上這事砌滞∥暄” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵贝润,是天一觀的道長绊茧。 經(jīng)常有香客問我,道長打掘,這世上最難降的妖魔是什么华畏? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮尊蚁,結(jié)果婚禮上亡笑,老公的妹妹穿的比我還像新娘。我一直安慰自己横朋,他們只是感情好仑乌,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琴锭,像睡著了一般晰甚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上决帖,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天厕九,我揣著相機(jī)與錄音,去河邊找鬼地回。 笑死扁远,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刻像。 我是一名探鬼主播畅买,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绎速!你這毒婦竟也來了皮获?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纹冤,失蹤者是張志新(化名)和其女友劉穎洒宝,沒想到半個月后购公,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雁歌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年宏浩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靠瞎。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡比庄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤燎悍,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站神凑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏何吝。R本人自食惡果不足惜溉委,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爱榕。 院中可真熱鬧瓣喊,春花似錦、人聲如沸黔酥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪者。三九已至趴酣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坑夯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工抡四, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留柜蜈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓指巡,卻偏偏與公主長得像淑履,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藻雪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容