Почему имя родителя используется как часть PersistenceId в Akka Sharding? - PullRequest
0 голосов
/ 01 февраля 2019

Я смотрел на шард пример и заметил, что имя родителя используется как часть PersistenceId?

PersistenceId = Context.Parent.Path.Name + "-" + Self.Path.Name;

Мои вопросы:

  1. Является ли имя родителя ShardId?

  2. Какова цель его использования?Он действует как составной ключ?

  3. Мой EntityId является guid, а мой MessageExtractor наследуется от класса HashCodeMessageExtractor.Так как это даст мне согласованный хеш для ShardId, основанный на PersistenceId / Guid, нужно ли мне все еще использовать имя родителей как часть PersistenceId?Кроме того, изменяется ли значение хеш-функции для одного и того же идентификатора в зависимости от различных значений конструктора (maxNumberOfShards)?

1 Ответ

0 голосов
/ 05 февраля 2019

Этот пример относится только к Akka.Cluster.Sharding.Несмотря на то, что управляемое расширение сегментирования кластера, сегментированные актеры (называемые объектами) все еще помещаются в стандартное дерево иерархии акторов akka.Это выглядит примерно так:

  • ShardRegion (name = typeName )
    • Shard (name = shardId )
      • Entity (name = entityId )

Пока ваш субъект является частью сущности в этом дереве, остальная часть создаетсяпо Akka.Cluster.Sharding плагин.

Другая часть - это способ локализации сущности в кластере.Для этого Akka.Cluster.Sharding использует составной ключ в виде ( shardId , entityId ).Всегда.

  1. В некоторых сценариях - например, при использовании HashCodeMessageExtractor, как вы упомянули - shardId генерируется / вычисляется исключительно на основе entityId.В этом случае вам не нужно никуда его включать, достаточно entityId.Недостатком использования HashCodeMessageExtractor является то, что вы должны указывать максимальное количество осколков: правило «мозг-мертвец» должно использовать 10 * максимальное количество узлов , которое вы ожидаете когда-либо иметь в своем кластере.
  2. В других сценариях могут потребоваться оба идентификатора для однозначной идентификации объекта.Это случай из примера, и по этой причине мы ищем shardId (который, глядя на представленную мной иерархию, кодируется в имени родителя), чтобы объединить в persistentId.

Вы можете найти более подробную информацию о создании идентификаторов осколков здесь .

...