elastic-job

Name 描述
JobRegistry job注冊表
GuaranteeService 保證分布式任務全部開始和結束狀態(tài)的服務
ElasticJobListener 彈性化分布式作業(yè)監(jiān)聽器接口
JobScheduler 作業(yè)調度器.
JobNodeStorage 作業(yè)節(jié)點數(shù)據(jù)訪問類
JobScheduleController 作業(yè)調度控制器,其實就是quartz的scheduler

config 節(jié)點

代表了這個job的配置信息阵谚,如果app啟動的時候沒有設置override=true && zk上的配置不為空,那么就使用zk已經(jīng)存在的zk信息,這一點要特別注意,如果改了配置信息斤程,但是沒有設置override就會出問題,但是有些信息也可以調節(jié)console里面的配置菩混,因為他是以zk為準的忿墅。

配置參數(shù)

Name 描述
monitorExecution 默認是true,當job觸發(fā)的時候如果上一次還有分片在運行中則忽略掉本次運行
maxTimeDiffSeconds 任務執(zhí)行機器和zk機器的時間差沮峡,如果設置了不是-1疚脐,那么兩者誤差要在這個范圍內,否則啟動報錯帖烘,但是只是記到了錯誤日志亮曹,啟動還是可以繼續(xù)的
  • 每個sharding節(jié)點下的子節(jié)點有哪些橄杨?

    • instance 節(jié)點秘症,記錄了這個分片執(zhí)行的instance的ip、pid
    • running
    • misfire
    • disabled
    • failover 節(jié)點式矫,表示這個分片原來是運行在實例上的的后來失敗被轉義到別的實例上的
  • 重新分片
    在每次執(zhí)行任務的時候乡摹,有一個步驟是獲取分片上下文,這個時候會檢查是否需要重新分片采转。

      1. 如何確定是否需要分片呢聪廉?
        當監(jiān)聽到分片總數(shù)變化、實例數(shù)量變化故慈、分布式作業(yè)不一致板熊、注冊作業(yè)啟動信息的時候會創(chuàng)建需要重新分片的節(jié)點 :leader/sharding/necessary
        只有存在這個節(jié)點,才可能開始下面的分片邏輯:
  • 分片

    1. 如果當前實例是leader節(jié)點察绷,他會等待所有的分片都執(zhí)行完成后干签,創(chuàng)建 /leader/sharding/processing 節(jié)點,表示分片動作正在執(zhí)行中拆撼,那么非leader節(jié)點看到存在這個節(jié)點就會一直等著不會繼續(xù)執(zhí)行容劳,leader節(jié)點首先重置所有的分片信息,例如原來是 0闸度,1竭贩,2三個分片,現(xiàn)在分片0莺禁,1 那么就會把2刪掉留量,接著使用分片策略,最后形成
      Map<JobInstance, List<Integer>> 這個結構,最后將每個分片下面的instance節(jié)點的值寫為對應實例的id肪获。最后刪除/leader/sharding/necessary 和 /leader/sharding/processing 節(jié)點
    1. 如果當前實例不是leader節(jié)點寝凌,就一直等到分片完成在繼續(xù)執(zhí)行,然后
  • misfire
    misfire 在quartz里的原因是cron設置的執(zhí)行間隔很小孝赫,但是任務執(zhí)行的時間很長较木,導致下一次觸發(fā)執(zhí)行的時候上一次的任務還沒有執(zhí)行完成,這樣本次任務在執(zhí)行的時候發(fā)現(xiàn)sharding下面還有running節(jié)點青柄,就會設置這個sharding下的misfire節(jié)點 伐债,然后跳過本次執(zhí)行

  • failover
    failover 功能指的是當一個實例在執(zhí)行過程中宕機,可以把分片轉移到其他的實例上運行

    • 什么時候需要failover致开?
      節(jié)點 /leader/failover/items 存在 并且 下面的子節(jié)點不為空 并且當前任務沒有在運行狀態(tài)
      創(chuàng)建臨時節(jié)點 sharding/xx/failover
      同時刪除 /leader/failover/items/xx
      立即啟動作業(yè) scheduler.triggerJob(jobDetail.getKey());

    • /leader/failover/items 節(jié)點以及子節(jié)點表示失效的節(jié)點峰锁,這些節(jié)點什么時候創(chuàng)建的呢?

