Sea*_*man 2 azure-service-fabric
对于有状态服务,副本是否可以通过其分区ID(GUID值)确定分区键(字符串或数字/数字范围)?看一下.NET API,它只能从a获取副本ID ServicePartitionKey
,而不是相反.
不,你无法直接从分区ID(guid)获取它.根据您使用的分区类型(Singleton,Int64Range或Named)以及如何设置它可能可以派生它,但是无法直接从服务中进行.
这是有道理的,考虑一种情况,你有一个带有low key = 0
和high key = 9
和2分区的Int64分区方案的服务.从0到4的任何分区键最终都会在分区号上结束.分区号为1和键5-9.2.但是,由于任何使用0到4的密钥的呼叫都会在该服务的同一个实例上结束,因此密钥实际上是每次呼叫,而不是每个服务,因此从服务的角度来看,它将如何知道哪个密钥它的分区对应,除非这是客户端对服务的调用,并且你可以说"对于这个分区XXX的调用,密钥是123".目前没有这样的信息被烘焙到结构传输通信中,分区在客户端解析并且从未传递给服务.
你可以做的是弄清楚分区id的范围.对于Singleton分区方案,你在"分区"上,在那里讨论的不多.对于Named和Int64,您可以使用FabricClient.QueryManager
以下命令枚举分区:
var fabricClient = new FabricClient();
var partitionList = await fabricClient.QueryManager.GetPartitionListAsync(serviceName);
foreach (var partition in partitionList)
{
// Partition Guid
var partitionId = partition.PartitionInformation.Id;
// Int 64 Range
var int64PartitionInfo = partition.PartitionInformation as Int64RangePartitionInformation;
var lowKey = int64PartitionInfo?.LowKey;
var highKey = int64PartitionInfo?.HighKey;
// Named Range
var namedPartitionInfo = partition.PartitionInformation as NamedPartitionInformation;
var name = namedPartitionInfo.Name;
}
Run Code Online (Sandbox Code Playgroud)
对于命名范围,如果实际上确实为您提供了分区键,因为它是一对一映射,但对于Int64范围,您将只获得该分区的整数范围.
上面的代码也是你可能不希望每次想要查找分区键时都要运行的代码,因为FabricClient.QueryManager
它相对较慢.
您拥有的另一个选项是,如果您能够知道每个服务调用中的分区键很重要,只需将其作为消息参数或消息头添加到您对客户端的调用中(类似于此Passing用户和在Service Fabric传输中调用Reliable Services时的审计信息)
归档时间: |
|
查看次数: |
1488 次 |
最近记录: |