Этот пример относится только к Akka.Cluster.Sharding.Несмотря на то, что управляемое расширение сегментирования кластера, сегментированные актеры (называемые объектами) все еще помещаются в стандартное дерево иерархии акторов akka.Это выглядит примерно так:
- ShardRegion (name = typeName )
- Shard (name = shardId )
- Entity (name = entityId )
Пока ваш субъект является частью сущности в этом дереве, остальная часть создаетсяпо Akka.Cluster.Sharding плагин.
Другая часть - это способ локализации сущности в кластере.Для этого Akka.Cluster.Sharding использует составной ключ в виде ( shardId , entityId ).Всегда.
- В некоторых сценариях - например, при использовании
HashCodeMessageExtractor
, как вы упомянули - shardId генерируется / вычисляется исключительно на основе entityId.В этом случае вам не нужно никуда его включать, достаточно entityId.Недостатком использования HashCodeMessageExtractor
является то, что вы должны указывать максимальное количество осколков: правило «мозг-мертвец» должно использовать 10 * максимальное количество узлов , которое вы ожидаете когда-либо иметь в своем кластере. - В других сценариях могут потребоваться оба идентификатора для однозначной идентификации объекта.Это случай из примера, и по этой причине мы ищем shardId (который, глядя на представленную мной иерархию, кодируется в имени родителя), чтобы объединить в persistentId.
Вы можете найти более подробную информацию о создании идентификаторов осколков здесь .