定時任務是你們再開發中一個不可避免的業務,好比在一些電商系統中可能會定時給用戶發送生日券,一些對帳系統中可能會定時去對帳。大概再好久之前每一個服務可能就一臺機器,再這臺機器上直接搞個Timerschedule基本上就能知足咱們的業務需求,可是隨着時代的變遷,單臺機器已經遠遠不能知足咱們的須要,這個時候咱們可能須要10臺,20臺甚至更多機器來運行咱們的業務,接受咱們的流量,這就是咱們所說的橫向擴展。可是這裏就有個問題,這麼多臺機器若是還用咱們的Timerschedule去作會發生什麼呢?再上面的電商系統中有可能會給某個用戶發不少張生日券,對公司形成不少損失,因此咱們須要一些其餘方法,讓定時任務在多臺機器上只執行一次。git
這裏想問下你們在沒有了解過或使用過度布式任務調度框架以前你們是如何作定時任務的呢?在Spring項目中你們確定都知道Spring-Scheduler,只須要在Spring中的bean的對應方法上加上@Scheduler
註解便可完成咱們的定時任務,可是光是用這個註解還遠遠不能保證定時任務執行屢次,咱們須要一些其餘手段的保證,通常來講方法可能不外乎下面幾種(都是基於Spring的項目來講):github
一臺機器,咱們能夠將一些不過重要的定時任務,可使用一個專門的服務檯承載,而後使用單機跑,就算掛了只要咱們再可接受的時間以內將其恢復,咱們的業務也不會受到影響。框架
多臺機器,加分佈式鎖,只要咱們執行任務的時候首先獲取一把分佈式鎖,若是獲取失敗那麼久證實有其餘服務已經再運行,若是獲取成功那麼證實沒有服務在運行定時任務,那麼就能夠執行。分佈式
多臺機器,利用ZooKeeper對Leader機器執行定時任務,有不少業務已經使用了ZK,那麼執行定時任務的時候判斷本身是不是Leader,若是不是則不執行,若是是則執行業務邏輯,這樣也能達到咱們的目的。性能
目前咱們公司作定時任務也是使用的上面三種方法,在業務初期使用這些方法基本也能大致知足,可是隨着時間的遷移,咱們遇到的問題愈來愈多,這裏和你們分享一下:設計
固然還有一些或多或少的小問題這裏就不一一列舉了,若是你們有這種經歷能夠本身慢慢體會發現。日誌
上面第一章講了咱們框架的緣由,不論你要引入或改進什麼,都須要緣由,由於作任何事都有成本,我常常看到一些很小的項目就開始搞引入消息隊列,或者分佈式事務等等,這樣作反而是本末倒置,好比可能有一些博客系統就搞個消息隊列削峯減流,這樣作有可能尚未同步調用來得快。code
當咱們有了緣由以後,就能夠着手作一些調研或者技術方案的設計。這裏我講一下個人調研框架一些基本原則,若是你們之後有相似的調研框架的需求均可以往這個裏面來套。中間件
當咱們有了上述的幾大原則以後,咱們接下來能夠進入調研。接口
通常調研Java系的一些框架,能夠先看看阿里是否是有開源的,畢竟最近這幾年阿里在開源這一塊作得是很是的好,再網上搜索到阿里在12年開源了一個調度框架叫TBSchedule,如今再去搜索代碼,發現已經人走茶涼,代碼都被清理乾淨了。固然還有一個我的項目將其Fork出來再不斷維護,可是使用者實在是少這裏就不說明了。 github地址:https://github.com/taobao/TBSchedule
elastic-Job 是噹噹開源的一個分佈式調度解決方案,由兩個相互獨立的子項目 Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。定位爲輕量級無中心化解決方案,使用 jar 包的形式提供分佈式任務的協調服務。支持分佈式調度協調、彈性擴容縮容、失效轉移、錯過執行做業重觸發、並行調度、自診斷和修復等等功能特性。
這個框架大概在2年前很火,當時使用的公司不少,想必不少人也聽過了,可是很惋惜如今已經不在維護了,代碼已經有2年沒有更新了,這裏違反了更新頻率的原則,若是出現問題可能都沒什麼人幫助你,因此咱們並非很推薦使用。 github地址:https://github.com/elasticjob/elastic-job-lite
在網上有一些比較小衆的github star不多,更新頻率也不多: Uncode-Schedule,LTS,openCron等等,這些也不符合咱們的原則,都不予以考慮
因爲分佈式定時任務如今尚未基金會好比CNCF,Apache等,抉擇起來可能不是那麼難。不像消息隊列再Apache裏面就有好幾個:Kafka,rocketmq,plusar等等,每個的社區都很龐大,可能選擇是比較困難的。那麼咱們基本就還剩下兩個選擇,一個是自研,這種任務調度框架,再研發的困難程度上是遠遠比不上消息隊列的研發,因此其實不少公司都選擇了自研,好比:美團的Crane這些。可是對於一些消息隊列這些複雜的中間件可能會選擇二次開發,好比美團的mafka就是基於kafka二次開發,滴滴的DDMQ也是基於Rocketmq。而咱們目前若是選擇自研再資源上來講是明顯不夠的,這裏咱們仍是使用的是二次開發框架的策略。
固然這裏還剩下一個XXL-Job:http://www.xuxueli.com/xxl-job 的選擇,其基本符合咱們的原則,目前代碼也在持續更新,issue做者也在積極的回覆,使用的公司也有200多家,其中包括以前的點評,同時其餘的原則也很符合。通常來講當你決定選擇某個框架的時候須要詳細的列舉一下優勢,好讓其餘人得以信服。
xxl-job有下面一些特色:
基本上上面的一些特色都是咱們業務中所須要的,因此這裏最後選擇了XXL-JOB
俗話說:授人以魚不如授人以漁,以前的文章每次都是介紹某某框架,這一次我偏向於介紹我是如何選擇的這款框架,讓你們再之後調研的過程當中也能夠按照這個思路,若是說你也有好的而且不一樣的調研思路,歡迎留言或者加羣交流。固然通常調研完畢以後,做爲一個調研人若是你不弄清楚這個框架的源碼和實現原理,那麼就是一個不合格的調研人,因此下一篇文章我會詳細的介紹XXL-Job的實現原理。
若是你們以爲這篇文章對你有幫助,你的關注和轉發是對我最大的支持,O(∩_∩)O: