2015-11-10 68 views
0

這裏是我們的用例:分佈式緩存使用情況與Hazelcast

我們有實現分佈式緩存hazelcast每個 節點可以通過JMS具有相同的事務密鑰獲得多條消息,我們添加4-8節點緩存中的所有消息與對象所在的鍵 - 對象對一起緩存項目列表

聚合通過apache-camel完成,其中聚合器運行300個MILLISECS 在300個MILLISECS之後,我們關閉聚集窗口並從緩存中清除與事務密鑰相對應的所有項目並以編程方式聚合它們。 Hazelcast的作用僅是收集信息在高速緩存中的地圖,並保持所有節點同步,其中,所有節點都知道在高速緩存中 問題場景是什麼物品:

  1. 節點1在高速緩存中的交易增加了物品1 -key = tx1 at 17:01:01:100 - 並且我們假設hazelcast將這個信息廣播給其他節點,使得所有節點獲得緩存項目的副本。
  2. 節點2在17:01:01:105處爲transaction-key = tx1在緩存中添加item2節點3在緩存中爲transaction-key = tx1在17:01:01:350處添加item3 現在,假設在17:01:01:400,我們嘗試使用事務鍵= TX1從緩存關閉聚合窗口和編程驅逐所有項目

的問題是,節點1,節點知道物品1和item2,因爲他們有時間來同步他們的緩存項目。但是node3添加item3的時間太晚,以至於node1和node2在17:01:01:400不知道item3。 假設我們在17:01:01:400開始從不知道item3的node1開始驅逐,它會給我們一個只有2個項目的對象 然後node1將廣播給所有人以驅逐所有緩存項目,響應鍵= TX1到所有節點將清除緩存事務鍵= TX1 這導致丟失物品(項目3)

得到任何幫助。

+0

我試圖回答您的問題。如果您需要更多幫助,請在您的問題中添加更多相關詳細信息。 – Dinesh

回答

0

我相信您的IMAP設計如下:

IMap<TransactionKey,List<CacheItem>> transactionMessagesMap

的問題是,節點1,節點知道物品1和ITEM2,因爲他們 有時間同步的緩存項。但節點3添加item3的時間太晚了 節點1和節點2在17:01:01:400不知道item3。

你是如何把一個IMap項?您是否使用set()put()putAsync()put()set()是同步調用,因此節點3所做的更改將以同步方式反映出來。

請注意put()/set()IMap的操作是同步的。但是,如果您想確保當某個節點在您的列表上運行(例如,添加一個新項目),其他所有其他節點的後續請求都應該看到更新的列表,那麼您可能需要使用分佈式鎖定針對相關的關鍵。即

增加新的項目可能的代碼如下:

transactionMessagesMap.lock(transactionKey); 
list = transactionMessagesMap.get(transactionKey); 
list.add(newItem); 
transactionMessagesMap.set(transactionKey, list); 
transactionMessagesMap.unlock(transactionKey); 

代碼驅逐的項目可能如下:

// In your case node1 will block here until node3 has successfully updated 
// item3 in the list. 
transactionMessagesMap.lock(transactionKey); 
list = transactionMessagesMap.get(transactionKey); 
for(CacheItem item : list) 
{ 
    // perform your eviction logic here. 
} 
transactionMessagesMap.unlock(transactionKey); 

您可以決定何時釋放根據鎖定您的邏輯。根據您的使用情況,基本思想是利用一些分佈式鎖定機制,如IMap.lock()ILock。希望這可以幫助。