Azure service fabric 根据分区ID确定分区键(名称或编号范围)

Azure service fabric 根据分区ID确定分区键(名称或编号范围),azure-service-fabric,Azure Service Fabric,对于有状态服务,副本是否可以通过其分区ID(GUID值)确定分区键(字符串或数字/数字范围)?查看.NET API,只能从ServicePartitionKey获取副本ID,而不能从其他方式获取副本ID。不,无法直接从分区ID(guid)获取副本ID。根据您使用的分区类型(Singleton、Int64Range或Named)以及设置方式,可以派生它,但无法直接从服务中执行 P>这是有意义的,考虑这样一个场景,你有一个带有It64分区方案的服务,它有“代码>低调=0 < /代码>和高键=9 <

对于有状态服务,副本是否可以通过其分区ID(GUID值)确定分区键(字符串或数字/数字范围)?查看.NET API,只能从
ServicePartitionKey
获取副本ID,而不能从其他方式获取副本ID。

不,无法直接从分区ID(guid)获取副本ID。根据您使用的分区类型(Singleton、Int64Range或Named)以及设置方式,可以派生它,但无法直接从服务中执行

<> P>这是有意义的,考虑这样一个场景,你有一个带有It64分区方案的服务,它有“代码>低调=0 < /代码>和<代码>高键=9 < /COD>和2个分区。从0到4的任何分区键都将在1号分区上结束,键5到9在2号分区上结束。但是,由于任何键从0到4的调用都会在该服务的同一个实例上结束,因此该键实际上是每个调用,而不是每个服务,因此从服务的角度来看,它如何知道它的分区对应于哪个键,除非这是客户机对该服务的调用中烘焙的东西,您可以说“对于分区XXX的调用,密钥是123”。目前,结构传输通信中没有此类信息,分区在客户端解析,并且从未传递给服务

您可以做的是找出分区id所在的范围。对于单体分区方案,您在“分区”上,这里没有更多要讨论的内容。对于命名和Int64,您可以使用
FabricClient.QueryManager来枚举分区:

var fabricClient=new fabricClient();
var partitionList=wait fabricClient.QueryManager.GetPartitionListAsync(serviceName);
foreach(分区列表中的var分区)
{
//分区Guid
var partitionId=partition.PartitionInformation.Id;
//Int 64范围
var int64PartitionInfo=partition.PartitionInformation作为Int64RangePartitionInformation;
var lowKey=int64PartitionInfo?.lowKey;
var highKey=int64PartitionInfo?.highKey;
//命名范围
var namedPartitionInfo=partition.PartitionInformation作为NamedPartitionInformation;
var name=namedPartitionInfo.name;
}
对于命名范围,if实际上会给您分区键,因为它是一对一的映射,但是对于Int64范围,您将只获得该分区的int的范围

由于
FabricClient.QueryManager
的速度相对较慢,您可能不希望每次查找分区键时都运行上述代码


如果知道每个服务调用中的分区键对您来说很重要,那么您还有另一个选择,就是在对客户端的调用中将其作为消息参数或消息头添加(与此类似)

yoape的答案非常好,应该从客户端需要从服务外部了解分区信息的场景中考虑。但它表明从服务本身内部是不可能的

问题是,它请求从服务本身内部获取这些信息,并且可以像下面这样获取分区信息

假设您有这样的状态服务:

class WorkerService : StatefulService {}
switch (this.Partition.PartitionInfo.Kind)
{
    case ServicePartitionKind.Int64Range:
        var rangePartition = this.Partition.PartitionInfo as Int64RangePartitionInformation;
        var lowKey = rangePartition.LowKey;
        var highKey = rangePartition.HighKey;
        break;
    case ServicePartitionKind.Named:
        var namedPartition = this.Partition.PartitionInfo as NamedPartitionInformation;
        var name = namedPartition.Name;
        break;
    case ServicePartitionKind.Singleton:
        var singleton = this.Partition.PartitionInfo as SingletonPartitionInformation;
        var PartitionId = singleton.Id;
        break; 
    default:
        var PartitionId2 = this.Partition.PartitionInfo.Id;
        break;
}
在服务中,您可以获得如下分区信息:

class WorkerService : StatefulService {}
switch (this.Partition.PartitionInfo.Kind)
{
    case ServicePartitionKind.Int64Range:
        var rangePartition = this.Partition.PartitionInfo as Int64RangePartitionInformation;
        var lowKey = rangePartition.LowKey;
        var highKey = rangePartition.HighKey;
        break;
    case ServicePartitionKind.Named:
        var namedPartition = this.Partition.PartitionInfo as NamedPartitionInformation;
        var name = namedPartition.Name;
        break;
    case ServicePartitionKind.Singleton:
        var singleton = this.Partition.PartitionInfo as SingletonPartitionInformation;
        var PartitionId = singleton.Id;
        break; 
    default:
        var PartitionId2 = this.Partition.PartitionInfo.Id;
        break;
}

Singleton与默认值相同,两者都使用分区id。

谢谢。使用Name或HighKey正是我所需要的。这无助于获取分区键如果您使用RangePartition,则键是由low key和high key定义的范围,没有唯一键,如果您想要一个唯一值来标识您选择的范围,则没有唯一键应该使用分区ID。所有分区都有一个ID。