我正在为 C# 桌面应用程序(不是服务器,而是桌面 GUI 应用程序)编写插件。
为了使我们的线程问题更简单,我正在研究是否可以在这些插件中使用 AKKA.NET。
插件主要是相互独立的。
因此,从架构 POV 来看,为每个插件提供自己的“私有(private)”ActorSystem 实例是很自然的。
这种方法的优点是插件最大限度地相互隔离。
另一方面,我读过一些关于 JVM 的 Akka 的文章,这些文章告诉我在应用程序中拥有过多的 ActorSystem 实例是一种反模式,因为 ActorSystem 是相当重量级的。
并发插件的实际数量是 10-20,也就是说,应用程序可能有最坏的 20 个 ActorSystem 实例在内部运行。同样,这是一个 GUI 桌面应用程序,它通常在终端服务器 session 中运行(即可能有许多这些 GUI 应用程序在终端服务器上运行)。
那么 - 这种简单化的方法(每个库一个 ActorSystem)是否站得住脚?或者最好设计一种使用全局 ActorSystem 的方法,它使用每个插件的顶级 actor 来隔离插件。
这种方法可能对性能更好,但我有点担心,因为插件彼此之间并没有那么孤立。
那么 - 这种“多系统”方法是一种好的架构方法,还是坚持“一个全局系统”设计更好?你在这里有什么体验?
最佳答案
这是我会采用的方法 - 让每个插件使用相同的 ActorSystem
创建自己的角色层次结构。每个插件都可以有自己的参与者和消息类型,没有重叠。如果你最终运行了多个 ActorSystem
,你仍然会有多个 actor 都使用相同的线程,因为默认情况下 ActorSystem
将 actor 调度到 TPL 和桌面应用程序的其他部分可能使用的同一个 .NET 线程池中。让一个 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/