1

我正在開發一個使用ZooKeeper作爲數據存儲的應用程序。對於應用程序中的其中一種方法,我需要使用樂觀併發控制。例如,我需要實現一個獲取znode數據的get方法,並且我使用znode數據版本進行樂觀併發控制檢查。據我所知,在單一操作中無法獲得znode數據和znode數據版本。如果更新znode數據的爭用較高,則get方法將不起作用,因爲znode數據可能在獲取znode數據後發生變化。所以我問 - 是否有一種方法,我可以在一個單一的操作znode數據和znode數據版本(或znode stat)沒有任何鎖定嘗試之間?ZooKeeper可以在一次操作中獲得znode數據和znode數據版本(stat)嗎?

回答

5

在Java中,你可以可以實現你想要什麼輕鬆:

Stat stat = new Stat(); 
byte[] data = zk.getData("/path", null, stat)); 

這確實在一次操作中讀取數據和版本信息(在stat對象)。當你寫回的數據,你通過你得到的版本號,當你閱讀:

zk.setData("/path", data, stat.getVersion()); 

如果有一個版本不匹配,該方法將拋出KeeperException.BadVersionException,它給你一個樂觀鎖。

+0

我使用的是Curator 2.8.0,這已被重構爲 Stat stat = new Stat(); c.getData().storageStatIn(stat).forPath(「/ path」); – matsa

0

在使用Kazoo的Python中,獲取兩個統計信息並實現一些optmistic鎖定也是微不足道的。這裏草圖:

while True: 
    data, stat = zk.get("/path") 
    # do something with the data and then: 
    try: 
     zk.set("/path", new_data, stat.version) 
     break 
    except BadVersionError: 
     continue # or pass 

而且,你什麼時候可以使用預先製作的食譜,因爲它們已經廣泛debuged,而且應該把所有角落的情況。

相關問題