这对奥尔良或SF是否有意义,如果需要,请

时间:2018-03-27 11:05:02

标签: azure-service-fabric service-fabric-stateful

我们正在努力将我们的软件带到Azure云,并将Orleans和Service Fabric(SF)视为潜在的框架。我们需要:

  1. 为每个引擎实例填充大量数据(例如,100MB到2GB)的分析引擎。
  2. 维持该状态,如果引擎实例空闲了20分钟或更长时间,我们想卸载它(即,不支付引擎实例资源)。
  3. 每个引擎实例将支持具有特定数据集的一个到多个最终用户。
  4. 每个引擎实例都可以高度交互,在实时附近生成大量的绘图数据。我们维持状态,因为我们不想为每次引擎交互填充引擎实例付出代价。
  5. 引擎实例操作可能需要几秒钟,几分钟甚至几十分钟。我们需要一些反馈。
  6. 用户可以每隔几秒访问一个引擎实例(例如,根据反馈引导引擎朝向结果)并且需要实时绘图数据。
  7. 每个用户都希望与特定的引擎实例进行通信。
  8. 当用户表示对运行模拟感兴趣(即站起来引擎实例)时,理想情况下我们希望他选择小/中/大计算资源来运行他的引擎实例(即,基于他试图的问题)解决他可能想要或多或少的计算/内存能力)。
  9. 我们正在考虑奥尔良和SF,但我们很难根据上述要求指定架构。我们考虑过:

    1. 尝试将SF分区或Orleans孤岛视为上述“引擎实例”。
    2. 通过复制利用Orleans和SF的容错概念。
    3. 利用本地(即分区或筒仓)存储来存储结果并保持状态(即长时间或直到闲置20分钟)。
    4. 我们不明白如何:

      1. 将孤岛或分区限制为单个引擎实例,以便我们可以控制引擎实例的资源。
      2. 将用户的引擎实例数据与其他用户引擎实例数据分开。
      3. 将用户的请求(例如,通过Web API)定向到特定的引擎实例。
      4. 这对奥尔良来说是否有意义,它对SF更有意义吗?关于如何实现上述内容的任何指示都会有所帮助。

1 个答案:

答案 0 :(得分:0)

当你说SF我假设你的意思是SF Actors对吗?

您可以按照自己的方式使用它们,但在这两种情况下都不适合您的问题,因为:

  1. 演员是单线程的,如果您计划与多个客户端共享同一个实例,则每个客户端必须等待前一个客户端开始处理任何内容。如果您需要监视正在运行的actor的状态,则必须让actor向外部订阅者发布更新。
  2. Actor状态是孤立的,所以你无法访问其他actor的状态,这样做的方法是提供一个返回它的方法,但是如果actor正在运行命令你必须等待完成,除非你创建一个单独的状态服务来保存已处理的数据。
  3. 您不能限制actor所需的资源,在服务结构中指定服务所需的资源,但是您不能为actor执行此操作,并且您不能限制他们使用的资源,当他们使用时达到极限,服务结构将尝试为您平衡资源,但没有什么能阻止进程消耗更多内存而不是请求。
  4. 两个actor服务都使用ask方法进行通信,因此它们会“阻止”调用者等待答案,它是异步的,但你仍然需要让调用者“等待”。 (阻止和等待是因为没有火灾的想法而忘记了使用Tell方法的Akka,它传递信息并忘记。)
  5. 根据您的一些要求,我认为容器是更好的方法。这是因为:

    1. 您可以限制每个容器的资源消耗
    2. 数据在容器内被隔离,其他人看不到
    3. 但是在容器上你必须自己管理复制和分区,所以在这种情况下我会推荐两全其美:

      • 创建SF服务以托管用户之间的共享数据集
      • SF Service + Actor仅存储用户模拟的结果。
      • 运行模拟并向演员发送更新的容器

      这只是一个例子,它将取决于您的要求,架构以及数据如何相互隔离。