c# - AKKA.NET 问题 : Is it a good idea to have more than one ActorSystem in an application?

标签 c# akka.net

我正在为 C# 桌面应用程序(不是服务器,而是桌面 GUI 应用程序)编写插件。 为了使我们的线程问题更简单,我正在研究是否可以在这些插件中使用 AKKA.NET。 这些插件基本上彼此独立。 因此,从架构 POV 来看,很自然地为每个插件提供它自己的“私有(private)”ActorSystem 实例。 这种方法的优点是插件最大程度地相互隔离。 另一方面,我阅读了一些关于 JVM 的 Akka 的文章,这些文章告诉我在应用程序中有太多的 ActorSystem 实例是一种反模式,因为 ActorSystem 非常重量级。

并发插件的实际数量是 10-20,即应用程序最多可以在其中运行 20 个 ActorSystem 实例。同样,这是一个 GUI 桌面应用程序,通常在终端服务器 session 中运行(即可能有许多此类 GUI 应用程序在终端服务器上运行)。

那么 - 这种简单的方法(每个库一个 ActorSystem)是否可行?还是设计一种使用全局 ActorSystem 的方法更好,它使用每个插件的顶级 actor 来隔离插件。 这种方法在性能方面可能更好,但我有点担心它,因为插件之间并不那么孤立。

那么 - 这种“多系统”方法是一种好的架构方法,还是坚持“一个全局系统”设计更好?您在这里有什么经验?

最佳答案

So - is this simplicistic approach (one ActorSystem per library) tenable? Or is it better to devise an approach using a global ActorSystem, which uses per-plugin top-level actors to isolate the plugins. This approach is probably better for performance, but I am a bit concerned about it because the plugins are not as isolated from each other.

这是我要采用的方法 - 让每个插件使用相同的 ActorSystem 创建自己的 actors 层次结构。每个插件都可以有自己的参与者和消息类型,没有重叠。如果您最终运行多个 ActorSystem,您最终还是会有多个 actor 使用相同的线程,因为默认情况下 ActorSystem 将 actor 调度到同一个 .NET 线程上TPL 和桌面应用程序的其他部分可能使用的池。让一个 ActorSystem 管理所有这些可能是最简单的,因为这样您就有一个调度程序在同一组线程上编码执行(竞争较少。)

关于c# - AKKA.NET 问题 : Is it a good idea to have more than one ActorSystem in an application?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986261/

相关文章:

scala - AKKA 中失败消息的重试/重放

c# - 在 Windows 窗体应用程序中控制继承以获得一致的外观

c# - 始终将 DBNull SqlParameter 输入为 int 是否安全?

c# - 我应该如何等待 akka.net 中另一个 Actor 的消息回复?

akka.net - 无法让主管策略在 Akka.NET 中工作

f# - 为什么我的 Actor 没有在 akka.net 中使用 F# 异常停止

akka - MSMQ 与 AKKA 的优缺点?

c# - ? : Operator Vs. If语句性能

c# - MapReduce输出C#读取mongoDB

c# - .NET Core WCF Connected Services 中是否有同步方法?