【发布时间】:2019-07-11 09:41:13
【问题描述】:
我正在为 C# 桌面应用程序(不是服务器,而是桌面 GUI 应用程序)编写插件。 为了使我们的线程问题更简单,我正在研究是否可以在这些插件中使用 AKKA.NET。 这些插件主要是相互独立的。 因此,从架构 POV 来看,给每个插件它自己的“私有”ActorSystem 实例是很自然的。 这种方法的优点是插件最大限度地相互隔离。 另一方面,我阅读了一些关于 Akka for JVM 的文章,这些文章告诉我,在应用程序中拥有太多 ActorSystem 实例是一种反模式,因为 ActorSystem 非常重量级。
并发插件的实际数量是 10 到 20 个,即应用程序内部最多可以运行 20 个 ActorSystem 实例。同样,这是一个 GUI 桌面应用程序,通常在终端服务器会话中运行(即,可能有许多这些 GUI 应用程序在终端服务器上运行)。
那么 - 这种简单的方法(每个库一个 ActorSystem)是否可行?还是设计一种使用全局 ActorSystem 的方法更好,它使用每个插件的顶级参与者来隔离插件。 这种方法可能对性能更好,但我有点担心,因为插件之间没有那么隔离。
那么 - 这种“多系统”方法是一种好的架构方法,还是坚持“一个全局系统”设计更好?您在这里有什么经验?
【问题讨论】:
-
在我看来,您想太多问题了。我不明白 AKKA.NET 如何适合插件。
-
我们正在考虑的插件都有多个线程触发事件。我们在这里考虑 akka 的基本原因是,我们对简单线程处理的替代方案看起来像是我们自己实现了一个最小的 Actor 系统。 TL;DR:我们在这里使用 AKKA 的原因是为了简化我们的插件的线程问题,而不必自己编写一个 Actor 系统。
-
好吧,另一个问题,为什么插件有多个线程?与 tasks/async/await 一起使用会更好吗?
-
async/await 在某些地方使用,但对于我们的目标插件来说它不是那么有用,因为这些代码部分只是处理各种事件源,其中事件来自多个线程.