在典型的MVC应用程序中使用Akka.NET。如何?

时间:2015-08-17 11:51:51

标签: c# model-view-controller architecture akka.net

我有一个典型的Web应用程序,使用Entity框架与数据库进行交互。这是应用程序的细分。

  1. Demo.Core [包含日志记录(nlog内容),帮助程序类,系统 宽常数等]
  2. Demo.Entities [包含实体框架实体或edmx文件 只有 - 没有背景]
  3. Demo.Business [包含数据管理器,EF上下文,业务 规则使用NRules,验证和东西]
  4. Demo.Web [包含作为前端的MVC应用]
  5. 现在我想在这个应用程序中使用Akka.NET。我创建了一个Engine类,它封装了Akka System actor并创建了一个日志记录actor(Demo.Core)。我认为引擎是一个具有send函数的类,可以在系统范围内使用,而且函数决定哪个actor最适合处理消息。

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

    1. 我应该有单独的Actor来检索每种类型的实体吗?要么 一个用于检索所有实体的Actor?
    2. 我是否应该为不同的上下文设置多个actor 角色,例如DBReaderActor& DBWriterActor或单个actor 具有数据库的上下文?
    3. 是否可以使用具有单个发送功能的引擎 上面提到的或每个班级应该调用适当的演员 本身?
    4. 系统的演员可以在多个组件中吗?像Demo.Core& Demo.Business?
    5. 如果我在IIS上运行两个Demo.Web实例,在WebDev上运行一个实例 他们会有2个独立的演员系统或单个演员系统吗? (他们都使用相同的代码库)?

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

1 个答案:

答案 0 :(得分:3)

因此,大多数问题的答案往往是“它取决于”,它在很大程度上取决于您的架构和应用程序要求,但我会尝试在此处分解。

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

2)这取决于您的应用程序是否受读取或写入限制,以及您是否对读取和写入顺序有强烈要求。消息是按顺序处理的,因此如果有大量写入通过负责读取和写入的actor进入数据库,则读取可能需要一些时间才能处理。类似地,如果您有一些硬限制,某个读取必须在给定的写入之前发生,那么您将希望读取和写入存在于同一队列中。

3)参与者通过URI进行寻址,因此可以通过众所周知的URI和ActorSystem实例上的ActorSelection来检索它们。通常不需要创建自定义函数来发送给actor。而是创建公共函数以基于URI部分检索actor URI。

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

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