1

ZooKeeper를 데이터 저장소로 사용하는 응용 프로그램을 개발 중입니다. 응용 프로그램의 메소드 중 하나에 대해서는 낙관적 동시 제어를 사용해야합니다. 예를 들어 znode 데이터를 가져 오는 get 메소드를 구현해야하며 낙관적 인 동시 제어 검사를 위해 znode 데이터 버전을 사용합니다. 내가 이해하는 한, 하나의 작업으로 znode 데이터와 znode 데이터 버전을 얻을 수 없다. znode 데이터를 업데이트하기 위해 경합이 많으면 znode 데이터를 가져온 후에 znode 데이터가 변경 될 수 있으므로 get 메소드가 작동하지 않습니다. 그래서 내가 묻는 오전 - 내가 얻을 수있는 방법은 znode 데이터 및 znode 데이터 버전 (또는 znode 통계) 하나의 단일 작업에 사이에 어떤 잠금 시도없이 수 있습니까?ZooKeeper는 znode 데이터와 znode 데이터 버전 (stat)을 하나의 단일 연산으로 얻을 수 있습니까?

답변

5

자바에서, 당신은 당신이 쉽게 원하는 것을 얻을 수 있습니다 :

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

이 한 번의 작업으로합니다 (stat 객체)를 읽어 데이터 및 버전 정보를 않습니다. 버전이 일치하지

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

경우,이 방법은 당신에게 낙관적 잠금을 제공하는 KeeperException.BadVersionException가 발생합니다 : 당신이 데이터를 다시 작성할 때 당신이 그것을 읽을 때, 당신은 당신이 가지고 버전 번호를 전달합니다.

+0

큐레이터 2.8.0을 사용 중이며 에 리팩터링되었습니다. Stat stat = new Stat(); c.getData(). storesStatIn (stat) .forPath ("/ path"); – matsa

0

Python에서 Kazoo를 사용하면 통계를 모두 얻고 일부 안과 적 잠금을 구현하는 것도 쉽지 않습니다. 여기 스케치 :

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 

또한, 수있을 때 그들은 이미 광범위하게 디버그하는 한, 미리 만들어진 조리법을 사용합니까, 모든 코너 케이스를 처리해야합니다.