Вадим же человек аккуратный ( вы посмотрите сколько assertов! ), значит, комментарий к методу он тоже написал аккуратно, а там указано, что метод вернет число в интервале от 0 до partitions исключительно.
Очевидным способом исправить проблему будет немного другая концовка метода, например, такая:
return Math.abs( track.hashCode() ) % partitions;
Казалось бы — ура и в продакшен! Но есть одна менее очевидная проблема — по спецификации hashCode() вполне себе может вернуть и Integer.MIN_VALUE, а попытка взять от такого числа Math.abs ни к чему хорошему не приведет.
Ох, говорила мама, следи за скобками, сынок! Правильно будет как-то так:
return Math.abs( track.hashCode() % partitions );
Другая, более серьезная проблема Вадима гораздо менее очевидна. Способ, который он выбрал для того, чтобы распределять данные по серверам не консистентен — при изменении количества партиций ( например, при добавлении серверов ) все треки перераспределяются по кластеру практически полностью. Если треков мало — проблем не много, а если кластер большой и треков там на сотни терабайт — их все надо переместить между серверами. А Вадим уже залил терабайты треков на сотню — другую серверов…
Эх, Вадим, Вадим! Использовал бы ты какой либо из вариантов консистентных хешей, не болела бы у тебя сейчас голова.
Комментариев нет:
Отправить комментарий