欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Java架構(gòu)師之路-如何去實(shí)現(xiàn)一個(gè)分布式定時(shí)任務(wù)?

雖說有現(xiàn)成的框架可以實(shí)現(xiàn),不過還是一步一步地說一下思路。

需求

為方便大家的理解,先給大家講一個(gè)真實(shí)的需求,這是我在第二家公司的一個(gè)項(xiàng)目,定時(shí)任務(wù)每天凌晨執(zhí)行,需求很簡(jiǎn)單:把原始的業(yè)務(wù)數(shù)據(jù),加工處理成待發(fā)送的短信。

原始數(shù)據(jù):姓名-小明,所在地-北京,電話-13800000000,賬單最后還款日期-2018年4月30日。

加工后的數(shù)據(jù)是:親愛的小明,您的賬單最后還款日期為2018年4月30日,請(qǐng)?zhí)崆袄U費(fèi)。然后把需要把這條短信發(fā)送到13800000000這個(gè)手機(jī)號(hào)上。

定時(shí)任務(wù)

定時(shí)任務(wù)框架里面,最有名的就是quartz了,相信大部分Java程序員都用過。

我們項(xiàng)目最開始也用的是quartz,只有一個(gè)服務(wù)器跑定時(shí)任務(wù)。但是待處理的數(shù)據(jù)越來越多,定時(shí)服務(wù)執(zhí)行的時(shí)間也越來越長(zhǎng),終于有一天,定時(shí)任務(wù)從晚上跑到了第二天白天也沒有跑完,耽誤了短信的發(fā)送。

改造后的定時(shí)任務(wù)

有人就有疑問了,能不能直接把定時(shí)服務(wù)部署多套不就行了。但是部署多套quartz的話,就會(huì)出現(xiàn)問題:待處理的任務(wù)有可能會(huì)被重復(fù)執(zhí)行。

應(yīng)對(duì)這種問題,我們當(dāng)時(shí)有兩種處理方案:

方案一:定時(shí)服務(wù)只部署一套,但是定時(shí)任務(wù)的工作只是提取待處理的任務(wù)。

實(shí)際的業(yè)務(wù)處理服務(wù)集群化部署,然后由定式服務(wù)提取數(shù)據(jù)后,發(fā)送給業(yè)務(wù)處理服務(wù)器進(jìn)行實(shí)際的處理。

方案二:這個(gè)是我當(dāng)時(shí)自己想出的一個(gè)奇葩的方法,不過這個(gè)方案想明白了,對(duì)分布式定式服務(wù)的理解很有幫助!

  • 定時(shí)任務(wù)程序部署多套,并且多套環(huán)境都是獨(dú)立的IP。每套程序定時(shí)將IP寫入到數(shù)據(jù)中(一分鐘對(duì)表update一次,并更新時(shí)間戳)。
  • 多套服務(wù)選舉出一臺(tái)主服務(wù)器。
  • 主服務(wù)器把所有的待處理任務(wù),盡可能平均分配給每一臺(tái)服務(wù)器。(IP和待處理任務(wù)對(duì)應(yīng)上,也就是每一條待處理任務(wù)只能讓分配的IP處理)
  • 處理任務(wù)的時(shí)候,只處理自己IP對(duì)應(yīng)的任務(wù)。
  • 一臺(tái)服務(wù)器掛了,主服務(wù)器負(fù)責(zé)把它的IP從數(shù)據(jù)庫(kù)中抹掉(三分鐘沒有對(duì)表進(jìn)行更新的IP,刪除掉),并重新分配這個(gè)IP對(duì)應(yīng)的待處理任務(wù)。
  • 主服務(wù)器掛了,重新選舉出主服務(wù)器。

分布式定時(shí)任務(wù)框架

我只用過Elastic-job,所以只給大家介紹一下這個(gè)框架。

任務(wù)分片:把一個(gè)任務(wù)拆分成幾個(gè)獨(dú)立的任務(wù),然后由分布式服務(wù)器分別執(zhí)行一個(gè)或者多個(gè)子任務(wù)。比如還是上面那個(gè)需求,那么可以按照【所在地】拆分任務(wù),北京的待處理數(shù)據(jù)是一個(gè)子任務(wù),天津的待處理數(shù)據(jù)是第二個(gè)子任務(wù)。

Elastic-Job并不直接提供數(shù)據(jù)處理的功能,實(shí)際的數(shù)據(jù)處理還是需要自己寫,Elastic-Job會(huì)將分片任務(wù)分配到各個(gè)運(yùn)行中的作業(yè)服務(wù)器。

其實(shí)發(fā)現(xiàn)了沒有,Elastic-Job做的工作,就是我那個(gè)主服務(wù)器做的任務(wù)分配的工作,把所在地=北京的,分配給服務(wù)器1處理,把所在地=天津的,分配給服務(wù)器2處理;甚至包括監(jiān)控每臺(tái)作業(yè)服務(wù)器是否存活,掛掉一臺(tái)重新分配待處理任務(wù),也都是Elastic-Job來做的。

我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見解,希望能得到你的關(guān)注。