2016-12-16 9 views
0

3匹の飼い猫を3匹のマシンに入れ、それぞれの飼い主にカフカブローカーを1匹置く。ホストの 数:znodesの3 数を追跡することができる:1 [1 *ホストの数= 3] のznodeがその状態を変更したときZookeeper.Statクラス変数をホスト&のznodeを追跡する任意方法はあります[caseOk/NoNode]。 複数のホストポートでalive znodeを追跡するためのカウンタを実装しようとしています。 最初のznodeを識別するポイントに乱れがあり、インスタンスが存在し、インスタンスが再接続しています。飼い猫znode時計カウンター

答えて

0

ご質問には多少の曖昧さがあります。私は3つの独立したZookeeperノード(スタンドアロンまたは3つの別々のアンサンブル)があり、すべてのZookeeperノードの/some/pathに同じZNodeを見たいとします。

最も簡単な方法があるに

(あなたは3つのノードを持つ単一のアンサンブルを参照している場合はアンサンブルアンサンブル内のノード上の一貫性を保証するよう、そして、あなたがノードを心配する必要はありません) Apache Curatorレシピ(recipes参照)、NodeCacheを使用してください。 Apache Curatorは一連のレシピであり、標準のZookeeperClientへの拡張機能です。内部的にすべてのエッジケースと接続状態を管理するので、純粋なZookeeperクライアントの問題を心配する必要はありません。 NodeCacheは(与えられたZPathで)与えられたZNodeを見て、そのZNodeに起こった変更を通知できます。

CuratorFrameworkインスタンスを初期化する方法を理解するには、this answerを参照してください。

上記の答えに記載されているように、3つの接続文字列(3つのノード用)を持つ3つのCuratorFrameworkインスタンスを初期化してから、クライアントごとにNodeCacheオブジェクトを開始するだけです。

CuratorFramework client1=//create CuratorFramework intance with corresponding connection string. 
CuratorFramework client2=//create CuratorFramework intance with corresponding connection string. 
CuratorFramework client3=//create CuratorFramework intance with corresponding connection string. 

そして、それらすべてのクライアントを起動する最後

client1.start(); 
client2.start(); 
client3.start(); 

、各CuratorFrameworkインスタンスのためのznodeのためNodeCacheインスタンスを作成して開始します。

NodeCache znode1=new NodeCache(client1, "/znode/path"); 
NodeCache znode2=new NodeCache(client2, "/znode/path"); 
NodeCache znode3=new NodeCache(client3, "/znode/path"); 

次に、各ノードキャッシュにNodeCacheListenerを追加して、ZNodeの変更をサブスクライブします。

znode1.getListenable().addListener({listener class implementing NodeCacheListener}); 
znode2.getListenable().addListener({listener class implementing NodeCacheListener}); 
znode3.getListenable().addListener({listener class implementing NodeCacheListener}); 

次に、それらを開始します。

znode1.start(); 
znode2.start(); 
znode3.start(); 

登録したリスナーによって変更が行われます。あなたはアイデアを持っているといいですね。