2017-09-22 38 views
1

我找了一個很好的解決方案如何從少數情況下一個執行計劃任務上創建計劃任務仲裁者。如何不同勢服務器

問題: 我有一個Spring服務器的Java服務器。另外我有一個計劃任務,使用@Scheduled(cron="...")註釋運行。我的應用程序適用於負載平衡器,通常它可以在3個實例上運行。計劃任務會更新postgres數據庫,並且計劃任務會同時在3臺服務器上運行。

我怎麼能只運行在一個從服務器的計劃任務?

非常感謝!

回答

2

你必須以某種方式選擇一個領導者,選擇一個領導者是十分困難https://en.wikipedia.org/wiki/Consensus_(computer_science)。然而,有相當多的解決方案可以幫助選擇領導者。

我個人很喜歡http://curator.apache.org/很多。但是這取決於你已經在使用的工具,有可能是已經的東西,可以提供所需的領導人選舉支持像Redis的(https://redis.io/topics/distlock)或數據庫(Postgres - >諮詢鎖)。

最簡單的辦法但是,如果你不需要故障轉移功能,是一個應用程序配置爲在配置文件中的鉛,在未設置配置不執行任務。

+0

我在考慮這樣一個情況,即實例中的一個可能因操作執行困難而被卡住,所以在這種情況下,計劃任務必須在第二個服務器上運行,而不是'leader' –

+0

那麼您很可能需要某種超時,如果n分鐘沒有進展,則假定進程失敗並在另一個節點上安排工作。然後另一個節點可以收集鎖並開始處理。此外,您可以將文件記錄在表格中。有關於工作隊列的多個帖子,在stackoverflow上使用postgres,只需要搜索它們。 – Andreas

+0

我已經完成了使用Redis的分區鎖定,謝謝! –

相關問題