设置多个分区,多个节点用于服务结构无状态服务



在当前使用无状态服务的情况下,为了防止连接丢失,所需的设计是在每个节点中使用运行的主实例(目前设置为使用5个节点),希望每个节点中运行的每个主实例都能帮助端点避免因连接丢失而出错。(在这种情况下,SignalR)

因此,设计将是:单个主分区和每个分区中的4个副本共有5个分区在5个节点中运行。

这本应该是一个简单的配置设置,但由于缺乏完整的手册和示例代码,因此很难实现。

到目前为止,我发现的是:

将服务实例计数设置为DefaultValue="-1"可以使服务在每个节点中运行,但您仍然需要将其与以下之一结合使用:

SingletonPartition或UniformInt64分区或命名分区

SingletonPartition是无状态服务中的默认值,DefaultValue"-1"与SingletonPartition的组合强制服务仅在一个节点上运行,这超出了使用多个节点的目的。

所以我试了一下:StatelessService InstanceCount="5"(包括副本在内应该是25吗?)UniformInt64分区分区计数="5"lowKey="0"highkey="5

一些链接说,lowkey和highkey应该匹配分区的数量,而另一个链接似乎包括了包括副本在内的所有实例。

我仍然没有成功地实现5个分区、5个节点和每个分区运行主服务。。

  • 对于无状态服务,singleton分区将实例计数设置为-1意味着"在每个节点上运行一个">
  • 对于无状态服务,您不使用副本,而是使用实例。副本用于复制状态

因此,使用singleton分区并将实例计数设置为-1。

我相信您想要的ApplicationManifest参数:

<Parameter Name="YourService_PartitionCount" DefaultValue="5" />
<Parameter Name="YourService_MinReplicaSetSize" DefaultValue="4" />
<Parameter Name="YourService_TargetReplicaSetSize" DefaultValue="4" />

然后在DefaultServices部分中,您需要

<Service Name="YourService" ServicePackageActivationMode="ExclusiveProcess">
<StatefulService ServiceTypeName="YourService" TargetReplicaSetSize="[YourService_TargetReplicaSetSize]" MinReplicaSetSize="[YourService_MinReplicaSetSize]">
<UniformInt64Partition PartitionCount="[YourService_PartitionCount]" LowKey="0" HighKey="4" />
</StatefulService>
</Service>

请确保应用程序参数文件夹中没有可能覆盖这些值的值。

LowKey="0" HighKey="4"背后的原因是,如果您正在使用服务远程处理,那么可以很容易地将它们作为目标。

如果我正确理解了这个问题,你需要确保每个节点都有一个单独的主副本在运行。

我只能想到一个解决方案(我不是,这在原始分区中是不可能的)-您可以创建服务的多个实例,并通过设置无效或必需的域,使用NodeType约束或放置策略,使用放置约束将每个服务限制到单个节点。

在这两种情况下都应该使用副本集。就服务结构中的无状态服务而言,复制副本只是服务的副本。另外,划分无状态服务是一种非常罕见的情况。

最新更新