使用数据库还是MSMQ进行排队?

5
我正在处理的应用程序中有一个swf,它展示了一个包含80个问题的测试。每个问题都通过WebORB和ASP.NET保存在SQL Server中。
如果候选人完成了测试,则需要验证会话。问题是有时会有350个候选人同时完成他们的测试,这时候Web服务器和SQL Server的CPU就会爆炸(即350个并发验证)。
现在,我该如何在这里实现排队?在数据库中,有一个表,其中每个会话都有一条记录。一列保存状态。1表示已完成,2表示已验证。
我可以通过两种方式来实现排队(据我所见,也许你有其他建议):
1. 一个进程检查具有状态1的记录的表。如果找到一个,则验证该会话。因此,会话一个接一个地进行验证。 2. 如果候选人完成其会话,则向MSMQ队列发送消息。另一个进程监听队列,并一个接一个地验证会话。
现在:
1. 哪种方法是最好的? 2. 您从哪里开始验证会话的过程?在您的global.asax(application_start)中?作为Windows服务?作为在application_start中启动的网站根目录中的exe?
对我来说,使用表格并查找具有状态1的记录似乎是最简单的方法。
4个回答

4

MSMQ方法解耦了您面向网络的应用程序和验证逻辑服务以及数据库。

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

  • 在验证逻辑可以处理每秒5个会话并且它一次性接收到300个会话的情况下,处理起来更容易。否则,您将不得不处理复杂的超时、重试等问题。

  • 在维护验证服务时更容易,而无需中断其他应用程序。当验证服务关闭时,消息将排队在MSMQ中,并在其重新启动后再次处理。

  • 对于数据库维护也是如此。


3
如果你没有使用MSMQ的经验并且没有设置基础设施,我建议不要使用它。当然,这可能是在Microsoft平台上执行队列操作的“适当”方式,但它并不是非常直观,并且需要相当长的学习曲线。
同样的情况也适用于创建Windows服务;除非您熟悉它,否则不要这样做。对于像这样简单的情况,我认为痛苦大于回报。
最简单的解决方案可能是使用表格并在global.asax中启动一个后台线程来运行该进程。您可能还想创建一个管理页面,可以报告有关该进程的一些状态信息(挂起作业的数量等),并且如果由于某种原因该进程失败,还可以创建一个重新启动该进程的按钮。

1

什么是验证?在着手排队策略之前,我建议尽可能让验证变得更快,包括将其设置为基于集合的方式(如果它还没有这样做)。


我已经谷歌了“基于集合的”,但我不太确定你的意思。我已经尽可能地使验证变快(现在每个会话只需500毫秒),但是如果同时有350个候选人进行验证,那么需要175秒。虽然它是负载平衡的,实际上只需要350/4秒。它可以工作,但Web服务器的CPU会在某些时间接近100%。 - Lieven Cardoen
1
在数据库编程中使用“基于集合”的操作是指您发出单个数据库命令(如UPDATE),它会影响到所有行,而不是循环遍历每一行并对每一行执行单独的UPDATE。我在谷歌上搜索了“数据库基于集合的处理”,以下是两篇排名靠前的文章:http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx和http://weblogs.sqlteam.com/jeffs/archive/2007/04/30/60192.aspx。 - KM.

0

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

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

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

当通过良好的互联网连接访问数据库时,将行插入数据库的速度比记录到MSMQ慢6倍。

所以:

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


我支持这个观点,我有同感。我尝试将100条记录插入到我的网络中的数据库中,该数据库位于我自己的建筑物内,然后我在我的笔记本电脑上创建了私有MSMQ并执行了相同的操作。 MSMQ所需的时间比数据库多1.5倍以上。我猜想当您有多个服务想要将数据写入同一位置时,MSMQ是很好的选择。 - Sheo Narayan
我偶然发现了这句话:“在事务模式下,SSB将比MSMQ快得多。如果让MSMQ在非事务模式下运行(尽力而为、无序交付),它将更快。”那么...你的测试是否可以指定是在事务队列还是非事务队列中执行的? - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接