2011-10-20 35 views
4

的问题如何创建.NET 4 MVC 3作业/队列系统?

曾几何时,我写了一个内部应用程序从内部数据库中读取数据,然后拿这些数据,并将其张贴到Web服务。该应用程序非常简单,使用单线程和同步HTTP请求。

这个应用程序的范围已经改变,它正试图推动更多的数据比这是有史以来旨在推动。如果它从我们的内部数据库中读取1,000条记录,则它会将它们全部包装到一个HTTP POST中,从而给承载正在接收数据的Web服务的服务器带来沉重的CPU负担。 Web服务在处理POST中的一条记录时遇到错误时也会出现问题。 XML响应没有指定哪个特定的记录失败,所以我对我的请求成功的可见性有限。

我如何想修复它

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

我不是设计师,所以我不知道要实现这样的事情的最好方法。以下是我在设计上的一些具体问题。

  • 我在.NET MVC环境了解多线程一些负面的东西。我是否应该避免使用多线程,因为我没有做任何真正的CPU密集型工作?
  • Quartz.NET看起来可以做很多很酷的事情。我应该看看使用Quartz.NET来做这样的事情吗?
  • 是我设计的是否合理?如果不是,那怎么能改进呢?
  • 你会如何设计一个系统,以满足新的应用程序的目标是什么?

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

+0

@Closers:太本地化了? –

+0

我没有看到MVC(或任何其他WEB GUI)进来。这似乎是一个WCF的问题,也许使用MSMQ。 –

+0

@HenkHolterman恕我直言,太局部化了,因为这个问题更多地与提问者系统的设计有关,而与任何特定的编程问题/障碍相关的问题更少。 – Yuck

回答

3

你有没有考虑MSMQ这个?您推送队列中的消息,每N分钟读取一个消息,并在发生任何电源故障时建立冗余。如果您处于负载平衡环境中,则可以发布到共享队列。

在回答这些问题:

我读过有关在.NET MVC环境的多线程一些负面的东西。我是否应该避免使用多线程,因为我没有做任何真正的CPU密集型工作?
建议您不要在ASP.NET中使用ThreadPools,所以同样适用于MVC。它可以抑制你的应用程序。

Quartz.NET看起来可以做很多很酷的事情。我应该看看使用Quartz.NET来做这样的事情吗?
这是一个替代调度而不是队列,类似于cronjobs。

我的设计合理吗?如果不是,那怎么能改进呢?
序列化部分听起来不错,成功,失败,超时或中止部分听起来不错。如前所述,MSMQ将为您节省编写冗余和消息队列系统的麻烦。

您将如何设计一个系统来实现新应用程序的目标?
服务,每隔一段时间从消息队列读取数据并执行您希望的操作。您也可以查看SQL Server Message Broker作为MSMQ的替代方案。 MSMQ没有非常好的内置工具来管理它,因此您需要在其之上构建它。但是,它在构建的框架中使用了一个完整的.NET程序集。

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