小编Gam*_*uck的帖子

我应该如何使用Guava的Hashing#consistentHash?

我正在研究在我正在编写的一些java代码中使用一致的哈希算法.番石榴哈希库有一个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));
}
Run Code Online (Sandbox Code Playgroud)

导致输出:

First time routed to: server4
Second time routed to: server5

我想要的是在清除列表中较早的服务器之后将该标识符("someId")映射到同一服务器.所以在上面的示例中,删除后我想我想要桶0映射到"server1",桶1映射到"server3",桶2映射到"server4",桶3映射到"server5".

我是否应该维护一个单独的(比列表更复杂)数据结构来管理存储桶删除和添加?我想我可能已经设想了一个更复杂的Hashing API,可以在为我添加和删除特定存储桶后管理重新映射.

注意: …

java guava consistent-hashing

22
推荐指数
1
解决办法
8241
查看次数

标签 统计

consistent-hashing ×1

guava ×1

java ×1