2013-04-29 149 views
1

我關心的是持久性的故障切換場景,我正在考慮應該如何正確實施它。根據以往的經驗,我認爲如果基礎持久性未能存儲實體,只要問題得到解決,就應該能夠將其存儲起來。就在地圖中緩存的Hazelcast實體而言,它具有管理它與MapStore的關係的狀態。Hazelcast:持久性故障切換

如果MapStore實現無法存儲,會發生什麼情況?如何讓實體重新應用到MapStore業務?

更新:

這並不是實現MapStore本身的故障轉移,以保持項目在隊列中,除非底層持久的業務將變得可用,但這打破了分佈式存儲的思想有問題。另一方面,如果MapStore中出現的數據將被放回緩存中,可能會導致不一致,不是嗎?

+0

pryvit。對你/他人如何處理這個問題感興趣。根據應用程序的要求,我認爲如果持久性失敗,可以簡單地從地圖中移除對象(直到可以重新插入到地圖中並因此插入到數據存儲區時可以工作,或者避免寫入,因爲它可能永遠不會工作) - 刪除處理程序將需要修改,以避免嘗試從數據庫中刪除數據,可能不在那裏開始。可以嘗試使用狀態標誌來避免從地圖讀取此值,直到持久性工作或失敗(以避免可能有效或無效的讀取)。 – 2013-05-01 00:42:09

+0

我確信這裏有漏洞 - 有興趣聽到它。 – 2013-05-01 00:42:47

+0

同意你的意見。我有一種感覺,用髒旗或其他內部生命週期業務來玩可能會感興趣,但它是一個內部API,因爲它在文檔中沒有提到。在這裏有一個Hazelcast的人來獲得一些線索是很好的。 – 2013-05-06 05:38:54

回答

6

甲持久性可以配置成

  • 寫入通過
  • 寫入後面。

如果通過寫入,如果MapStore由於某種原因失敗,您將在map.put上發生異常。

在後面寫入的情況下,每10(默認)秒Hazelcast會將所有髒條目作爲批量持久化。如果MapStore拋出異常,那些條目將被標記爲髒,並且在下一次運行中,它們會再次傳遞給MapStore。基本上Hazelcast將繼續存儲它們,直到MapStore.storeAll()成功。根據我的理解,你的情況會變成這個類別,而Hazelcast確實提供了故障轉移。