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

标签 c# .net asp.net-mvc

这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the help center .




10年前关闭。




问题

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

这个应用程序的范围现在已经改变,它试图推送比以往任何时候都多得多的数据。如果它从我们的内部数据库中读取 1,000 条记录,它会将它们全部包装到一个 HTTP POST 中,这会给托管接收数据的 Web 服务的服务器带来沉重的 CPU 负担。当 Web 服务在处理 POST 中的记录之一时遇到错误时,也会出现问题。 XML 响应未指定失败的特定记录,因此我对请求成功的可见性有限。

我想如何修复它

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

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

  • 我读过一些关于 .NET MVC 环境中多线程的负面信息。我应该避免使用多线程,因为我没有做任何真正占用 CPU 的事情吗?
  • Quartz.NET 看起来可以做很多很酷的事情。我应该考虑使用 Quartz.NET 来做这样的事情吗?
  • 我的设计合理吗?如果没有,如何改进?
  • 您将如何设计一个系统来满足新应用程序的目标?

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

    最佳答案

    您是否为此考虑过 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 发送部分的手动线程管理。

    关于c# - 如何创建 .NET 4 MVC 3 作业/队列系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840500/

    相关文章:

    asp.net-mvc - Microsoft.jQuery.Unobtrusive.Ajax 与 jQuery 兼容的版本

    c# - 是否可以捕获并处理网站卸载事件 - asp.net 网页 razor 2?

    c# - "Cannot perform ' = ' operation on System.Int32 and System.String"执行搜索时

    c# - 使用 ORM 仅检索一些列

    c# - 将 linq 扩展到实体以识别自定义方法

    javascript - C# 属性值不会在 Javascript/jquery 中被修改

    c# - 组合框将 itemsource 绑定(bind)到自定义列表并将 selecteditem 绑定(bind)到该列表的实例不起作用

    c# - 在不使用 IDataProtector 的情况下,在 ASP.NET Core 中加密 cookie 的简单/体面的方法是什么?

    c# - SqlTransaction.Commit() 之前的 SqlCommand.Dispose()?

    asp.net-mvc - 简单自动化构建 ASP.NET MVC 2 应用程序