.Net框架,用于管理单独机器上的后台运行流程

时间:2018-01-24 12:34:53

标签: c# asp.net-mvc windows-services daemon hangfire

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

所以我想要做的是我希望有一些像3这样的用户代理,它将在3台机器上运行,而这个用户代理只会使用各自机器的资源。

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

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

所以我想创建这样的基础设施,我可以将我的任务从mvc应用程序提交给3个用户代理,我的应用程序将跟踪这些代理,比如哪个代理是免费的,哪个是被占用的,哪个不能正常工作此

我希望从每个用户代理获得进度并在我的MVC应用程序中显示。

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

更新:我不想为这个长时间运行的操作加载大量服务器,而且我想跟踪这个长时间运行的进程,就像他们正在做的那样,在哪里出现错误等

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

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

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

我想知道上述方法可能出现的问题,以及是否有更好的方法。

4 个答案:

答案 0 :(得分:6)

Hangfire对于处理后台任务来说确实是一个很好的解决方案,我们已经在我们的项目中广泛使用它。

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

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 worker role或者现在更好Azure Web Jobs来托管我的hangfire服务器,并轻松管理自动缩放等内容。

请参阅hangfire overviewdocumentation了解详情。

答案 1 :(得分:0)

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

在您的MVC应用中,每个排队的消息都会创建一个ID,因此当您在工作中取得进展时,请从您的Windows服务中恢复到API调用吗?

答案 2 :(得分:0)

看看Hangfire,这可以管理后台任务,并且可以在没有冲突的情况下跨虚拟机工作。我们用这个替换了windows服务,效果很好。

https://www.hangfire.io

答案 3 :(得分:0)

尝试http://easynetq.com/

EasyNetQ是一个简单易用的,自以为是的RabbitMQ .NET API。

EasyNetQ是一组在RabbitMQ.Client库之上提供服务的组件。这些操作包括序列化,错误处理,线程编组,连接管理等。

使用EasyNetQ发布

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

要订阅消息,我们需要为EasyNetQ提供一个消息到达时执行的操作。我们通过传递subscribe委托来做到这一点:

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

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

  

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