내가 쓰고있는 일부 Java 코드에서 consistent hash 알고리즘을 사용하려고합니다. 구아바 해싱 라이브러리는 consistentHash(HashCode, int)
메소드를 가지고 있지만, the documentation은 다소 부족합니다. 나의 초기 희망은 간단 세션 친 화성을 위해 consistentHash()
을 사용하여 백엔드 서버 세트 전체에 걸쳐 효율적으로로드를 분산시킬 수 있다는 것이 었습니다.Guava의 Hashing # 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
내가 원하는 서버 이전 제거 후 동일한 서버에 매핑하는 식별자 ("someId")입니다 목록에. 그래서 위의 예제에서 제거 후 "server1", 버킷 1에 매핑 할 버킷 0을 "server3"에 매핑하고 버킷 2를 "server4"에 매핑하고 버킷 3을 "server5"에 매핑 할 것입니다.
버킷 제거 및 추가를 관리하기 위해 별도의 (목록보다 복잡한) 데이터 구조를 유지해야합니까? 아마도 나에게는 특정 버킷을 추가하고 제거한 후에 다시 매핑을 관리하는 좀 더 복잡한 해싱 API를 구상했을 것입니다.
참고 : 예제 코드는 작은 입력 및 양동이 세트를 사용하고 있습니다. 나는 100 개의 버킷에 걸쳐서 1000 초의 입력으로 이것을 시도했고 그 결과는 같습니다. buckets
을 99로 변경하고 버킷 99를 나머지 99 개 버킷에 분산 시키면 버킷 0-98에 매핑되는 입력이 동일하게 유지됩니다.
잘되는 버킷을 manange 할 필요가 ...하지만 당신은 구아바는 그 크기를 제외 목록에 대해 아무것도 모르는 것을 볼 수 있습니다 : 그것은 단지이을 보장 할 수 너? 그래서 아무것도 할 수 없습니다. – maaartinus
본인이 실제로 원하는 문서 링크라고 생각합니다. http://docs.guava-libraries.googlecode.com/git-history/release13/javadoc/com/google/common/hash/Hashing.html#consistentHash%28com. google.common.hash.HashCode, % 20int % 29 - 실제로 많이는 없지만 그 밖의 무엇을 말해야한다고 생각하십니까? –
@Kevin - 설명서는 아마도 O.K입니다. 추가/제거에 대한 요구 사항에 대한 몇 가지 단어가 끝에 있습니다. 나는 나의 해석이 틀렸고 내가 생각하지 못했던 양동이 조작을 관리 할 분명한 방법이 있었기 때문에 나는 내 질문을 게시했다. 위키 피 디아 항목으로 시작한 후 구아바 메서드를 사용하고 거기에서 참조 된 자바 구현을 읽었으므로이 두 기사가 설명하는 내용에 더 가깝게 볼 것을 기대하고있었습니다. (아래 답변에서 Chris의 설명과 비슷합니다.) – GamingBuck