如有8個(gè)實(shí)例,執(zhí)行的時(shí)候會(huì)隨機(jī)分配一個(gè)實(shí)例運(yùn)行還是8個(gè)都會(huì)運(yùn)行?在這節(jié)博客中沒(méi)有辦法完全解決這個(gè)問(wèn)題,在這里拋磚引玉說(shuō)明下。 看下本章大綱:
(1)回顧定時(shí)任務(wù)的實(shí)現(xiàn)方式;
(2)集群環(huán)境下的任務(wù)調(diào)度說(shuō)明;
(3)Spring的Scheduled Task實(shí)現(xiàn)集群思路;
(4)Quartz實(shí)現(xiàn)集群思路;
我們一起看下本節(jié)具體的內(nèi)容:
(1)回顧定時(shí)任務(wù)的實(shí)現(xiàn)方式;
定時(shí)任務(wù)的實(shí)現(xiàn)方式有多種,例如
JDK自帶的Timer+TimerTask方式,
spring3.0以后的調(diào)度任務(wù)(ScheduledTask),
Quartz等。
(2)集群環(huán)境下的任務(wù)調(diào)度說(shuō)明;
Timer+TimerTask是最基本的解決方案;
Spring自帶的Scheduled Task是一個(gè)輕量級(jí)的定時(shí)任務(wù)調(diào)度器,支持固定時(shí)間(支持cron表達(dá)式)和固定時(shí)間間隔調(diào)度任務(wù),支持線程池管理
以上兩種方式有一個(gè)共同的缺點(diǎn),那就是應(yīng)用服務(wù)器集群下會(huì)出現(xiàn)任務(wù)多次被調(diào)度執(zhí)行的情況,因?yàn)榧旱墓?jié)點(diǎn)之間是不會(huì)共享任務(wù)信息的,每個(gè)節(jié)點(diǎn)上的任務(wù)都會(huì)按時(shí)執(zhí)行。
Quartz是一個(gè)功能完善的任務(wù)調(diào)度框架,特別牛叉的是它支持集群環(huán)境下的任務(wù)調(diào)度,當(dāng)然代價(jià)也很大,需要將任務(wù)調(diào)度狀態(tài)序列化到數(shù)據(jù)庫(kù)。Quartz框架需要10多張表協(xié)同,配置繁多。
(3)Spring的Scheduled Task實(shí)現(xiàn)集群思路;
如果在實(shí)際項(xiàng)目中使用的scheduled task的話,那么也有自己變通的方式進(jìn)行實(shí)現(xiàn)。
無(wú)非是一個(gè)任務(wù)互斥訪問(wèn)的問(wèn)題,聲明一把全局的“鎖”作為互斥量,哪個(gè)應(yīng)用服務(wù)器拿到這把“鎖”,就有執(zhí)行任務(wù)的權(quán)利,未拿到“鎖”的應(yīng)用服務(wù)器不進(jìn)行任何任務(wù)相關(guān)的操作。另外就是這把“鎖”最好還能在下次任務(wù)執(zhí)行時(shí)間點(diǎn)前失效。
(4)Quartz實(shí)現(xiàn)集群思路;
選Quartz的團(tuán)隊(duì)基本上是沖著Quartz本身實(shí)現(xiàn)的集群去的, 不然JDK自帶Timer就可以實(shí)現(xiàn)相同的功能, 而Timer存在的單點(diǎn)故障是生產(chǎn)環(huán)境上所不能容忍的。 在自己造個(gè)有負(fù)載均衡和支持集群(高可用、伸縮性)的調(diào)度框架又影響項(xiàng)目的進(jìn)度, 所以大多數(shù)團(tuán)隊(duì)都直接使用了Quartz來(lái)作為調(diào)度框架
一個(gè)Quartz集群中的每個(gè)節(jié)點(diǎn)是一個(gè)獨(dú)立的Quartz應(yīng)用,它又管理著其他的節(jié)點(diǎn)。這就意味著你必須對(duì)每個(gè)節(jié)點(diǎn)分別啟動(dòng)或停止。Quartz集群中,獨(dú)立的Quartz節(jié)點(diǎn)并不與另一其的節(jié)點(diǎn)或是管理節(jié)點(diǎn)通信,而是通過(guò)相同的數(shù)據(jù)庫(kù)表來(lái)感知到另一Quartz應(yīng)用的
-
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14338 -
Boot
+關(guān)注
關(guān)注
0文章
149瀏覽量
35823
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論