5

我有一个使用实体框架与数据库交互的典型 Web 应用程序。这是应用程序的分解。

  1. Demo.Core [包含日志记录(nlog 的东西)、助手类、系统范围的常量等]
  2. Demo.Entities [仅包含 Entity 框架实体或 edmx 文件 - 无上下文]
  3. Demo.Business [包含数据管理器、EF 上下文、使用 NRules 的业务规则、验证等]
  4. Demo.Web [包含作为前端的 MVC 应用程序]

现在我想在这个应用程序中使用 Akka.NET。我创建了一个封装 Akka System actor 的 Engine 类并创建了一个日志 actor (Demo.Core)。我认为引擎是一个类,它具有可以在系统范围内使用的发送功能,并且该功能决定哪个演员最适合处理消息。

但是,我无法决定如何根据 akka 管理数据上下文和实体类。

  1. 我应该有单独的 Actor 来检索每种类型的实体吗?还是一个 Actor 来检索所有实体?
  2. 我应该为不同角色设置多个具有不同上下文的参与者,例如 DBReaderActor 和 DBWriterActor 还是具有数据库上下文的单个参与者?
  3. 是否可以让引擎具有如上所述的单个发送功能,或者每个类都应该调用适当的参与者本身?
  4. 一个系统的参与者可以在多个程序集中吗?像 Demo.Core & Demo.Business?
  5. 如果我运行 Demo.Web 的两个实例,一个在 IIS 上,一个在 WebDev 上,它们会有 2 个独立的参与者系统还是一个单一的参与者系统(它们都使用相同的代码库)?

    我是 Akka.NET 的新手,所以请不要在回答时假设事情

4

1 回答 1

3

因此,大多数这些问题的答案往往是“视情况而定”,这在很大程度上取决于您的架构和应用程序要求,但我会在这里尝试对其进行分解。

1)这取决于您检索实体的频率。由于参与者一次处理一个消息,如果每个实体有很多请求,那么如果消息队列太长,您最终可能会收到很长的请求来检索数据。由于 Akka.Net 是用于构建并发应用程序的工具,通常将工作分解为最小的工作单元,因此您可以轻松地分配工作。

2)这取决于您的应用程序是否受到读取或写入的约束,以及您对读取和写入的顺序是否有强烈要求。消息是串行处理的,所以如果你有大量的写入通过一个负责读取和写入的参与者进入数据库,那么读取可能需要一些时间来处理。类似地,如果您有硬性限制,即在给定的写入之前必须进行某个读取,那么您将希望读取和写入存在于同一个队列中。

3) Actor 由 URI 寻址,因此可以通过众所周知的 URI 和在 ActorSystem 实例上使用 ActorSelection 来检索它们。通常不需要创建自定义函数来发送给演员。而是创建通用函数来根据 URI 部分检索参与者 URI。

4) 是的,actor 可以存在于多个程序集中,您只需要确保它们继承自其中一种actor 类型,通常是 ReceiveActor 或 UntypedActor。

5) 他们有 2 个独立的演员系统,但可以通过 Akka.Remote 或 Akka.Cluster 加入他们。Actor 系统通常是长时间运行的进程,因此经常留在专用于运行 Actor 系统的服务器和运行 Web 服务器的前端节点上运行,只需加入系统并将消息推送到其中或从中提取数据。

于 2015-08-20T13:38:45.187 回答