Поведение Akka ConsistentHashingRouter не соответствует ожиданиям

Я использую ConsistentHashingRouter для распределения данных от актора к набору других акторов. Каждое сообщение содержит кортеж вроде этого (items: Set[Int], msg: String). Я написал класс case, который реализует ConsistentHashable с определением набора целых чисел в качестве последовательного хэш-ключа, подобного этому.

case class Message(items: Set[Int], msg: String) extends ConsistentHashable {
   def consistentHashKey = items
}

Теперь, когда я позволяю какому-то актеру-производителю отправлять много сообщений на маршрутизатор, маршрутизатор довольно неравномерно распределяет их по целевым узлам.

Я пробовал это с другим количеством целевых актеров. Во всех случаях актор с наибольшим количеством полученных сообщений получил вдвое больше сообщений, чем актор с наименьшим количеством полученных сообщений.

При использовании хеширования я ожидаю, что сообщения будут равномерно распределяться между целями, или я что-то здесь упускаю?


person Björn Jacobs    schedule 19.07.2013    source источник


Ответы (1)


ConsistHashKey возвращает объект, который будет использоваться для вычисления хэш-ключа (если вы не вернете строку или массив байтов, MurMurHash будет применен к сериализованным байтам этого объекта). Я не знаю, насколько это равномерно распределено, вы должны смотреть на значения «элементов», с которыми вы сталкиваетесь, - они могут быть весьма предвзятыми.

Кроме того, согласованное хеширование не распределяет полностью равномерно. См.: http://en.wikipedia.org/wiki/Consistent_hashing.

Короче говоря, интервал хеш-ключей свёртывается сам с собой, образуя кольцо, и это кольцо подразделяется случайными точками (хэшем узлов) на интервалы (бакеты). Эти ведра могут иметь неодинаковые размеры. Обычно чем больше узлов у вас будет, тем "равнее" они будут -- но это не гарантируется.

person Endre Varga    schedule 19.07.2013
comment
Спасибо за ваш ответ. Думаю, я просто буду использовать довольно большое количество целевых актеров, которые я случайным образом распределяю по разным машинам, тем самым еще больше выравнивая нагрузку. - person Björn Jacobs; 19.07.2013