.Net 框架,用于管理不同计算机上的后台运行进程



我有一个驻留在服务器上的asp.mvc应用程序。从这个应用程序中,我想启动一个运行时间有点长并且将是资源密集型操作的进程。

所以我想做的是我想有一些像 3 这样的用户代理,它将在 3 台机器上存在,并且这个用户代理将仅使用各自机器的资源。

与Hadoop一样,我们有主节点和集群,其中任务在单个集群上运行,并且有1个主节点跟踪所有这些集群。

在 Azure 中,我们有运行任务的虚拟机,如果需要,Azure 可以通过启动新实例来自动水平缩放,以加快任务速度。

所以我想创建这样的基础设施,我可以从 mvc 应用程序将我的任务提交给 3 个用户代理,我的应用程序将跟踪这个代理,例如哪个代理是空闲的,哪个被占用,哪个代理没有像这样工作。

我希望从每个用户代理接收进度并显示在我的 MVC 应用程序上。

.net 中是否有任何框架可供我管理此后台运行操作(跟踪、启动、停止等)或应该采用什么方法?

更新:我不想为这个长时间运行的操作放置大量服务器,而且我也想跟踪这个长时间运行的过程,就像他们正在做什么,错误在哪里等。

以下是我正在考虑的方法,我不知道哪种方法更有意义:

1) 在本地以 2-3 台计算机的代理形式安装 Windows 服务,以利用 resp 资源并打开与此代理的 TCP/IP 连接,除非并且直到长时间运行的过程完成。

2)使用hangfire在IIS线程之外运行这个长时间运行的进程,但我想这会给服务器带来负载。

我想知道上述方法可能存在的问题,以及是否有比这更好的方法。

Hangfire 确实是处理后台任务的绝佳解决方案,我们在项目中广泛使用了它。

我们已经在单独的IIS服务器上设置了我们的MVC应用程序,这也是一个hangfire客户端,只是将需要由hangfire服务器执行的作业排队。然后我们有两个hangfire服务器实例,它们是Windows Service应用程序。因此,实际上 MVC 应用服务器上没有负载来处理后台作业,因为它由单独的 hangfire 服务器处理。

hangfire 非常有用的功能之一是它的开箱即用仪表板,它允许您监视和控制后台作业处理的任何方面,包括统计信息、后台作业历史记录等。

在应用程序和 hangfire 服务器中配置挂起火

public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>");
app.UseHangfireDashboard();
app.UseHangfireServer();
}

请注意,您使用相同的连接字符串。仅当您希望将实例用作 hangfire 服务器时才使用app.UseHangfireServer(),因此在您的情况下,您希望从应用程序服务器配置中省略此行并仅在 hangfire 服务器中使用。 还要在实例中使用app.UseHangfireDashboard()它将为您的 hangfire 仪表板提供服务,这可能是您的 MVC 应用程序。

当时我们已经使用Windows Service完成了它,但如果现在必须这样做,我想使用 Azure 辅助角色甚至更好的现在 Azure Web 作业来托管我的 hangfire 服务器,并轻松管理自动缩放等内容。

有关更多详细信息,请参阅hangfire概述和文档。

将消息从 MVC 应用推送到 MSMQ,并让 Windows 服务侦听(或循环)进入队列的新消息。

在 MVC 应用中,为每个排队的消息创建一个 ID,以便在作业取得进展时将 Windows 服务中的 API 调用返回到 mvc 应用?

看看 Hangfire,它可以管理后台任务并跨虚拟机工作而不会发生冲突。我们已经使用它替换了Windows服务,它运行良好。

https://www.hangfire.io

尝试 http://easynetq.com/

EasyNetQ是一个简单易用的、固执己见的、用于RabbitMQ的.NET API。

EasyNetQ 是在 RabbitMQ.Client 库之上提供服务的组件集合。它们执行序列化、错误处理、线程编组、连接管理等操作。

使用 EasyNetQ 发布

var message = new MyMessage { Text = "Hello Rabbit" };
bus.Publish(message);

要订阅消息,我们需要给 EasyNetQ 一个操作,以便在消息到达时执行。我们通过传递订阅委托来做到这一点:

bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));

现在,每次发布 MyMessage 实例时,EasyNetQ 都会调用我们的委托并将消息的 Text 属性打印到控制台。

EasyNetQ的性能与RabbitMQ代理的性能直接相关。这可能因网络和服务器性能而异。在具有本地 RabbitMQ 实例的开发人员计算机上的测试中,实现了每秒约 5000 条 2K 消息的持续夜间性能。所有 EasyNetQ 端点的内存使用在夜间运行中保持稳定

最新更新