Le moyen le plus efficace pour créer un chemin d'accès dans zookeeper où les éléments racine du chemin d'accès peut ou peut ne pas exister?
Imaginer un chemin "/root/enfant1/enfant2/enfant3"
Imaginer dans zookeeper que peut-être une partie de ce qui existe, dire "/root/enfant1"
Il n'y a pas d'équivalent de "mkdir -p" dans zookeeper; Aussi, la Gardienne.multi() échoue si un échec de l'opération, de sorte qu'un "faire le chemin" ne pouvait pas vraiment être cuit au four dans un multi appel. En outre, vous pourriez avoir un autre client en essayant de faire le même chemin...
C'est ce que j'ai trouvé pour créer un chemin. Je me demande si c'est même la peine de vérifier pour voir si une partie existe ou pas, pour enregistrer le trajet aller-retour de la exists() de l'appel.
//String[] pathParts new String[] { "root", "child1", "child2", "child3" };
public void savePath(String[] pathParts) {
if (zooKeeper.exists(pathString, false) != null) return;
StringBuilder path = new StringBuilder();
for (String pathElement : pathParts) {
path.append(UNIX_FILE_SEPARATOR).append(pathElement);
String pathString = path.toString();
try {
//bother with the exists call or not?
if (zooKeeper.exists(pathString, false) == null) {
zooKeeper.create(pathString, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
if (e.code() != KeeperException.Code.NODEEXISTS)
throw e;
}
}
}
Quel serait le moyen le plus efficace pour ce faire? En supposant que a) vous ne savez pas à l'avance combien le chemin d'accès existe déjà et b) un autre client pourrait être en train d'essayer d'écrire le même chemin (et nous voulons éviter de verrouillage).
- Pouvez-vous donner un exemple de ce que la variable d'instance de la voie et ce qui est passé à la pathParts paramètre? Un peu confus sur le code comme sa ajoutant chemin à lui-même.
- désolé - eu quelques erreurs dans ce. fixe maintenant, plus ou moins.
Vous devez vous connecter pour publier un commentaire.
Existe un appel peut être fait avec 1 aller-retour à partir du serveur vers le client.
Un appel à create a le même aller-retour, mais de créer est une opération d'écriture qui implique un couple de plus d'allers-retours entre les serveurs de la zk cluster, donc un créer est un peu plus cher qu'un existent.
Donc le temps total pour votre algorithme est,
Temps pour 1 lire l'op * Probabilité nœud existe déjà + (Temps de 1 écrire op) * (1 - Probabilité que le nœud existe déjà).
Donc, soit de
if(!exist()) create()
vscreate()
pourrait être plus rapide. En fin de compte, il n'a probablement pas d'importance.Si vous voulez être vraiment rapide, vous pouvez utiliser l'api asynchrone de sorte que vous pouvez créer tous les composants de votre chemin, sans attendre que le serveur à répondre à des demandes 1 par 1.
Vous pouvez utiliser Netflix, conservatrice de la bibliothèque qui rend l'utilisation de zookeeper beaucoup plus simple
client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE).forPath("/root/child1/child2/child3");
client.checkExists().creatingParentContainersIfNeeded().forPath("/someapp/somemodule/someroute")
si vous voulez juste pour s'assurer que le chemin d'accès n'existe