AKKA.NET 在 ASP.NET 中还是在控制台应用程序中?
AKKA.NET in ASP.NET or in console app?
我正在尝试将 AKKA 集成到使用框架 net46 上的 ASP.NET Core 构建的 IoT 应用程序中。我正在尝试找到最好的方法,并希望对这个问题有任何评论,尽管它有点长。 Java 和 AKKA.NET 中基于 AKKA 经验的评论都是相关的。
简而言之,我需要 AKKA.NET 从远程设备接收物联网消息并执行相当复杂的处理逻辑。
对于 IoT 通信,我们使用 Azure IoT 中心。 IoT 消息由多线程控制台应用程序按照 Microsoft 此处的指南使用:
https://azure.microsoft.com/da-dk/documentation/articles/iot-hub-csharp-csharp-process-d2c/
同时,我们运行正在使用依赖注入和所有最新的最佳实践来构建标准 ASP.NET 核心(框架 net46)应用程序。
我需要 AKKA.NET 接管 IOT 消费者应用程序内部进行的部分处理以及 ASP.NET 应用程序内部进行的部分处理。
我看到了以下三种解决方案,我很好奇更有经验的 AKKA 开发人员会推荐哪一种。我自己的直觉是解决方案 1 是首选,请参阅下面的我自己的论点:
方案一:基于AKKA.NET创建一个新的Console应用,使用AKKA.Remoting与ASP.NET应用和物联网消费者应用进行通信。这意味着所有参与者逻辑都将封装在一个独立的控制台应用程序中。当然 AKKA.NET 也会在 ASP.NET 应用程序和 IoT 消费者应用程序中被引用和使用,但仅用于发送远程消息。
解决方案 2:直接在 ASP.NET 应用程序中使用 AKKA.NET 并使用 AKKA.Remoting 与 Iot 消费者应用程序通信。这意味着 ASP.NET 应用程序将通过 Actor 逻辑与基于控制器、await/asynch 等的现有传统 ASP.NET 逻辑并排扩展。
方案三:与方案二相反,即直接在物联网消费者应用中使用AKKA.NET,使用AKKA.Remoting与ASP.NET通信应用。
可能会有更多变化,例如在 ASP.NET 和 IoT 消费者应用程序中集成 AKKA.NET 逻辑,但我不喜欢让参与者 运行ning不同的应用程序,至少在我试图建立一个全新的基于参与者的实现的早期阶段。
以下是我对解决方案 1 的论点:
有人告诉我,如果配置正确,AKKA.NET 能够以最好的方式利用所有核心,而无需上下文切换。为了能够分析和优化配置,我更愿意为 AKKA.NET 应用程序逻辑提供最简单的 运行 时间环境。将 AKKA.NET 运行ning 置于 Web 容器或已经使用线程和锁的控制台应用程序中,与原始控制台应用程序 运行ning 相比似乎并不简单比我的 AKKA.NET 演员。
由于 C# 中基于 actor 的逻辑与普通的 procedural/functional 编程有根本的不同(并且稍微复杂一些),我喜欢将它封装在一个单独的项目中,使用现有的应用程序项目作为依赖项.这样我希望以后的代码更容易理解。
我计划 运行 预定 actor 接管基于 cron 的处理。在我的 ASP.NET 应用程序中执行此操作似乎很脆弱,因为应用程序可能会被基础架构休眠。
如果在某个时候我想扩展基于 actor 的处理,使用只有 运行s actor 的纯控制台应用程序扩展似乎比扩展更容易和更透明ASP.NET 应用程序节点或扩展我的 IoT 消费者应用程序(如果不引入细微错误,这甚至可能是不可能的)。
我的偏好始终是选项 1 之类的东西 - 将 actor 系统 运行 保持在内部 ASP.NET 非常薄,因此 Web 应用程序仍然主要是 "just" Web 应用程序。让您的真实演员 运行 在 Topshelf 服务中,该服务通过 Akka.Remote 从 ASP.NET 应用程序接收输入。
我已经在生产中大规模使用此设置,并在移动分析和营销自动化 SaaS 应用程序中取得了巨大成功:http://www.aaronstannard.com/markedup-akkadotnet/
我为什么喜欢这个?我可以将更改彼此独立地部署到任一服务,并且我可以定制我的 Topshelf 服务来处理诸如 Chron 作业之类的事情,而无需将其耦合到 ASP.NET 部署。这是松散耦合事物的好方法。
我正在尝试将 AKKA 集成到使用框架 net46 上的 ASP.NET Core 构建的 IoT 应用程序中。我正在尝试找到最好的方法,并希望对这个问题有任何评论,尽管它有点长。 Java 和 AKKA.NET 中基于 AKKA 经验的评论都是相关的。
简而言之,我需要 AKKA.NET 从远程设备接收物联网消息并执行相当复杂的处理逻辑。
对于 IoT 通信,我们使用 Azure IoT 中心。 IoT 消息由多线程控制台应用程序按照 Microsoft 此处的指南使用:
https://azure.microsoft.com/da-dk/documentation/articles/iot-hub-csharp-csharp-process-d2c/
同时,我们运行正在使用依赖注入和所有最新的最佳实践来构建标准 ASP.NET 核心(框架 net46)应用程序。
我需要 AKKA.NET 接管 IOT 消费者应用程序内部进行的部分处理以及 ASP.NET 应用程序内部进行的部分处理。
我看到了以下三种解决方案,我很好奇更有经验的 AKKA 开发人员会推荐哪一种。我自己的直觉是解决方案 1 是首选,请参阅下面的我自己的论点:
方案一:基于AKKA.NET创建一个新的Console应用,使用AKKA.Remoting与ASP.NET应用和物联网消费者应用进行通信。这意味着所有参与者逻辑都将封装在一个独立的控制台应用程序中。当然 AKKA.NET 也会在 ASP.NET 应用程序和 IoT 消费者应用程序中被引用和使用,但仅用于发送远程消息。
解决方案 2:直接在 ASP.NET 应用程序中使用 AKKA.NET 并使用 AKKA.Remoting 与 Iot 消费者应用程序通信。这意味着 ASP.NET 应用程序将通过 Actor 逻辑与基于控制器、await/asynch 等的现有传统 ASP.NET 逻辑并排扩展。
方案三:与方案二相反,即直接在物联网消费者应用中使用AKKA.NET,使用AKKA.Remoting与ASP.NET通信应用。
可能会有更多变化,例如在 ASP.NET 和 IoT 消费者应用程序中集成 AKKA.NET 逻辑,但我不喜欢让参与者 运行ning不同的应用程序,至少在我试图建立一个全新的基于参与者的实现的早期阶段。
以下是我对解决方案 1 的论点:
有人告诉我,如果配置正确,AKKA.NET 能够以最好的方式利用所有核心,而无需上下文切换。为了能够分析和优化配置,我更愿意为 AKKA.NET 应用程序逻辑提供最简单的 运行 时间环境。将 AKKA.NET 运行ning 置于 Web 容器或已经使用线程和锁的控制台应用程序中,与原始控制台应用程序 运行ning 相比似乎并不简单比我的 AKKA.NET 演员。
由于 C# 中基于 actor 的逻辑与普通的 procedural/functional 编程有根本的不同(并且稍微复杂一些),我喜欢将它封装在一个单独的项目中,使用现有的应用程序项目作为依赖项.这样我希望以后的代码更容易理解。
我计划 运行 预定 actor 接管基于 cron 的处理。在我的 ASP.NET 应用程序中执行此操作似乎很脆弱,因为应用程序可能会被基础架构休眠。
如果在某个时候我想扩展基于 actor 的处理,使用只有 运行s actor 的纯控制台应用程序扩展似乎比扩展更容易和更透明ASP.NET 应用程序节点或扩展我的 IoT 消费者应用程序(如果不引入细微错误,这甚至可能是不可能的)。
我的偏好始终是选项 1 之类的东西 - 将 actor 系统 运行 保持在内部 ASP.NET 非常薄,因此 Web 应用程序仍然主要是 "just" Web 应用程序。让您的真实演员 运行 在 Topshelf 服务中,该服务通过 Akka.Remote 从 ASP.NET 应用程序接收输入。
我已经在生产中大规模使用此设置,并在移动分析和营销自动化 SaaS 应用程序中取得了巨大成功:http://www.aaronstannard.com/markedup-akkadotnet/
我为什么喜欢这个?我可以将更改彼此独立地部署到任一服务,并且我可以定制我的 Topshelf 服务来处理诸如 Chron 作业之类的事情,而无需将其耦合到 ASP.NET 部署。这是松散耦合事物的好方法。