```
import hashlib
class ConsistentHashing:
def __init__(self, servers):
self.servers = servers
self.ring = {}
self.sorted_keys = []
# Добавляем серверы на кольцо
for server in servers:
self.add_server(server)
def add_server(self, server):
# Добавляем сервер на кольцо и вычисляем хеш-значение
hash_value = self.hash(server)
self.ring[hash_value] = server
self.sorted_keys.append(hash_value)
self.sorted_keys.sort()
def remove_server(self, server):
# Удаляем сервер с кольца
hash_value = self.hash(server)
del self.ring[hash_value]
self.sorted_keys.remove(hash_value)
def get_server(self, key):
if not self.ring:
return None
# Вычисляем хеш-значение ключа
key_hash = self.hash(key)
# Находим ближайший сервер в кольце
for ring_key in self.sorted_keys:
if key_hash <= ring_key:
return self.ring[ring_key]
# Если ключ находится за пределами хеш-кольца, используем первый сервер
return self.ring[self.sorted_keys[0]]
def hash(self, key):
# Преобразуем ключ в хеш-значение с использованием SHA-1
return int(hashlib.sha1(key.encode()).hexdigest(), 16)
# Пример использования
servers = ["Server1", "Server2", "Server3"]
consistent_hashing = ConsistentHashing(servers)
# Получение сервера для ключа
key = "SomeKey"
selected_server = consistent_hashing.get_server(key)
print(f"Key '{key}' будет обработан сервером: {selected_server}")
````
Этот подход имеет следующие преимущества.
* При добавлении или удалении серверов перераспределяется минимальное количество ключей.
* Его легко горизонтально масштабировать, так как данные распределены более равномерно.
* Минимизация проблемы «горячих» ключей. Чрезмерный доступ к какому-то определенному сегменту может привести к перегрузке сервера.