我在编写的java代码中的算法用一致散列。guava哈希库有一个consistentHash(HashCode, int)
方法,但是文献相当缺乏。我最初的希望是consistentHash()
对于简单的会话关联,可以在一组后端服务器上有效地分配负载。
有没有人有一个例子?特别是如何从目标范围中删除一个桶。
例如:
@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));
}
输出:
First time routed to: server4
Second time routed to: server5
我希望该标识符(“omeId”)在删除列表前面的服务器后映射到同一台服务器。因此,在上面的示例中,在删除之后,我想我希望桶0映射到“server 1”,桶1映射到“server 3”,桶2映射到“server 4”,桶3映射到“server 5”。
我是否应该维护一个单独的(比列表更复杂)的数据结构来管理桶删除和添加?我想我可能设想了一个更复杂的哈希API,它将在为我添加和删除特定的桶之后管理重新映射。
相似问题