【发布时间】:2011-01-17 07:08:09
【问题描述】:
问题:大约 300 名考生使用 Flex 进行测试。一个测试包括大约 100 个练习。每次练习后都会调用一个 .NET 服务来存储结果。如果一个候选人完成了一个测试,他/她的测试的所有数据都会被 Asp.NET 非规范化。这种非规范化可能需要一些 cpu,并且可能需要 5 到 10 秒。现在,大多数情况下,一些考生比其他考生更早完成了考试,但仍有大约 200 名考生等到时间到了。在那一刻,200 名候选人完成了他们的测试,同时 200 个会话被非规范化。此时,服务器负载 (cpu) 太高,导致对网络服务器的调用出错。现在,我不想同时对所有这些会话进行规范化,而是想使用 MSMQ 将它们添加到队列中。
问题:
- 如何处理队列?
- 是否在 global.asax 的 Application_Start 中启动一个单独的线程来监听队列?如果有消息,则同时处理一条消息。
- 是否有必要在单独的线程中执行此操作?如果在 global.asax 中你只是调用一个单例开始监听队列呢?这个单例将在哪个线程中运行? (调用 global.asax 的线程是什么)
- 实施此操作的最佳做法是什么?链接?资源?教程?例子?
- 我不喜欢这个主意,但是你能不能在你网站的根目录下放一个 exe,一个启动监听队列的进程的 exe...
- 如果您从队列中获得消息,您是在将其拉出时将其删除,还是在此会话的非规范化成功时将其删除?如果您在拔出时将其取下并出现问题...
- 我也可以在内存中创建自己的队列,但是重新启动网络服务器会清空队列,并且很多会话最终不会被规范化,所以我想这确实是个坏主意。
- MSMQ 是一个不错的选择还是有更好的选择?
【问题讨论】:
-
“服务器负载 (cpu) 太高,导致对网络服务器的调用出错” - 错误是什么?
-
您认为也许您可以减少正常化所需的时间吗?对我来说似乎有点高......
-
这真的没关系,因为 200 个会话被非规范化,对服务器的调用会慢得多。如果你想知道错误,看看这个:stackoverflow.com/questions/2258403/…。我还没有真正深入了解这一点。似乎它也可能是flex中的一个错误。另一方面,只有在很多会话同时完成时才会出错。
-
是的,我们也在考虑缩短标准化时间。问题是我们将练习(内容)存储在 xml 中,因此需要将这个 xml 反序列化为对象。我们添加了缓存,所以通常它应该已经更快了。但是,仍然需要对大量数据进行非规范化。您不认为使用队列还是更好吗?我猜负载会分布得更好(不知道这是不是英文)。未来,300 可以上千……
-
我还需要看看成本,你知道的。也许实现队列的工作量比提高性能要少得多,而且对我的经理和客户来说,更少的工作听起来很棒...... ;-) 尽管如此,提高性能可能更重要。我已经调整了 SqlServer,这很有帮助。