您在服务资源管理器中看到的PartitionId 是您的服务请求最终所在的分区的唯一 ID。 PartitionKey 与 PartitionId 不同,它是进入分区哈希的键,并基于该键计算请求最终所在的分区。
在 Application 项目的 ApplicationManifest.xml 中,新创建的服务的分区键如下所示:
<Service Name="MyService">
<StatefulService ServiceTypeName="MyServiceType"
TargetReplicaSetSize="[MyService_TargetReplicaSetSize]"
MinReplicaSetSize="[MyService_MinReplicaSetSize]">
<UniformInt64Partition PartitionCount="[MyService_PartitionCount]"
LowKey="-9223372036854775808"
HighKey="9223372036854775807" />
</StatefulService>
</Service>
这里的UniformInt64Partition 表示使用的是Int64Range。 LowKey 和 HighKey 给出了可接受的 PartitionKey 的范围。 PartitionCount 给出了运行此服务的分区数。在统一范围内,分区从低键统一映射到高键。您可能应该将范围更改为对您的特定服务更有意义的范围。例如:
<Parameters>
...
<Parameter Name="MyService_PartitionCount" DefaultValue="2" />
...
</Parameters>
...
<Service Name="MyService">
<StatefulService ServiceTypeName="MyServiceType"
TargetReplicaSetSize="[MyService_TargetReplicaSetSize]"
MinReplicaSetSize="[MyService_MinReplicaSetSize]">
<UniformInt64Partition PartitionCount="[MyService_PartitionCount]"
LowKey="0"
HighKey="11" />
</StatefulService>
</Service>
这将为我们提供 2 个映射的分区:
拥有大于分区数量的分区范围对于允许我们稍后进行横向扩展而无需更改分区键是不可或缺的。如果我们在上面的示例中将分区数量(横向扩展)加倍为 4 个分区,那么映射将变为:
- 0 - 2:分区 0
- 3 - 5:分区 1
- 6 - 8:分区 2
- 9 - 11:分区 3
我们使用的分区键不会改变,这意味着服务的客户端不受影响。类似的推理也适用于命名方案。另一种可能的方案是 Singleton,通常用于无状态服务。
可以在此处找到 Microsoft 关于服务分区的文档:
https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-concepts-partitioning
回到您的问题,您的分区键可以是您在清单中指定的 LowKey 和 HighKey 范围内的任何整数(如果您使用 UniformInt64Partition)。您收到FABRIC_E_INVALID_PARTITION_KEY 错误表明提供的密钥不是有效的整数。如果它超出了可接受的范围,您可能会收到 FABRIC_E_KEY_NOT_FOUND 作为错误。