【问题标题】:Is there a way of assigning an int number to different instances of stateless services?有没有办法为不同的无状态服务实例分配一个 int 号?
【发布时间】:2019-05-19 20:10:49
【问题描述】:

我正在构建一个解决方案,我们将在其中将(服务结构)无状态服务部署到 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进行纯配置的解决方案?

【问题讨论】:

    标签: azure-service-fabric service-fabric-stateless


    【解决方案1】:

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

    最简单的方法是将Queue-Based Load Leveling patternCompeting Consumers pattern 结合使用。 它包括创建队列,将工作添加到队列中,每个实例获取一条消息来处理此工作,如果一个实例宕机且消息未处理,则返回队列另一个实例捡起它。

    这样您就不必担心正在运行的实例数量、故障等。

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

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

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

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

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

    值得一提的是,Service Fabric 有一个限制 doesn't allow services to have multiple replicas on same node,由于这个限制,您可能必须在设计服务时考虑到这一点,否则您将无法横向扩展一次达到极限。此外,同一个主题讨论了处理多个分布式项目的方法,这可能会给您一些想法。

    【讨论】:

    • 谢谢迭戈的回答!您介意在命名分区上添加文档吗,因为看起来我们可以命名分区并且至少使用这些名称来推断 1..N。我知道 Q / CC 模式 - 这是最初的计划,但由于一些额外的限制,我没有选择采用这些模式,而是采用这种设计。
    • 我很确定没有这方面的文档,你能找到的最好的是this。就像这个命令一样简单:Update-ServiceFabricService -Stateless -ServiceName "fabric:/app/service" -PartitionNamesToAdd "1","2","3"
    猜你喜欢
    • 2020-03-18
    • 2018-10-25
    • 2010-12-13
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2010-11-14
    • 2019-01-27
    相关资源
    最近更新 更多