Elastic Job任務重複執行問題解決

2021-08-13 22:48:09 字數 893 閱讀 5624

關於elastic-job的使用和介紹請檢視我之前的文章 房價網是怎麼使用分布式作業框架elastic-job

當前使用的版本是:2.1.5

最近在重新發布任務**時出現了乙個很詭異的問題,就是我重啟任務程式後,大概1分鐘左右吧,之前執行過的任務又重新執行了一遍,我那些任務都是凌晨跑的,我中午重啟程式,居然全部執行了一遍。

雖然這個不影響使用,因為我的作業都支援冪等操作,但是好奇心驅使我去解決這個問題。

首先說說排查問題的思路:

1.這個問題肯定不是定時時間的問題,時間配置的都是凌晨,而且平時也都正常,所以這點可以排除

2.在配置中只有乙個值得懷疑,那就是失效轉移failover="true".如果在任務執行過程中有乙個執行例項掛了,那麼之前被分配到這個例項的任務(或者分片)會在下次任務執行之前被重新分配到其他正常節點例項上執行。

3.順著這個思路,我把失效轉移關閉了,然後重啟程式,果然正常了。

4.但是失效轉移是乙個很有用的特性,如果去掉的話那麼萬一任務執行過程中發生異常,不就不能容錯了嗎,還是需要開啟的,但是要從另外的方向去思考為什麼會觸發失效轉移這個邏輯。

5.由於我是直接將程式停止,然後馬上啟動,中間沒有間隔時間,於是我先停掉程式,然後等zk中instances下的例項資訊失效之後再重啟程式,果然正常了。

我大概的猜測是當instances下的例項還沒失效,然後我們又啟動了乙個,這個時候instances下就有2個例項了,當之前停止的乙個例項節點失效的時候,我們重起的那個程式會監聽zk的instance節點刪除事件,然後觸發失效轉移。

至於真正的原因還是得看原始碼哈,我上面只是猜測,後面有時間再去除錯然後跟大家分享下。

防止 crontab 定時任務重複執行

前言 crontab 定時任務很好使用,它的定時是很強硬的,直接跟系統時間打交道,不會去管程式本身執行是否需要時間。舉個栗子 乙個指令碼執行需要 1 小時,使用 crontab 每隔2小時執行一次,一般情況下下次執行指令碼時上次指令碼執行肯定是跑完了的 但是,假如,程式卡住了呢?下次執行時上次指令碼...

時間緊,任務重

最近一段時間單位事情比較多,時間緊,任務重!呵呵,開個玩笑,都是一些瑣碎的事情。單位輪崗的制度的實行,慢慢激發了不少人的學習興趣,中心的學習氣氛也濃郁起來。不過人員的變動也增加大家講課和學習的任務。其實隔行如隔山,換乙個崗位還是需要一段的時間來適應的。時間緊,任務重的直接後果是回老家的機會少了,不能...

ErrorRecovery 之任務重置

在 initiator 處理乙個任務時,任務未完成,但中間資料有誤了 如 crc 失敗 可以通過任務重置來本 connection 上的該任務分配置到乙個新的 connection 中,然後繼續完成乘下的資料,免得整個任務重新執行。任務重置屬於commond recovery,涉及到多 connec...