我已按照此处的步骤在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,因此我无法使用它。我正在通过结构外部的外部应用程序联系此有状态服务。
答案 0 :(得分:11)
您在服务资源管理器中看到的PartitionId
是您的服务请求最终所在的分区的唯一ID。 PartitionKey
与PartitionId
不同,它是进入分区哈希的密钥,并且基于该密钥最终的请求的分区是从。< / 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
表示使用的是Int64Range
。 LowKey
和HighKey
给出了已接受的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 分区:
分区范围大于分区数是不可或缺的,允许我们稍后扩展而不必更改分区键。如果我们在上面的示例中将分区数量(向外扩展)加倍到 4 分区,则映射将变为:
但我们使用的分区键不会更改,这意味着服务的客户端不会受到影响。命名方案也有类似的推理。另一种可能的方案是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)
这取决于您选择的分区类型。
找到它:
在SF资源管理器中,导航到有状态服务,然后选择一个分区。在“Essentials”选项卡上,它显示分区类型和密钥。
使用内置反向代理的缺点正是您所处的情况。调用者需要详细的服务分区知识。这就是为什么我选择使用自定义无状态服务作为代理,并根据上下文自己路由调用。 (例如,租户/用户id的哈希可能会导致int64分区键)