Благодарим Johanandren и связанную статью как основу для следующего ответа:
И router
, и sharding
распространяют работы. Sharding
требуется, если, помимо балансировки нагрузки, субъекты-получатели должны надежно управлять состоянием, которое напрямую связано с entity identifier
.
Напомним, что entity identifier
- это ключ, полученный из отправляемого сообщения, определяющий получателя сообщения в кластере.
Прежде всего, можете ли вы управлять состоянием, связанным с identifier
на разных узлах, с помощью маршрутизатора с согласованным хешированием? Маршрутизатор Consistent Hash
всегда будет отправлять сообщения с равным identifier
одному и тому же целевому субъекту. Ответ: нет, как описано ниже.
Метод на основе хэша перестает работать, когда узлы в кластере переходят в состояние Down или Up, потому что это изменяет связанного субъекта для некоторых идентификаторов. Если узел выходит из строя, сообщения, которые были с ним связаны, теперь отправляются другому субъекту в сети, но этот субъект не информируется о прежнем состоянии субъекта, который он теперь заменяет. Аналогичным образом, если появится новый узел, он позаботится о сообщениях (идентификаторах), которые ранее были связаны с другим субъектом, и ни новый узел, ни старый узел не будут проинформированы об этом.
С другой стороны, при сегментировании созданные акторы осведомлены о entity identifier
, которыми они управляют. Sharding
будет следить за тем, чтобы сущностью в кластере управлял ровно один субъект. И он воссоздает сегментированных субъектов на другом узле, если их родительский узел выйдет из строя. Таким образом, используя persistence
, они сохранят свое (постоянное) состояние между узлами при изменении количества узлов. Вам также не нужно беспокоиться о проблемах параллелизма, если актор воссоздается на другом узле благодаря Sharding. Более того, если встречается сообщение с новым entity identifier
, для которого актер еще не существует, создается новый субъект.
Маршрутизатор с постоянным хешированием может по-прежнему использоваться для кэширования, поскольку сообщения с одним и тем же ключом обычно отправляются одному и тому же субъекту. Для управления сущностью с отслеживанием состояния, существующей в кластере только один раз, требуется Sharding
.
Используйте маршрутизаторы для балансировки нагрузки, используйте Sharding
для распределенного управления объектами с отслеживанием состояния.
person
ig-dev
schedule
17.07.2019