Я изучаю алгоритм согласованный хеш-алгоритм в некотором 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
Я хочу, чтобы этот идентификатор ( "someId" ) отображался на тот же сервер после удаления сервера ранее в списке. Таким образом, в примере выше, после удаления, я думаю, я бы хотел, чтобы ведро 0 отображалось на "server1", bucket 1 для сопоставления с "server3", ведро 2 для сопоставления с "server4" и ведро 3 для сопоставления с "server5".
Я должен поддерживать отдельную (более сложную, чем список) структуру данных для управления удалением и добавлением ковша? Я предполагаю, что я предположил, возможно, более сложный Hashing API, который будет управлять переназначением после добавления и удаления определенных ковшей для меня.
Примечание. Я знаю, что пример кода использует небольшой набор ввода и набора ковша. Я пробовал это с 1000 входом по 100 ведрам, и результат тот же. Входы, которые сопоставляются с ведрами 0-98, остаются неизменными при изменении buckets
до 99, а ведро 99 распределяется по остальным 99 ковшим.