Ich bin in der Suche nach einem consistent hash Algorithmus in einigen Java-Code, den ich schreibe. Die Guava-Hashing-Bibliothek hat eine consistentHash(HashCode, int)
Methode, aber the documentation fehlt eher. Meine anfängliche Hoffnung war, dass ich einfach consistentHash()
für einfache Sitzungsaffinität verwenden konnte, um die Last effizient auf eine Reihe von Backend-Servern zu verteilen.Wie sollte ich Guavas Hashing # consequentHash verwenden?
Hat jemand ein Beispiel aus der Praxis, wie man diese Methode benutzt? Insbesondere gehe es mir darum, das Entfernen eines Eimers aus dem Zielbereich zu verwalten.
Zum Beispiel:
@Test
public void testConsistentHash() {
List<String> servers = Lists.newArrayList("server1", "server2", "server3", "server4", "server5");
int bucket = Hashing.consistentHash(Hashing.md5().hashString("someId"), servers.size());
System.out.println("First time routed to: " + servers.get(bucket));
// one of the back end servers is removed from the (middle of the) pool
servers.remove(1);
bucket = Hashing.consistentHash(Hashing.md5().hashString("blah"), servers.size());
System.out.println("Second time routed to: " + servers.get(bucket));
}
führt zur Ausgabe:
First time routed to: server4 Second time routed to: server5
Was ich will, ist für diese Kennung ("someId") auf den gleichen Server nach dem Entfernen eines Server früher zur Karte In der Liste. Also im obigen Beispiel würde ich nach dem Entfernen wahrscheinlich Bucket 0 auf "Server1", Bucket 1 auf "Server3", Bucket 2 auf "Server4" und Bucket 3 auf "Server5" mappen.
Soll ich eine separate (komplizierter als eine Liste) Datenstruktur verwalten, um Bucket-Entfernung und -Einfügung zu verwalten? Ich denke, ich hatte mir vielleicht eine kompliziertere Hashing-API vorgestellt, die die Neuzuordnung nach dem Hinzufügen und Entfernen bestimmter Buckets für mich verwalten würde.
Hinweis: Ich weiß, dass der Beispielcode eine kleine Eingabe und einen Bucket-Satz verwendet. Ich habe dies mit 1000 Eingaben pro 100 Buckets versucht und das Ergebnis ist das gleiche. Eingaben, die den Buckets 0 bis 98 zugeordnet sind, bleiben gleich, wenn ich den Wert buckets
zu 99 ändere und der Bucket 99 über die restlichen 99 Buckets verteilt wird.
Sie beachten ist richtig ... aber man kann sehen, dass Guava nichts über Ihre Liste außer seiner Größe kennt, kann Bist du? So kann es nichts anderes tun. – maaartinus
Ich denke, das ist der Dokument-Link, den Sie wirklich möchten: http://docs.guava-libraries.googlecode.com/git-history/release13/javadoc/com/google/common/hash/Hashing.html#consistentHash%28com. google.common.hash.HashCode,% 20int% 29 - obwohl es wahr ist, gibt es dort nicht viel, was soll es sonst noch sagen? –
@Kevin - Die Dokumentation ist wahrscheinlich O.K. Wenn überhaupt ein paar Worte mehr über die Anforderung auf Ergänzungen/Entfernungen am Ende sein. Ich habe meine Frage gestellt, weil ich gehofft hatte, dass meine Interpretation falsch ist, und es gab einen offensichtlichen Weg, die Bucket-Manipulation zu verwalten, an die ich nicht gedacht hatte. Ich kam zur Guava-Methode, nachdem ich mit dem Wikipedia-Eintrag begonnen hatte und die dort erwähnte Java-Implementierung gelesen hatte, also erwartete ich etwas näher zu sehen, was diese beiden Artikel beschreiben (mehr wie Chris Beschreibung, was in einer Antwort unten steht). – GamingBuck