多節點定時任務的同步

2021-08-25 08:57:21 字數 2122 閱讀 1243

現在有兩個或以上的web節點,啟動時,會查詢資料庫,根據資料庫中配置的資料(cron表示式等)建立定時任務。由於期望乙個任務定時只有乙個節點執行,所以需要多個web節點間做master競選,這個已經實現了,身為master的web節點會將定時任務傳送給實際執行的worker節點執行,非master節點的web節點會跳過此定時任務。

然而,由於系統有個功能,使用者可以在web頁面對定時任務進行增刪改查。當使用者訪問某乙個web節點增刪改時,該節點可以通過quartz新增、修改、刪除定時任務,但是,由於沒有訊息元件,其他的web節點無法得知定時任務的修改,還是按照它啟動時查詢資料庫得知的資訊在運轉,這肯定是有問題的。

思考了幾種解決方式:

只在master節點上做定時任務的增刪改

直接pass掉這個方案,首先,這樣做,非master的節點沒有意義,負載均衡沒有意義,如果master掛掉同樣會遇到定時任務丟失的問題

web節點定時查詢資料庫做更新

這並不是一種好的解決方式,頻率低了任務會不及時,頻率高了會頻繁查詢更新,並不友好。就好像websocket之前使用http做輪詢,除非逼不得已才這樣做

引入訊息佇列比如kafka

為了這乙個問題,需要重新搭建一套kafka集群,似乎成本太大(還要申請機器、環境、埠巴拉巴拉)。如果已經有一套公用的訊息集群和介面..這其實是個好辦法

用zookeeper作資訊同步

既然前面已經用了zookeeper做主從競選,那麼也繼續用它作為乙個定時任務資訊的同步器,多個web節點都對它保持監聽,如果發生變化,按規則更新自己本地的定時任務

總的來說,每個web節點在啟動時,查詢所有的定時任務,將每個定時任務寫到zookeeper上,並保持監聽,如果有修改,則根據情況更新本地定時任務

web節點啟動時,將所有定時任務通過quartz新增,同時,對於每乙個定時任務,向zookeeper的/jobs節點下建立新的臨時節點,節點為/jobs/, data為任務的具體資訊

web節點建立/jobs/節點後,對該節點保持資料監聽,同時對/jobs節點做子節點變化監聽

另乙個web節點啟動時,將所有定時任務通過quartz新增,同時,對於每乙個定時任務,向zookeeper中的/jobs節點下建立新的臨時節點,若節點/jobs/已存在,則保持資料監聽,同時,對/jobs節點做子節點變化監聽

某個web節點更新了某個定時任務的資訊,首先通過quartz更新本地定時任務,然後判斷zookeeper中該任務對應的臨時節點是否存在

4.1. 若存在,則更新該節點的資料;這時候,其他的web節點會收到該/jobs/節點的資料變化訊息,拿到變化後的資料,判斷與本地快取的是否一致,不一致則更新定時任務

4.2. 不存在,則新增節點/jobs/, 資料為該任務資訊,並新增監聽;這時候,其他的web節點會收到/jobs節點的子節點變化資訊,重新獲取/jobs下所有子節點資訊,並與本地快取的對比,判斷是否一致,若不一致,則更新定時任務

某個web節點新增了定時任務,首先通過quartz新增本地定時任務,然後向zookeeper中新增節點/jobs/,並新增監聽;這時候,其他web節點會收到/jobs節點的子節點變化資訊,依次獲取,新增監聽,判斷本地是否快取了此任務,若沒有,則新增,若有,則判斷是否有變化,變化則更新

某個web節點刪除了某個定時任務,由於業務上的刪除並不是實際刪除,只是修改該定時任務狀態,所以,該web節點並不是去刪除/jobs/節點,而是去修改它的data資訊。其他web節點監聽到此節點變化,需要判斷修改後狀態,再判斷是否需要本地刪除此定時任務

某個節點恢復了某個定時任務,由於不是物理刪除,等同於更新

如果某個web節點掛了,它建立的臨時節點會被刪除,其他web節點會收到通知,然後去獲取/jobs節點下所有子節點。由於這時候,僅僅是zookeeper上節點被刪除,但實際上,這個定時任務並沒有被修改,所以,我認為不需要對刪除的臨時節點做處理,其他臨時節點也不用去嘗試建立新的臨時節點,因為節點的刪除並沒有影響定時任務的執行,僅僅是新增和修改會影響

上面是大致的流程,感覺有些細節可能還會有問題,寫**的時候再考慮和測試

多節點定時任務校準

最近對公司專案做優化,之前的訂閱專案是指定主副節點模式,目前為了迎合市場分布式微服務技術,需改為無主節點概念的模式。通過查詢資料決定用redisson做分布式鎖,多節點根據持鎖標識決定是否分發任務 通過redisson是解決了多節分發問題,但是我們專案不是電商秒殺類的專案,是很定時任務分配,還需要解...

linux同步時間的指令碼 定時任務

進入定時任務編輯頁面 crontab e編寫每十分鐘同步一次的指令碼 10 usr sbin ntpdate node01保持與第一台機器時間上的同步,前提是要配好ssh免密登入 所以可能會缺少兩個外掛程式 yum y install openssh clients 識別ssh copy id yu...

小學入門 時間同步與定時任務

yum y install ntpdatentpdate pool.ntp.org hwclock wcrontab e522 0 usr sbin ntpdate pool.ntp.org523 0 sbin clock w錯誤的配置 原因在後文中解釋 crontab e522 0 ntpdate...