...

суббота, 7 апреля 2018 г.

Разбор задачек от Одноклассников на JPoint 2018

Очевидная проблема в коде Вадима в том, что track.hashCode() может возвращать как положительные, так и отрицательные значения.

Вадим же человек аккуратный ( вы посмотрите сколько assertов! ), значит, комментарий к методу он тоже написал аккуратно, а там указано, что метод вернет число в интервале от 0 до partitions исключительно.

Очевидным способом исправить проблему будет немного другая концовка метода, например, такая:

        return Math.abs( track.hashCode() ) % partitions;


Казалось бы — ура и в продакшен! Но есть одна менее очевидная проблема — по спецификации hashCode() вполне себе может вернуть и Integer.MIN_VALUE, а попытка взять от такого числа Math.abs ни к чему хорошему не приведет.

Ох, говорила мама, следи за скобками, сынок! Правильно будет как-то так:

        return Math.abs( track.hashCode() % partitions );


Другая, более серьезная проблема Вадима гораздо менее очевидна. Способ, который он выбрал для того, чтобы распределять данные по серверам не консистентен — при изменении количества партиций ( например, при добавлении серверов ) все треки перераспределяются по кластеру практически полностью. Если треков мало — проблем не много, а если кластер большой и треков там на сотни терабайт — их все надо переместить между серверами. А Вадим уже залил терабайты треков на сотню — другую серверов…

Эх, Вадим, Вадим! Использовал бы ты какой либо из вариантов консистентных хешей, не болела бы у тебя сейчас голова.

Let's block ads! (Why?)

Комментариев нет:

Отправить комментарий