【问题标题】:Azure service fabric actor for long running tasks用于长时间运行任务的 Azure 服务结构参与者
【发布时间】:2017-05-07 22:36:55
【问题描述】:

我对 Azure Service Fabric 非常陌生。根据我的研究,我非常热衷于将它用于特定的优化问题场景。但是,我在 MSDN 上找不到任何详细信息来支持我的发现。

我的要求是我有一个获取输入并转储到数据库的 Web API。此输入用于运行优化算法,该算法通常需要大约 3-5 分钟。用户提交的请求可能有多个,最终需要处理。

我目前认为为每个优化输入生成一个新的 ASF 可靠参与者是一个不错的选择。但是,我不清楚 ASF 如何为此类长时间运行且非即时的任务发挥作用。

此外,我怀疑集群内的资源利用率将如何。我的最终目标是能够在需要时并行提交至少预定义数量的优化算法actors无状态服务。

非常感谢您就我的顾虑提出的技术建议。对于这种情况,我应该考虑 actors 还是 stateless

【问题讨论】:

    标签: .net azure azure-service-fabric


    【解决方案1】:

    我认为这里最重要的是在后台进行计算。在优化算法运行时,不应让服务/Actor 调用者等待。

    要完成此操作,您需要接受一个命令,将其保存在某个地方(队列会很好),将一个令牌返回给调用者。令牌可用于查询状态/进度。

    Actor 中执行此操作需要:

    • 使用StateManager 来保存一个队列,该队列用于保存作业
    • 注册一个计时器来处理工作。
    • 可选调用另一个(额外的)Actor来报告进度

    无状态服务中执行此操作需要:

    • 一个外部队列(它是一个外部依赖项,会影响可用性)
    • 可选外部进度存储

    有状态服务(额外选择)中执行此操作需要:

    • 使用StateManager 持有ReliableQueue
    • 定期检查此队列是否有来自RunAsync 的工作。
    • 可选定期将进度存储在StateManager

    我怀疑最适合这种情况的服务类型是有状态服务。 Here's 一个有状态服务的例子,队列和处理工作。

    【讨论】:

    • 感谢您的回复。假设我使用了一个有状态的服务,它将一个命令保存在一个可靠的队列中。然后我会定期检查队列以检查待处理的命令。将第一个出列并生成一个无状态或参与者(不确定什么是最好的)并启动算法。您能否建议我通常如何监控我的算法服务是否已运行完成。那应该是算法服务还是主状态服务的任务。我仍然不清楚如何实现它。
    【解决方案2】:

    我认为有状态和无状态的组合将是您的方案的一个很好的解决方案。使用有状态对请求进行排队,并使用无状态处理(算法)请求。如果需要,SF 集群将根据负载为集群中的其他节点创建无状态服务的新实例。有状态服务将成为您存储请求(通过可靠队列)和进度(可靠字典)的持久存储。有状态服务在集群中维护一个主副本和两个辅助副本。

    【讨论】:

    • 感谢您的回复。你能告诉我为什么在这种情况下你推荐 SF 无注视服务而不是演员吗?另外“假设”我有一个 5 个节点的集群,并且我产生了 5 个算法,它是 100% CPU 密集型的,那么在 SF 的上下文中产生另一个实例的行为会如何?
    猜你喜欢
    • 2021-03-03
    • 2017-07-09
    • 2018-04-11
    • 2020-09-08
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2016-06-12
    相关资源
    最近更新 更多