Ruby
ZooKeeper
More than 3 years have passed since last update.

はまりどころ

  • get("/path", watch: true)を何回登録しても一回だけコールバックされる。(ソースコメントより)
  • Watcherのcallback内は、例外がつぶされる。
  • createするときに間のpathが無いとProcessがとまる。。

create

zk.create("/test", "abc")
# 2番目の要素はznodeの状態
zk.get("/test") #=> ["abc", #<Zookeeper::Stat>]

オプション

ignore

# 既にノードがあってもエラーにならない
zk.create("/test", ignore: :node_exists)

# 途中のノードが無くてもエラーにならない
zk.create("/test/abc", ignore: :no_node)

ephemeral

# Ephemeralノードとして作成する
zk.create('/ephe', ephemeral: true)

or

# :setと渡すと途中のpashを生成してくれる。
# sequentialとehemeralがだめ?(ソースのコメントより)
zk.create('/foo/bar/text', or: :set) #=> /foo/bar が無くても作られる。

Stat

znodeの値とステータスを取得する

# 配列で [value, stat] と返される
value, stat = zk.get("/path")

# Ephemerarlかどうか?
stat.ephemeral? 

Locker

Lockには以下の二つのtypeがある
default znodeをきめれる 

default znodeを変更する

ZK::Locker.default_root_lock_node = "/abc"

exclusives_locker

普通のロック

使い方

# 注) ロックをとったインスタンスでしかunlockできない
locker = zk.locker('hoge')
if locker.lock
  # do something
  locker.unlock
end

shared_locker

よくわからない

eventでとれる情報

zk.register(path) do |event|
  # watch対象のnodeが作られた?
  event.node_created?

  # watch対象のnodeに変更?
  event.node_changed?
end

find

指定したノードに対し逐次実行していく。

zk.find("/root") do |path|
  p path # ここで処理を実行していく

  # abc以下はトラバースしない。
  ZK::Find.prune if path == "/root/abc"
end

子ノードの変更を常に監視する。

※ event => 再度event登録までのeventは拾えない

zk = ZK.new

# 子ノードに追加・削除があったときに実行されるブロックを登録
zk.register("/test1") do |event|
  p event
  # 一度よばれると、Watcherの登録が消されるので再度登録
  zk.children("/test1", watch: true)
end

# watch開始
zk.children("/test1", watch: true)