在Azure Service Fabric中查找有状态服务的分区键

ada*_*039 7 azure azure-service-fabric

我已按照此处的步骤在Azure中的资源组上创建反向代理.https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reverseproxy

我相信反向代理正在工作,因为我曾经收到404错误,现在我收到400错误请求.

错误代码为FABRIC_E_INVALID_PARTITION_KEY

这是有道理的,因为在文档中,它说对于不使用单例分区的服务,您必须指定分区键和分区类型,如下所示:

http://mycluster.eastus.cloudapp.azure.com:19008/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
Run Code Online (Sandbox Code Playgroud)

我的问题是,我如何获得该分区键?文档明确声明它不是资源管理器中生成的GUID,因此我无法使用它.我正在从结构外部的外部应用程序联系此有状态服务.

yoa*_*ape 12

PartitionId您的浏览器服务看到的是,您的服务请求在结束了分区的唯一的ID.的PartitionKey是不一样的PartitionId,这是相当的进入进分区散列以及基于所述密钥以该密钥的请求结束了对由下式计算的分区.

ApplicationManifest.xmlApplication项目中,新创建的服务的分区键如下所示:

<Service Name="MyService">
  <StatefulService ServiceTypeName="MyServiceType" 
                   TargetReplicaSetSize="[MyService_TargetReplicaSetSize]"
                   MinReplicaSetSize="[MyService_MinReplicaSetSize]">
    <UniformInt64Partition PartitionCount="[MyService_PartitionCount]"
                           LowKey="-9223372036854775808"
                           HighKey="9223372036854775807" />
  </StatefulService>
</Service>
Run Code Online (Sandbox Code Playgroud)

这里UniformInt64Partition表示它Int64Range是使用的.在LowKeyHighKey给接受PartitionKeys的范围.该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>
Run Code Online (Sandbox Code Playgroud)

这将为我们提供2个映射的分区:

  • 0 - 5:分区0
  • 6 - 11:分区1

分区范围大于分区数是不可或缺的,允许我们稍后扩展而不必更改分区键.如果我们在上面的示例中将分区数量(向外扩展)加倍到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出现错误.

  • 有没有办法在运行时获取此信息? - 例如,我们可以进行的调用将返回给我们分区元数据,然后我们可以检查以确定分区0的范围是0 - 2,分区1的范围是3 - 5,等等.? - 我不愿意硬编码这样的东西. (2认同)
  • 是的,您可以使用[FabricClient.QueryManager](https://docs.microsoft.com/en-us/dotnet/api/system.fabric.fabricclient.querymanager?view=servicefabric-5.5.216#System_Fabric_FabricClient_QueryManager)查询特定服务的分区.根据分区方案(int64,named或singleton),您将获得ServicePartitionInformation的结果,该结果将为您提供每个分区的span(低键 - 高键)或值.此[gist](https://gist.github.com/FredrikGoransson/846935fcfef0c1d19980402875c1b511)显示了如何从SF服务中检索它. (2认同)

小智 4

这取决于您选择的分区类型。

  • 对于命名分区,您只需提供名称即可。
  • 对于 Int64RangePartitions,您提供一个位于目标分区的 Higkey 和 Lowkey 值之间的 Int64。(包括的)

要找到它:

在 SF 资源管理器中,导航到有状态服务,然后选择一个分区。在“Essentials”选项卡上,它显示分区类型和密钥。

使用内置反向代理的缺点正是您所处的这种情况。调用者需要详细了解服务分区。这就是为什么我选择使用自定义无状态服务作为代理,并自己根据上下文路由调用。(例如,租户/用户 ID 的哈希值可能会生成 int64 分区键)