ZooKeeperを使ってみる(2)

ノード作成と読み出しにどのくらいコストがかかるか見てみよう。とりあえず、ローカルで。あんまり意味ないけど、上限値はわかるだろう。

ノードの作成

こんな感じで、1000個作ってみる。

	byte [] b = args[2].getBytes();
	long start = System.currentTimeMillis();
	for (int i = 0; i < 1000; i++) {
		zk.create(args[1], b, acls, 
			CreateMode.EPHEMERAL_SEQUENTIAL);
	}
	long end = System.currentTimeMillis();

ノードを作るときにCreateMode にSEQUENTIALを指定すると、ノード名に10桁の連番が追加され、ユニークな名前になる。"hoge" なら "hoge0000000001", "hoge0000000002"というようにインクリメントされる。複数のクライアントが同時にアクセスしてもちゃんとユニークになるように調停される。

その前に書かれているEPHEMERALは「短命の」というような意味で、つくったプロセスが死ぬと自動的に消去される。消去されるとそのノードをWatchしているプロセスでコールバックが呼ばれるので、これを使って、プロセスの死活判定ができる。

ここでEPHEMERALを使っているのは、こうしておかないと、作ったノードを消すのが面倒くさいから(^_^;)。

結果は、手元のスタンドアローン環境だと1000ノードで、1.2秒ぐらい。意外に速いというか。コネクションは張りっぱなしのはずなので、もう少し出てもいいような気もしないでもない。

データの参照

今度は読み出してみる。SEQUENTIALで作ったノードを順々に読んでいる。各ノードのデータ量は数バイト程度。

	Stat stat = new Stat();
	long start = System.currentTimeMillis();
	for (int i = 0; i < 1000; i++) {
		String path = String.format("%s%010d", args[1], i+2000); 
		zk.getData(path, false, stat);
	}
	long end = System.currentTimeMillis();

Statというオブジェクトを空で渡すと、中にノードの状態が入って帰ってくる、というつくり。
複数値を返却できないので面倒くさい。

結果は1000ノードで0.9秒ぐらい。書き込みよりはちょっと速い、という感じか。

所感

書き込みにしろ、読み出しにしろ、マルチノード構成にして、クライアント側も複数プロセスでやらないと、あんまり意味のあるデータにならない。しかしクライアントを同期させて読み出しを書けるのもなかなか大変そう。どうしようかな。