2017-04-25 26 views
0

我正在編寫一個Java應用程序的設計文檔,其中兩個冗餘進程從消息隊列中讀取項目,並且我們希望他們兩個都使用相同的密鑰將項目存儲到gemfire存儲中,意圖是有一個運行連續查詢的應用程序的數量處理這些項目,然後將結果存儲到另一個Gemfire區域。Gemfire對衝突和重複條目的彈性如何?

我剛剛開始熟悉Gemfire,目前我還沒有能力安裝多服務器測試平臺,所以我想我會在進行研究時問幾個問題。

假設兩個進程同時在gemfire中存儲該項目會導致任何問題?

如果一個關鍵字被寫入兩次,該項目會被覆蓋,並且我可能在關鍵被鎖定時遇到任何問題(性能或其他)?

如果我有一個連續的查詢運行該項目將匹配,我會得到兩個「點擊」/(事件?)的查詢或只是第一個生成一個命中?

如果我有4個進程使用相同的密鑰寫入商店的相同項目,這會有什麼不同?

回答

1

如果您正在編寫的區域被分區,則您列出的方案將正常工作。在這種情況下,只有在需要在不同節點上覆制對象時,主鍵纔會被鎖定。這裏主要考慮的是網絡的速度。第二次寫入將覆蓋第一個。至於這是否適合您的性能取決於您每秒鐘流入的對象數量。

以下是一些需要考慮的替代方案: 1)您可以創建一個持久隊列,並僅在一個客戶端上運行CQ。如果客戶端出現故障,您只需重新啓動它並保持一致性。 2)在服務器上創建一個分區的「事務」區域。在您的客戶端上,將從CQ返回的對象放入「事務」區域,並將CQ時間戳添加爲密鑰的一部分。在「事務」區域的異步事件偵聽器中,更新您的目標區域並刪除「事務」區域中的對象。 3)創建一個與您的目標區域位於同一位置的「交易」分區。創建一個函數onRegion(partitionedTransactionRegion).withFilter(key).withArguments(object和CQ timestamp)。你的客戶用上面的簽名調用函數。該函數檢查key + timestamp是否已經添加到「transaction」區域中。如果是這樣,請忽略該操作。如果沒有,請在「交易」區域中設置密鑰(密鑰+ CQ時間戳)並更新您的目標區域。將「交易」區域的到期策略設置爲在一小時,一天或者您的偏好之後過期。

+0

感謝您的確認。 –