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

时间:2017-01-09 22:50:05

标签: 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

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

2 个答案:

答案 0 :(得分:11)

您在服务资源管理器中看到的PartitionId是您的服务请求最终所在的分区的唯一ID。 PartitionKeyPartitionId不同,它是进入分区哈希的密钥,并且基于该密钥最终的请求的分区是从。< / p>

在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表示使用的是Int64RangeLowKeyHighKey给出了已接受的PartitionKeys的范围。 PartitionCount给出了运行此服务的分区数。在均匀范围内,分区从低键到高键均匀映射。您应该将范围更改为对您的特定服务更有意义的范围。 E.g:

  <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 分区:

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

分区范围大于分区数是不可或缺的,允许我们稍后扩展而不必更改分区键。如果我们在上面的示例中将分区数量(向外扩展)加倍到 4 分区,则映射将变为:

  • 0 - 2:分区0
  • 3 - 5:分区1
  • 6 - 8:Partition 2
  • 9 - 11:Partition 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视为错误。

答案 1 :(得分:4)

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

  • 对于命名分区,您只需提供名称。
  • 对于Int64RangePartitions,您提供介于其间的Int64 目标分区的Higkey和Lowkey值。 (含)

找到它:

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

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