.net core 协调本地和网络集群的最佳.Net参与者/流程框架

.net core 协调本地和网络集群的最佳.Net参与者/流程框架,.net-core,azure-service-fabric,actor,akka.net,.net Core,Azure Service Fabric,Actor,Akka.net,我们有一个过程,包括加载一大块数据,对其应用一些转换,然后输出已更改的内容。我们目前运行一个web应用程序,其中这些大数据块的多个实例在同一个CLR实例中进行处理,这会导致垃圾收集混乱和OOM错误 我们已经证明,在一个较长的运行过程中托管一些跟踪状态可以完美地解决我们的主要问题。我们现在面临的问题是,作为一个有状态的系统,我们需要托管它并管理与系统其他部分的协调(还有更改跟踪实例) 目前,我正在评估Service Fabric和Akka中的参与者,还有许多其他选择,但在我继续之前,我希望大家考虑

我们有一个过程,包括加载一大块数据,对其应用一些转换,然后输出已更改的内容。我们目前运行一个web应用程序,其中这些大数据块的多个实例在同一个CLR实例中进行处理,这会导致垃圾收集混乱和OOM错误

我们已经证明,在一个较长的运行过程中托管一些跟踪状态可以完美地解决我们的主要问题。我们现在面临的问题是,作为一个有状态的系统,我们需要托管它并管理与系统其他部分的协调(还有更改跟踪实例)

目前,我正在评估Service Fabric和Akka中的参与者,还有许多其他选择,但在我继续之前,我希望大家考虑一下这种方法:

  • 我们的系统中有一个自然的分区点(权限),这意味着我们可以轻松地划分顶级数据集。每个分区将由一个顶级实例表示,该实例需要在其自己的本地集群中组织几个子参与者,但我们希望单个主机能够运行多个集群

  • 理想情况下,每个参与者的权威集群将集中在一台机器上,以受益于本地通信和一些共享本地资源的使用,从而绕过消息大小的限制

  • 参与者本身应该是同一个盒子上的独立进程(Akka似乎在同一个CLR实例中运行本地参与者,这会使OOM上的一切崩溃-是真的吗?),这将使我能够启动一个进程,通过它运行转换,发出结果并将其拆除,而不会影响其他实例的内存/GC。我理解硬件资源争用仍然是一个问题,但我预计这将是更多的内存比CPU密集型,所以期待一个RAM沉重的盒子

  • 因为数据模型非常大,并且消息可以包含模型片段或对模型片段的更改,所以很难处理不变性。我们不希望将每个消息负载克隆到内部状态并将其应用于模型,因此理想情况下,使用的任何参与者解决方案都将使我们能够使用原始消息负载。这可能会导致恢复参与者状态时出现问题,因为它希望在唤醒时保存和重播这些状态,但由于我们在内部进行状态跟踪,因此我们可以在睡眠时存储此操作的结果输出

  • 我们需要一个协调器,可以加速权限集群的实例。在虚拟机/机器的数量和托管在它们上面的权限集群的数量方面需要有一些弹性,并且需要一些东西来处理这些虚拟机/机器的创建和销毁

  • 我们有很多.NET代码,我们所有的模型、转换和验证都在其中定义,需要大量重用。支持.Net所需的任何解决方案

我的问题是:

虽然这感觉很适合演员,但我有所保留,不知道是否还有更合适的?我尝试过的一切都回到了某种托管进程

如果参与者是正确的选择,考虑到上述问题,哪一个技术堆栈将使我最接近我想要实现的目标?

IMO(从JVM Akka的角度来看,这就是为什么我将
Akka
标记更改为
Akka.net
;我对CLR方面的知识不多),两者之间似乎不匹配

我们不希望将每个消息负载克隆到内部状态并将其应用于模型,因此理想情况下,使用的任何参与者解决方案都将使我们能够使用原始消息负载

参与者本身应该是同一个盒子上的独立进程(Akka似乎在同一个CLR实例中运行本地参与者,这会使OOM上的所有内容崩溃——这是真的吗?)

假设您谈论的是同一个OS进程,那么这些进程几乎肯定是互不兼容的:交换消息强烈建议序列化,因此与复制操作同构。在操作系统进程之间使用共享内存是可能的,但您可能必须选择哪个更重要

类似地,“传统”(Erlang/Akka)风格的参与者模型中的父/子关系也为您提供了参与者的本地集群(因为它们运行在同一个OS进程中,因此Akka优化了在您跨越OS进程边界之前不复制消息),而“虚拟参与者”在ServiceFabric或Orleans(或者,我认为是Cloudstate或Lagom)中发现的实现基本上假设了分布

从语义上讲,虚拟参与者模型隐含地假设参与者是永恒的(尽管他们永恒的本质可能并不总是化身)。对于您的用例,情况似乎不一定如此


我认为,假设您试图同时处理多个大数据块时遇到OOM问题,那么一组Akka.Net实例与sharded
Authority
actors最合适,这些actors会产生寿命较短的子actors。您必须自己实现实例的放大/缩小逻辑。

我没有使用过Akka.net,所以我根本无法谈论这一点,但我很乐意谈论您在服务结构上下文中所谈论的内容

  • 服务结构对于运行多个集群的概念没有问题。用它的术语来说,整个系统将被称为应用程序,并且在部署到SF集群时会有一个版本。如果要创建多个实例,只需选择要调用的已部署应用程序实例,它就可以为您进行资源调配

  • SF的理念是,如果你认为你能更好地平衡vario,你可以利用它