有没有一种方法可以将int数分配给无状态服务的不同实例



我正在构建一个解决方案,其中我们将有一个(服务结构(无状态服务部署到K个实例。这个服务的任务是处理一些工作负载(如查询(,我希望尽可能均匀地在它们之间分配工作负载,我希望这是一个动态的解决方案,这意味着如果我决定明天从K个实例转到N个实例,我希望工作负载分配的方式是现在自动将负载分配到N个实例。我没有为此服务指定任何分区。

举个例子-

假设我想查询一个数据库来检索一个特定的记录块。我有5个节点。我希望这5个节点检索记录集的不同1/5。这可以通过一些查询逻辑来实现,如(row_id%N==K(,其中N是实例总数,K是唯一的instance_number

我本来希望利用FabricRuntime.GetNodeContext().NodeId,但这会返回一个不太有用的guid。

我正在寻找一种方法,可以确定地说它是N中的实例编号m(我需要能够通过1..N命名实例(,这样我就可以根据它设置查询逻辑。其中一个要求是,如果该实例发生故障/崩溃等……当SF自动重新启动它时,它仍然应该标识为相同的实例id,这样2个或多个节点就不会查询相同的结果集。

解决这个问题最好的办法是什么?是否存在通过ApplicationManifest.xmlServiceManifest.xml进行纯配置的解决方案?

您的问题没有现成的解决方案,但可以通过多种不同的方式轻松完成。

最简单的方法是将基于队列的负载均衡模式与竞争消费者模式结合使用。它包括创建一个队列,将工作添加到队列中,每个实例都会得到一条消息来处理此工作,如果一个实例出现故障而消息未得到处理,则返回队列,由另一个实例来处理。

这样你就不必担心运行实例的数量、故障等等

关于放入队列中的工作,这将取决于您是要进行批处理还是逐项处理。

逐项,您为正在处理的每个项目在队列中放入一条消息,这是一种处理工作的简单方法,每个实例一次处理一条消息或并行处理多条消息。

在批处理中,您可以放置一条消息,表示要处理的项目列表,以及每个实例处理该批处理直到完成,这有点棘手,因为您可能必须处理正在完成的工作的进度,如果失败,下次可以从停止的位置继续。

队列方法是一种反应式设计,在这种情况下,工作需要放在队列中以触发处理。如果你想要一种主动的方法,并且需要跟踪哪些工作交给了谁,你可能会更好地使用其他方法,比如租赁机制,每个实例都会获得属于该实例的租约,直到它释放租约,当您使用分区数据或其他可以轻松拆分负载的机制时,这将更合适。

关于ID的问题,一个选项是您所在复制副本的InstanceId,您可以通过StatelessService.Context.InstanceId访问,它不是顺序ID,但它是一个随机数。这比使用节点id要好,因为您可能在同一节点上有多个分区,并且id会相互冲突。如果您决定使用命名分区,您可以在分区名称中使用order,这样每个分区都会有一个顺序名称。

值得一提的是,服务结构有一个限制,不允许服务在同一节点上有多个副本,由于这个限制,您可能必须在设计服务时考虑到这一点,否则一旦达到限制,您将无法扩展。此外,同一个线程还讨论了处理多个分布式项目的方法,这些方法可能会给您带来一些想法。

最新更新