Bazı java kodlarında consistent hash algoritmasını arıyorum. Guava Hashing kitaplığı consistentHash(HashCode, int)
yöntemine sahiptir, ancak the documentation eksiktir. İlk umudum, bir dizi arka uç sunucusunda yükü verimli bir şekilde dağıtmak için consistentHash()
'u basit oturum yakınlığı olarak kullanabilmemdi.Guava'nın Hashing # consistentHash'ı nasıl kullanmalıyım?
Bu yöntemin nasıl kullanılacağına dair gerçek bir dünya örneği var mı? Özellikle de hedef alandan bir kepçenin kaldırılmasını yönetmekle ilgileniyorum.
@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));
}
çıkışına İlanlar: Örneğin:
First time routed to: server4 Second time routed to: server5
İstediğim bir sunucu daha önce kaldırılmasından sonra aynı sunucuya eşlemek için bu tanımlayıcı ("SomeID") içindir listede. Yukarıdaki örnekte, kaldırma işleminden sonra, "server1" 'e eşlemek için "bucket", "server3"' e eşlemek için bucket 1, "server4" 'e eşlemek için bucket 2 ve "server5"' e eşlemek içinse bucket 3 'ün olmasını istiyorum.
Kova çıkarma ve ekleme işlemlerini yönetmek için ayrı bir (bir listeden daha karmaşık) veri yapısını korumalı mıyım? Sanırım özellikle benim için özel kovalar ekledikten ve çıkardıktan sonra yeniden işlemeyi yönetecek daha karmaşık bir Hashing API'sini tahmin ettim.
Not: Örnek kodun küçük bir giriş ve kova seti kullandığını biliyorum. Bunu 100 kova üzerinden 1000'lerce girdi ile denedim ve sonuç aynı. buckets
- 99'u değiştirdiğimde 0-98 no'lu kovalara eşlenen girişler aynı kalır ve kova 99, kalan 99 kovaya dağıtılır.
haklı için kova manange gerekiyor ... ama Guava boyutuna dışında listenizdeki hakkında hiçbir şey bilmiyor görebilirsiniz: Sadece bu garanti edemez sen misin Yani başka hiçbir şey yapamaz. – maaartinus
Bunun gerçekten istediğiniz doküman bağlantısı olduğunu düşünüyorum: http://docs.guava-libraries.googlecode.com/git-history/release13/javadoc/com/google/common/hash/Hashing.html#consistentHash%28com. google.common.hash.HashCode,% 20int% 29 - doğru olduğu halde orada pek bir şey yok, başka ne söyleyeceğinizi düşünüyorsunuz? –
@Kevin - Belgeleme muhtemelen O.K. Ekleme/kaldırma gereksiniminde bir çift daha fazla kelime varsa sonunda. Sorgumu yayınladım çünkü yorumumun yanlış olduğunu umuyordum ve düşünmediğim kova manipülasyonunu yönetmenin belli bir yolu vardı. Ben wikipedia girişi ve orada başvurulan java uygulama okumaya başladıktan sonra guava yöntemine var, bu yüzden bu iki makalenin ne anlattığına daha yakın bir şey görmeyi beklediğimi tahmin ediyorum (Chris'in aşağıda bir cevabın içinde ne çıkacağına dair açıklaması gibi). – GamingBuck