LoginSignup
6
6

More than 5 years have passed since last update.

ZKメモ

Posted at

はまりどころ

  • 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)
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6