Почему имя родителя используется как часть PersistenceId в Akka Sharding?

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

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

Мои вопросы:

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

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

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


person user3587180    schedule 01.02.2019    source источник


Ответы (1)


Этот пример относится к 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 (который, глядя на представленную мной иерархию, закодирован в имени родителя), чтобы составить его в persistId.

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

person Bartosz Sypytkowski    schedule 05.02.2019