2017-01-03 57 views
0

自從一週以來,我一直在想這個,但是我沒有想到讓我信服的任何東西。Apache Ignite - 在羣集中排定

我有一個小羣集在所有節點上運行帶澤西島的Jetty(它們都是相同的)。請求在節點上是均衡的,並且所有節點都是「無狀態的」。

用戶數據使用Jetty嵌入在JVM中的Apache Ignite上進行分區,因此可供任何節點訪問。

到目前爲止,所有對這些數據執行的操作都是由REST請求觸發的,並由節點管理,請求偶然發現。但現在需求已經改變。示例如下:

用戶執行特定操作(提供虛擬物品)後,其他隨機用戶很少會收到有關兌換此商品的機會的通知。在他們中的任何一方採取行動(在發佈後的限定時間內),他們將擁有它。 這裏的問題是:如果沒有用戶在給定時間內兌換商品,我想挑選幾個新用戶並通知他們。

這將需要安排,我只能看到兩種解決方案:

  • 附表那個通知的前幾個用戶節點上的事件。 (如果節點失效或重新加載,則不可靠)

  • 來自所有節點的池存儲了觸發到期事件所需的數據的分佈式集合。然後運行那些過期的。 (當這個系列增長時看起來效率較低的解決方案)

    • 兩者的hibrid;事件存儲在分佈式集合中,並且預定可能很好。如果節點不失敗,將運行並刪除收集條目。集合的緩慢迭代將檢查是否有過期的事件並且尚未被刪除。 (它看起來可能難以調試和預測的解決方案)

除了我已閱讀DelayedQueue執行和不看一個有效的系統來管理計劃任務量很大。

我會承認我被卡住了,我需要一個關於如何在集羣基礎上安排事件的建議,以確保它們將被調用,因爲它們將抵抗節點故障。

回答

0

我想你可以創建一個集羣單例(https://apacheignite.readme.io/docs/cluster-singletons),它將負責調度。這將自動處理崩潰情況下的故障轉移。如果存在任何狀態(例如關於通知的用戶的信息,上次安排作業的時間戳等),則可以將其保存在緩存中。