回覆列表
  • 1 # Java實戰技術

    目前,網路上有很多開源的、現成分散式定時任務解決方案,例如Spring batch、elastic job、tbschedule、quartz等,都可以直接使用,因為開源也可以做擴充套件。

  • 2 # 此生唯一

    實現方式很多種,我卻只會用quartz!

    原本整合系統中的定時任務,無非就是配置一個時間(或者時間間隔),定時呼叫某個介面,獲得定時執行任務的效果!

    但是在分散式式的集群系統中,卻因為任務分佈在不同的機器,會發生一個時間節點,多次執行定時任務的困擾!這樣的分散式定時任務,解決方法有很多,比如elastic-job,cronner,quartz!

    下面以quartz為例(只用過這個)說下,具體的使用方法:

    1,新增quartz,springboot相關jar包!

    org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime org.springframework.boot spring-boot-starter-test test org.quartz-scheduler quartz 2.2.1 slf4j-api org.slf4j org.springframework spring-context-support

    2,配置檔案application.yml:包括quartz資料庫表資訊,連線資訊,埠資訊,日誌等!

    3,加上任務排程類,任務job,配置類(job detail),job trigger,schedule等等!

    4,匯入sql(包括quartz相關的所有表)

    5,部署應用,開始測試!

    現在在地鐵上手機打字,具體的Demo如果有需要的話,我再找時間發出來吧,更多幹貨,敬請關注。。

  • 3 # 會點程式碼的大叔

    來,藉此機會給大家講一講這麼多年我和定時任務/分散式定時任務的愛恨情仇。

    需求

    為方便講解,先給大家講一個真實的需求,這是我在第二家公司的一個專案,定時任務每天晚上執行,把原始的業務資料,加工處理成待發送的簡訊。

    比如原始資料是:姓名小明,所在地北京,電話13800000000,賬單最後還款日期2018年4月30日。

    加工後的資料是:親愛的小明,您的賬單最後還款日期為2018年4月30日,請提前繳費。

    定時任務

    定時任務框架裡面,最有名的就是quartz了,相信大部分Java程式設計師都用過。

    我們專案最開始也用的是quartz,只有一個伺服器跑定時任務。但是待處理的資料越來越多,定時服務執行的時間也越來越長,終於有一天,定時任務從晚上跑到了第二天白天也沒有跑完,耽誤了簡訊的傳送。

    改造後的定時任務

    有人就有疑問了,能不能直接把定時服務部署多套不就行了。但是部署多套quartz的話,就會出現問題:待處理的任務有可能會被重複執行。

    應對這種問題,我們當時有兩種處理方案:

    方案一:

    定時服務只部署一套,但是定時任務的工作只是提取待處理的任務。

    實際的業務處理服務叢集化部署,然後由定式服務提取資料後,傳送給業務處理伺服器進行實際的處理。

    方案二:

    這個是我當時自己想出的一個奇葩的方法,不過這個方案想明白了,對分散式定式服務的理解很有幫助!

    定時任務程式部署多套,並且多套環境都是獨立的IP。每套程式定時將IP寫入到資料中(一分鐘對錶update一次,並更新時間戳)。

    多套服務選舉出一臺主伺服器。

    主伺服器把所有的待處理任務,儘可能平均分配給每一臺伺服器。(IP和待處理任務對應上,也就是每一條待處理任務只能讓分配的IP處理)

    處理任務的時候,只處理自己IP對應的任務。

    主伺服器掛了,重新選舉出主伺服器。

    分散式定時任務

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

    任務分片:把一個任務拆分成幾個獨立的任務,然後由分散式伺服器分別執行一個或者多個子任務。

    比如還是上面那個需求,那麼可以按照【所在地】拆分任務,北京的待處理資料是一個子任務,天津的待處理資料是第二個子任務。

    Elastic-Job並不直接提供資料處理的功能,實際的資料處理還是需要自己寫,Elastic-Job會將分片任務分配到各個執行中的作業伺服器。

    其實發現了沒有,Elastic-Job做的工作,就是我那個主伺服器做的任務分配的工作,把所在地=北京的,分配給伺服器1處理,把所在地=天津的,分配給伺服器2處理;甚至包括監控每臺作業伺服器是否存活,掛掉一臺重新分配待處理任務,也都是Elastic-Job來做的。

    現在想一想,我當時做的那個方案,要是包裝包裝,說不定也能弄一個開源框架呢。

  • 4 # Jush

    可以給你提供一個很簡單的實現方式,比如你有10臺伺服器同時執行定時任務,建立一個數據庫序列,每個定時任務執行業務程式碼之前都去取一次序列值,當值為10的整數倍時執行,其他的不執行。

  • 中秋節和大豐收的關聯?
  • 創業開實體店,有哪些行業還有機會?