我們使用Spring來運行可以在單節點上正常工作的計劃任務。我們希望在N個節點的集羣中運行這些計劃任務,這樣任務在某個時間點最多由一個節點執行。這是針對企業用例的,我們可能預計高達10到20個節點。集羣中使用zookeeper的計劃任務
我看着各種選項:
- 使用Quartz這似乎是在一個集羣中運行計劃任務的熱門選擇。缺點:我想避免的數據庫依賴。
- 使用zookeeper並始終僅在領導/主節點上運行計劃任務。缺點:任務執行負載未分佈
- 使用zookeeper並在所有節點上調用計劃的任務。但是在任務運行之前,一旦執行完成後獲得分佈式鎖定和釋放。 缺點:如果應用程序過載導致系統時鐘漂移,所有節點上的系統時鐘應該同步,這可能是一個問題。
- 使用zookeeper並讓主節點按照時間表繼續生成任務並將其分配給隨機工作人員。如果先前的計劃任務尚未完成,則不分配新任務。缺點:這似乎增加了太多的複雜性。
我傾向於使用#3,這似乎是一個安全的解決方案,假設zookeeper合奏節點在單獨的羣集上運行,系統時鐘使用NTP同步。這也假定如果系統時鐘同步,那麼所有節點都有相同的機會獲得執行任務的鎖。
編輯:經過一些更多的想法後,我意識到這可能不是一個安全的解決方案,因爲系統時鐘應該在計劃任務運行的節點之間同步,而不僅僅是動物園管理員羣集節點。我說的不安全,因爲運行任務的節點可能因GC暫停和其他原因而過載,並且可能會出現時鐘不同步的情況。但是我再次認爲這是分佈式系統的標準問題。
你能否告訴我,如果我對每個選項的理解是準確的?或者可能比列出的選項有更好的方法來解決這個問題。
僅供參考 - 我爲Curator/ZooKeeper編寫了一個分佈式任務調度程序。 https://github.com/NirmataOSS/workflow – Randgalt