使用数据库或MSMQ排队?

时间:2010-03-23 10:51:50

标签: asp.net sql-server queue msmq message-queue

我正在处理的应用程序的一部分是一个swf,它显示了一个包含80个问题的测试。每个问题都通过WebORB和ASP.NET保存在SQL Server中。

如果考生完成考试,则需要验证会话。问题是有时350名候选人在同一时间完成测试,并且Web服务器和SQL Server上的CPU爆炸(同时进行350次验证)。

现在,我该如何在这里实施排队?在数据库中,有一个表,其中包含每个会话的记录。一栏保持状态。 1完成,2验证。

我可以通过两种方式实现排队(就像我看到的那样,也许你还有其他命题):

  • 检查表中状态为1的记录的进程。如果找到,则验证会话。因此,会话一个接一个地验证。
  • 如果候选人完成其会话,则会向MSMQ队列发送一条消息。另一个进程侦听队列并逐个验证会话。

现在:

  • 什么是最好的方法?
  • 您在哪里开始验证会话的流程?在你的global.asax(application_start)中?作为Windows服务?作为在application_start?
  • 中启动的网站根目录的exe

对我来说,使用该表并查找状态为1的记录似乎是最简单的方法。

4 个答案:

答案 0 :(得分:4)

MSMQ方法decouples来自验证逻辑服务和数据库的面向Web的应用程序。

这带来了许多优点,其中一些优点:

  • 处理验证逻辑每秒可处理5个会话并且一次收到300个会话的情况会更容易。否则你将不得不处理复制超时,重新尝试等。

  • 在验证服务上进行维护会更容易,而不必中断应用程序的其余部分。当验证服务被关闭时,消息将在MSMQ中排队,并且一旦启动就会再次处理。

  • 以上同样适用于数据库维护。

答案 1 :(得分:3)

如果您没有使用MSMQ的经验且没有设置基础设施,我会建议反对它。当然,它可能是在微软平台上进行排队的“正确”方式,但它并不是非常简单,并且具有相当的学习曲线。

创建Windows服务也是如此;除非你熟悉它,否则不要这样做。对于像这样的简单案例,我认为痛苦大于奖励。

最简单的解决方案可能是使用该表并在您在global.asax中启动的后台线程上运行该进程。您可能还想创建一个管理页面,该页面可以报告有关该过程的一些状态信息(待处理作业的数量等),如果由于某种原因失败,可能还有一个重启过程的按钮。

答案 2 :(得分:1)

什么是validating?在制定排队策略之前,我会尝试尽快制作validating,包括根据情况进行设置(如果不是这样)。

答案 3 :(得分:0)

我最近一直在调查这个,所以想提一下我的发现。与您的应用程序相比,数据库的位置是决定哪个选项更快的一个重要因素。

我测试了插入100个数据库条目所花费的时间,而不是将完全相同的数据记录到本地MSMQ消息中。然后我拿了几次执行此测试的结果的平均值。

我发现当数据库在本地网络上时,插入行的速度比登录MSMQ快4倍。

当通过合适的互联网连接访问数据库时,在数据库中插入行的速度比登录MSMQ慢6倍。

所以:

本地数据库 - DB更快,否则MSMQ就是。