如何创建一个.net 4 MVC 3作业/队列系统
本文关键字:作业 MVC 系统 队列 一个 何创建 创建 net | 更新日期: 2023-09-27 18:11:45
问题
从前,我编写了一个内部应用程序,从内部数据库读取数据,然后将这些数据发送给web服务。该应用程序非常简单,使用单个线程和同步HTTP请求。
这个应用程序的作用域现在已经改变了,它试图推送的数据远远超过了它原本打算推送的数据。如果它从我们的内部数据库中读取1000条记录,它将把它们全部封装到一个HTTP POST中,这会给承载接收数据的web服务的服务器带来沉重的CPU负担。当web服务在处理POST中的一条记录时遇到错误时,也会出现问题。XML响应没有指定哪个特定的记录失败,因此我对请求成功的可见性有限。
How I Like Fix It
我将重新设计我的应用程序,使其更可靠,更体贴托管web服务的服务器。具体来说,我希望有一个工作人员,每15分钟从内部数据库收集记录,并将它们转化为工作。这些作业将被序列化并存储在队列中(可能是数据库表)。然后,我想让我的应用程序使用几个工作线程处理队列(这是一个好主意吗?)。线程将从队列中弹出一个作业,并通过向web服务上游发送异步HTTP POST来处理它。根据请求的状态,作业将导致SUCCESS、FAILURE、TIMEOUT或ABORTED。作业将在数据库中更新,进程将被记录,然后工作线程将继续进行下一个作业,如果作业队列为空则变为空闲。
我不是一个建筑师,所以我不知道最好的方法来实现这样的东西。以下是我对设计的一些具体问题。
- 我读过一些关于。net MVC环境中多线程的负面消息。我应该避免使用多线程,因为我没有做任何真正的CPU密集型的事情?
- 石英。NET看起来可以做很多很酷的事情。我应该考虑使用石英吗?NET之类的东西?
- 我的设计合理吗?如果不是,如何改进?
- 您将如何设计一个系统来满足新应用程序的目标?
您考虑过MSMQ吗?你将消息推送到队列中,每N分钟读取一条消息,并在发生任何电源故障时内置冗余等。如果你在一个负载均衡的环境中,你可以发布到一个共享队列。
我读过一些关于。net MVC环境中多线程的负面消息。我应该避免使用多线程,因为我没有做任何真正的CPU密集型的事情?
建议不要在ASP中使用threadpool。NET,所以同样的将适用于MVC。它可以限制你的应用程序。
石英。NET看起来可以做很多很酷的事情。我应该考虑使用石英吗?NET之类的东西?
这是调度而不是队列的替代品,类似于cronjobs。
我的设计合理吗?如果不是,如何改进?
序列化部分听起来很棒,SUCCESS, FAILURE, TIMEOUT或ABORTED部分听起来不错。如前所述,MSMQ将为您省去编写冗余和消息队列系统的麻烦。
您将如何设计一个系统来满足新应用程序的目标?
一种服务,它经常从消息队列中读取信息,并执行您希望它执行的操作。您还可以将SQL Server Message Broker作为MSMQ的替代方案。MSMQ没有很好的内置工具来管理它,所以您需要在它的基础上进行构建。但是,它在框架中内置了一个完整的。net程序集来使用它。
当你使用。net 4时,你还可以从并行任务中获益,而不是手动管理系统的HTTP发送部分。