C# 如何创建.NET 4 MVC 3作业/队列系统?

C# 如何创建.NET 4 MVC 3作业/队列系统?,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,问题 曾几何时,我编写了一个内部应用程序,从内部数据库读取数据,然后获取数据并将其发布到web服务。应用程序非常简单,使用单线程和同步HTTP请求 这个应用程序的范围现在已经改变了,它正在尝试推送远超过其预期推送的数据。如果它从我们的内部数据库中读取1000条记录,它将把它们全部封装到一个HTTP POST中,从而给承载接收数据的web服务的服务器带来沉重的CPU负担。当web服务在处理POST中的一条记录时遇到错误时,也会出现问题。XML响应没有指定哪个特定记录失败,因此我对请求成功的可见性有

问题

曾几何时,我编写了一个内部应用程序,从内部数据库读取数据,然后获取数据并将其发布到web服务。应用程序非常简单,使用单线程和同步HTTP请求

这个应用程序的范围现在已经改变了,它正在尝试推送远超过其预期推送的数据。如果它从我们的内部数据库中读取1000条记录,它将把它们全部封装到一个HTTP POST中,从而给承载接收数据的web服务的服务器带来沉重的CPU负担。当web服务在处理POST中的一条记录时遇到错误时,也会出现问题。XML响应没有指定哪个特定记录失败,因此我对请求成功的可见性有限

我想如何修复它

我将重新设计我的应用程序,使其更加可靠,更加考虑托管web服务的服务器。具体来说,我希望有一个工人,每15分钟从内部数据库收集记录,并将其转换为作业。这些作业将被序列化并存储在队列中(可能是数据库表)。然后我想让我的应用程序使用几个工作线程来处理队列(这是个好主意吗?)。线程将从队列中弹出一个作业,并通过向web服务上游发送异步HTTP POST来处理它。根据请求的状态,作业将导致成功、失败、超时或中止。作业将在数据库中更新,进程将被记录,然后工作线程将移动到下一个作业,如果作业队列为空,则变为空闲

我不是一个架构师,所以我不知道实现这样的东西的最佳方法。以下是我对设计的一些具体问题

  • 我读过一些关于.NETMVC环境中多线程的负面报道。我是否应该避免使用多线程,因为我没有做任何真正需要CPU的事情
  • Quartz.NET看起来可以做很多很酷的事情。我应该考虑使用Quartz.NET来实现类似的功能吗
  • 我的设计合理吗?如果没有,如何改进
  • 您将如何设计一个系统来满足新应用程序的目标

我知道这是一个广泛的问题,但我希望我已经清楚地概述了我的目标。提前谢谢。

您考虑过MSMQ吗?您将消息推送到队列上,每N分钟读取一条消息,并在发生任何电源故障时内置冗余等。如果您在负载平衡环境中,您可以发布到共享队列

针对这些问题:

我读过一些关于.NET MVC环境中多线程的负面报道。我是否应该避免使用多线程,因为我没有做任何真正占用CPU的事情?
建议您不要在ASP.NET中使用线程池,这样MVC也会使用同样的线程池。它可以限制您的应用程序

Quartz.NET看起来可以做很多很酷的事情。我应该考虑使用Quartz.NET来实现类似的功能吗?
与cronjobs类似,它代替了调度而不是队列

我的设计合理吗?如果没有,如何改进?
序列化部分听起来不错,成功、失败、超时或中止部分听起来不错。如前所述,MSMQ将为您节省大量的写入冗余和消息队列系统

您将如何设计系统以满足新应用程序的目标?
一种服务,它每隔一段时间从消息队列中读取消息,并执行您希望它执行的操作。您还可以将其作为MSMQ的替代方案。MSMQ没有很好的内置工具来管理它,所以您需要在它的基础上进行构建。但是,它在框架中内置了一个完整的.NET程序集来使用它


当您使用.NET 4时,您还可以使用并行任务来代替系统HTTP发送部分的手动线程管理。

@Closers:太本地化了?我看不出MVC(或任何其他WEB GUI)的用武之地。这似乎是WCF的一个问题,可能是使用MSMQ。@HenkHolterman IMHO,太本地化了,因为这个问题更多地与询问者系统的设计有关,而与任何特定的编程问题/障碍关系不大。编辑以删除MVC部分:)设计的各个方面也可能是特定的编程问题。