0

この質問は、python を使用している飼育係に対して既に尋ねられ、回答されていることを知っています。答えは良かったのですが、コードにもっと関連したものが欲しいです。ノードを作成するメソッドを既に実装していますが、再帰的に実行したいと考えています。私のノードの構造は次のようになります。

ズーキーパー

  • ウェブサーバー
    • サーバー1
    • サーバー2
  • モジュールが接続されました
    • データベースモジュール
      • コンピューター1
      • コンピューター2
    • サービスモジュール
      • コンピューター3
    • 検索モジュール
      • コンピューター4

私は次のようなものを持っています:

Zookeeper zk = new Zookeeper(...);

public void createNodeRecursively(String type) {
    final String node = "/" + type + "/" + info.getIP() + ":" + info.getPort(); // Correct line
    if (zk.exists("/" + type, null) == null) {
        Object ctx = new Object();
        StringCallback cb = new StringCallback() {
            public void processResult(int rc, String path,
                                Object ctx, String name) {
                if (name.equals("/" + type))// just in case
                    try {
                        zk.create(node, info.getBytes(),
                            Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        };
        zk.create("/" + type, info.getBytes(), Ids.OPEN_ACL_UNSAFE,
                            CreateMode.PERSISTENT, cb, ctx);

    } else
        zk.create(node, info.getBytes(), Ids.OPEN_ACL_UNSAFE,
                            CreateMode.EPHEMERAL);
    } 
}

ご覧のとおり、私は zk.create を何度も使用しているため、パフォーマンスを向上させ、より良いコードを作成するために、メソッドを再帰的にしたいと考えていますが、開始方法がわかりません。これで私を助けることができます。事前にどうもありがとうございました。

4

2 に答える 2

0

私はより良いパフォーマンスを達成することができました:

public void createNode(NodePath nodePath, NodeData nodeData, NodeRights nodeRights, NodeCreationHandler nodeCreationHandler) throws KeeperException, InterruptedException, ZookeeperCreationException {

        if (zk == null) {
            throw new ZookeeperCreationException("The zookeeper client has not been instanced.");
        }       
        String targetPath = nodePath.getFullNodePath();
        targetPath = targetPath.substring(1, targetPath.length());
        byte[] serializedData = nodeData.serialize(new Object());
        String[] array = targetPath.split(ICoordinationConstants.BASE_ROOT_SPTR);
        String acum="";
        for (int i = 0; i < array.length-1; i++) {
            acum+=(ICoordinationConstants.BASE_ROOT_SPTR+array[i]);
            if (zk.exists(acum, null) == null) {
                zk.create(acum, serializedData, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
        }
        zk.create(acum+ICoordinationConstants.BASE_ROOT_SPTR+array[array.length-1], serializedData, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);             
    }
于 2013-04-25T18:13:14.947 に答える
0

Zookeeper には便利なプロパティがあります。

  1. (書き込み) 要求の合計順序
  2. その非同期性。

あなたはそれを使うことができます。ツリー全体を一連の非同期リクエストとして正しい順序で発行し、すべてが正常に実行されるまで待ちます。もちろん、「NodeExists」例外は無視できます (ただし、このようなエラーがログに書き込まれるため、これは適切ではありません)。

于 2013-04-18T05:57:51.963 に答える