Я реализую memcached клиентскую библиотеку. Я хочу, чтобы он поддерживал несколько серверов, и поэтому я хочу добавить систему балансировки нагрузки.
В принципе, вы можете сделать две операции на сервере:
- Храните
value
с учетом key
.
- Получите
value
, учитывая его key
.
Допустим, у меня есть N
серверов (от 0
до N - 1
), я хотел бы иметь функцию перераспределения , которая из заданного key
и номера сервера N
, даст мне index
в диапазоне [0, N[
.
unsigned int getServerIndex(const std::string& key, unsigned int serverCount);
Функция должна быть максимально быстрой и простой и должна соответствовать следующему ограничению:
getServerIndex(key, N) == getServerIndex(key, N); //aka. No random return.
Хотелось бы сделать это без , используя внешнюю библиотеку (например, OpenSSL
и ее функции хеширования). Какие у меня есть варианты?
Примечания:
Очевидно, базовая реализация:
unsigned int getServerIndex(const std::string& key, unsigned int serverCount)
{
return 0;
}
Не верный ответ, так как это не совсем хорошая перераспределение функция: D
Дополнительная информация:
Ключами обычно являются любые возможные строки в кодировке ANSI (в основном [a-zA-Z0-9_-]
). Размер может быть любым - от одной клавиши до любого размера.
A хороший алгоритм перераспределения - это алгоритм, для которого вероятность возврата a
равна (или не слишком далека) от вероятности возврата b
для двух разных ключей. Число серверов может измениться (хотя и редко), и если это так, допустимо, что изменяется и возвращаемый индекс для данного key
.