5

我正在尝试将 AKKA 集成到使用框架 net46 上的 ASP.NET Core 构建的 IoT 应用程序中。我正在尝试找到最佳方法,并希望对这个问题发表任何评论,尽管它有点长。基于在 Java 和 AKKA.NET 中使用 AKKA 的经验的两条评论都将是相关的。

简而言之,我需要 AKKA.NET 从远程设备接收 IoT 消息并执行相当复杂的处理逻辑。

对于 IoT 通信,我们使用 Azure IoT-hub。IoT 消息由多线程控制台应用程序使用,遵循 Microsoft 此处的指南:

https://azure.microsoft.com/da-dk/documentation/articles/iot-hub-csharp-csharp-process-d2c/

同时,我们正在使用依赖注入和所有最新的最佳实践运行标准的 ASP.NET Core(框架 net46)应用程序。

我需要 AKKA.NET 来接管 IOT 消费者应用程序内部进行的部分处理,以及 ASP.NET 应用程序内部进行的部分处理。

我看到以下三个解决方案,我很好奇更有经验的 AKKA 开发人员会推荐这些解决方案。我自己的直觉是解决方案 1 是首选,请参阅下面的我自己的论点:

  • 解决方案 1:基于 AKKA.NET 创建一个新的 Console 应用程序,并使用 AKKA.Remoting 与 ASP.NET 应用程序和 IoT 消费者应用程序进行通信。这意味着所有参与者逻辑都将封装在一个隔离的控制台应用程序中。当然,AKKA.NET 也将在 ASP.NET 应用程序和 IoT 消费者应用程序中被引用和使用,但仅用于发送远程消息。

  • 解决方案 2:直接在 ASP.NET 应用程序中使用 AKKA.NET,并使用 AKKA.Remoting 与物联网消费者应用程序进行通信。这意味着 ASP.NET 应用程序将通过 Actor 逻辑与现有的基于控制器、等待/异步等的传统 ASP.NET 逻辑并排扩展。

  • 解决方案 3:与解决方案 2 相反,即在 IoT 消费者应用程序中直接使用 AKKA.NET,并使用 AKKA.Remoting 与 ASP.NET 应用程序进行通信。

可能会有更多变化,例如在 ASP.NET 和 IoT 消费者应用程序中集成 AKKA.NET 逻辑,但我不喜欢让参与者在不同的应用程序中运行的想法,至少在我所处的早期阶段不喜欢试图建立一个干净的新的基于actor的实现。

以下是我对解决方案 1 的论点:

  • 有人告诉我,如果配置正确,AKKA.NET 能够以最佳方式利用所有内核,而无需上下文切换。为了能够分析和优化配置,我更喜欢为 AKKA.NET 应用程序逻辑提供最简单的运行时环境。让 AKKA.NET 在 Web 容器内或已经使用线程和锁的控制台应用程序内运行,与只运行我的 AKKA.NET 演员的原始控制台应用程序相比,这似乎并不简单。

  • 由于 C# 中基于 actor 的逻辑与普通的过程/函数式编程有根本的不同(而且稍微复杂一些),我喜欢将其封装在一个单独的项目中,使用现有的应用程序项目作为依赖项。通过这种方式,我希望以后代码会更容易理解。

  • 我计划运行预定的演员来接管基于 cron 的处理。在我的 ASP.NET 应用程序中执行此操作似乎很脆弱,因为该应用程序可能会被基础结构带入睡眠状态。

  • 如果在某些时候我想扩展基于actor的处理,使用仅运行actor的纯控制台应用程序进行扩展似乎比扩展ASP.NET应用程序节点或扩展我的物联网消费者应用程序(其中如果不引入细微的错误,甚至可能是不可能的)。

4

1 回答 1

5

我的偏好始终是选项 1 之类的东西 - 让参与者系统在 ASP.NET 内部运行非常精简,因此 Web 应用程序仍然主要“只是”一个 Web 应用程序。让您的真实演员在Topshelf服务中运行,该服务通过 Akka.Remote 从 ASP.NET 应用程序接收输入。

我已在生产中大规模使用此设置,并在移动分析和营销自动化 SaaS 应用程序方面取得了巨大成功:http ://www.aaronstannard.com/markedup-akkadotnet/

我喜欢这个的原因是什么?我可以相互独立地部署对任一服务的更改,并且可以定制我的 Topshelf 服务来处理诸如 Chron 作业之类的事情,而无需将其耦合到 ASP.NET 部署。这是松散耦合事物的好方法。

于 2016-08-30T16:47:17.437 回答