每次執(zhí)行完成双戳,刪除failover節(jié)點

  • 監(jiān)聽器
    app啟動的時候會開啟這些監(jiān)聽器

    • electionListenerManager

    • shardingListenerManager

      • ShardingTotalCountChangedJobListener
        分片數(shù)量變化虹蒋,得到通知,更新本地的分片數(shù)量緩存飒货,同時創(chuàng)建/leader/sharding/necessary節(jié)點
      • ListenServersChangedJobListener
        如果是server數(shù)量變化或者instance數(shù)量變化就設創(chuàng)建/leader/sharding/necessary節(jié)點
    • failoverListenerManager
      監(jiān)聽/jobName , 節(jié)點或者數(shù)據(jù)變化會執(zhí)行 魄衅,注冊了兩個zk listener

      • JobCrashedJobListener

        • 監(jiān)聽節(jié)點刪除事件,檢查 sharding 下的子節(jié)點 instance 塘辅,如果instaceid和掛掉的機器instanceid是一樣的晃虫,這樣就搜集了掛掉實例上運行的所有分片,如果 /sharding/xx/failover 節(jié)點沒有創(chuàng)建扣墩,那么就創(chuàng)建 /leader/failover/items/xx 節(jié)點哲银。
          然后創(chuàng)建臨時節(jié)點 sharding/xx/failover
          同時刪除 /leader/failover/items/xx
          立即啟動作業(yè) scheduler.triggerJob(jobDetail.getKey());
      • FailoverSettingsChangedJobListener
        監(jiān)聽config配置節(jié)點,如果配置改變了(通過控制臺改變)呻惕,如果配置不再支持failover了荆责,那么就刪掉所有的 sharding/xx/failover 節(jié)點

  • monitorExecutionListenerManager
  • shutdownListenerManager
  • triggerListenerManager
  • rescheduleListenerManager
  • guaranteeListenerManager
  • regCenterConnectionStateListener
  • 任務狀態(tài)
  • jobStatusTraceEvent
    TASK_STAGING
    TASK_RUNNING,
    TASK_FINISHED,
    TASK_KILLED,
    TASK_LOST,
    TASK_FAILED,
    TASK_ERROR,
    TASK_DROPPED,
    TASK_GONE,
    TASK_GONE_BY_OPERATOR,
    TASK_UNREACHABLE,
    TASK_UNKNOWN
INSERT INTO `JOB_STATUS_TRACE_LOG` (`id`, `job_name`, `original_task_id`, `task_id`, `slave_id`, `source`, `execution_type`, `sharding_item`,  `state`, `message`, `creation_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

JobStatusTraceEvent
JobStatusTraceEvent

  • 線程池
new ThreadPoolExecutor(
threadSize, 
threadSize, 
5L, 
TimeUnit.MINUTES, 
workQueue, 
 new BasicThreadFactory.Builder().namingPattern(Joiner.on("-").join(namingPattern, "%s")).build());

 threadPoolExecutor.allowCoreThreadTimeOut(true);
1. 固定大小線程池
2. 允許core線程超時
3.  線程數(shù)量 = Runtime.getRuntime().availableProcessors() * 2
  • 如果我們自定義的業(yè)務邏輯報錯會怎么處理
    在框架里會catch住,將錯誤堆棧信息提交到eventbus亚脆,并記錄到日志做院。

提供的擴展點

    1. 默認的線程池是固定大小、線程數(shù)量是cpu個數(shù)的2倍型酥,對于cpu密集和IO密集不能做區(qū)分山憨,因此提供了線程池的擴展點

app啟動

  1. 從zk中獲取到config
  2. xx
  • 通過jobProperties 可以設置任務執(zhí)行的線程池和異常處理策略
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弥喉,隨后出現(xiàn)的幾起案子郁竟,更是在濱河造成了極大的恐慌,老刑警劉巖由境,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚亩,死亡現(xiàn)場離奇詭異蓖议,居然都是意外死亡,警方通過查閱死者的電腦和手機讥蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門勒虾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘸彤,你說我怎么就攤上這事修然。” “怎么了质况?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵愕宋,是天一觀的道長。 經(jīng)常有香客問我结榄,道長中贝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任臼朗,我火速辦了婚禮邻寿,結果婚禮上,老公的妹妹穿的比我還像新娘视哑。我一直安慰自己绣否,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布黎炉。 她就那樣靜靜地躺著枝秤,像睡著了一般醋拧。 火紅的嫁衣襯著肌膚如雪慷嗜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天丹壕,我揣著相機與錄音庆械,去河邊找鬼。 笑死菌赖,一個胖子當著我的面吹牛缭乘,可吹牛的內容都是我干的。 我是一名探鬼主播琉用,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼堕绩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邑时?” 一聲冷哼從身側響起奴紧,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶丘,沒想到半個月后黍氮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唐含,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年沫浆,在試婚紗的時候發(fā)現(xiàn)自己被綠了捷枯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡专执,死狀恐怖淮捆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情本股,我是刑警寧澤争剿,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站痊末,受9級特大地震影響蚕苇,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凿叠,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一涩笤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒件,春花似錦蹬碧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翔始,卻和暖如春罗心,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背城瞎。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工渤闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖镀。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓飒箭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜒灰。 傳聞我的和親對象是個殘疾皇子弦蹂,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容