2010-03-23 34 views
5

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

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

现在,我应该如何在这里实施排队?在数据库中,有一个表格为每个会话记录。一列保存状态。 1完成,2验证。

我可以实现两种方式排队(因为我看到它,也许你有其它的命题):

  • 与状态1.检查表中记录的方法,如果找到了,它验证会话。所以,会话一个接一个地被验证。
  • 如果候选人完成其会话,则将消息发送到MSMQ队列。另一个进程监听队列并逐一验证会话。

现在:

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

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

回答

4

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

这带来了很多好处,几其中:

  • 这将是比较容易处理,其中验证逻辑能处理每秒5次的情况下,它接收300的一次。否则,您将不得不处理重复超时,重新尝试等。

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

  • 与上述相同适用于数据库维护。

1

什么是validating?在研究排队策略之前,我会尽可能快地尝试使validating,包括如果它不是已经如此设置基础。

+0

我已经使用了基于集合,但我不太清楚你的意思。我已尽可能快地进行验证(现在每个会话时间为500毫秒),但如果同时有350名候选人进行验证,则验证时间为175秒。虽然它是负载平衡的,所以实际上它是350/4秒。它的工作原理,但网络服务器的CPU在几分钟内接近100%。 – 2010-03-23 23:02:36

+1

关于数据库编程使用“基于集合”的操作是当您发出单个数据库命令(如UPDATE)时它会影响所有行,而不是循环遍历每行并对每个行执行单独的UPDATE。我做了一个关于“基于数据库集处理”的谷歌,这里有两篇来自顶端的文章:http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx和http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx – 2010-03-24 11:33:49

3

如果您没有使用MSMQ的经验并且没有设置基础架构,我会反对它。当然,这可能是在微软平台上排队的“正确”方式,但它并不是非常直截了当,而且还有相当的学习曲线。

创建Windows服务也是一样;除非你熟悉它,否则不要这样做。对于这样的简单情况,我会争辩说,痛苦大于奖励。

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

0

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

我测试了插入100个数据库条目所花费的时间,并将完全相同的数据记录到本地MSMQ消息中。然后,我多次进行这个测试的平均结果。

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

当通过体面的互联网连接访问数据库时,向数据库中插入一行比登录到MSMQ的速度慢6倍。

因此:

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

+0

我担保这个意见,我也有同感。 我试图将100条记录插入到我自己建筑物的网络中的数据库中,然后在我的笔记本电脑中创建了Private MSMQ,并做了相同的操作。 MSMQ花费的时间比数据库多1.5倍以上。 我想MSMQ是好的,当你有多个服务想要在同一个地方写数据。 – 2017-03-17 10:24:00

+0

我偶然发现了这句话:“在交易模式下,SSB将比MSMQ快得多。如果让我们以非交易模式(尽力而为,无序,交付)进行操作,MSMQ将会更快。”那么......是否可以指定您的测试是使用事务队列还是未经处理的队列来执行? – Mario 2017-06-28 11:56:18