问题:大约300名候选人使用Flex进行测试。测试包括大约100个练习。每次练习后,都会调用.NET服务来存储结果。如果候选人完成测试,他/她的测试的所有数据都被Asp.NET非规范化。这种非规范化可能需要一些cpu,可能需要5到10秒。现在,大多数时候,一些候选人比其他人更早完成了测试,但仍有大约200人等到他们的时间到了。在那一刻,200名候选人完成了他们的考试,200名会议同时被非正规化。此时,服务器负载(cpu)太高并导致调用Web服务器出错。现在,我不想同时对所有这些会话进行规范化,而是希望使用MSMQ将它们添加到队列中。
问题:
答案 0 :(得分:4)
您可以考虑使用带有MSMQ传输的WCF服务。我在计算佣金的应用程序中使用了这种方法:
用户完成配置计算参数的asp.net向导 计算作业使用MSMQ传输发送到WCF服务 作业进入MSMQ后,服务交易即告完成 为处理作业实例
创建了新的事务范围一个缺点是该事务将需要MSDTC,这将在针对MS SQL Server时增加一些开销,在处理Oracle时会更多。
IDesign在WCF排队时提供a lot of useful samples and best practices。
答案 1 :(得分:2)
就个人而言,我使用servicebus来实现这样的场景。我知道这听起来像是一种矫枉过正,但我认为.net服务总线非常好,它们需要你编写的代码量最少,因为在不干扰应用程序池线程的情况下为后台进程创建一个好的调度程序并不容易webapp正在运行.NServicebus和MassTransit都是适合您的场景的良好文档服务总线。使用servicebus,您有一个框架,可以写入msmq并在消息队列连接的多个应用程序中侦听msmq。总线使您可以轻松创建作为后台服务运行的单独应用程序,并通过消息队列与您的Web应用程序连接。当您使用topself(包含在nservicebus和masstransit中)时,服务总线会自动生成单独应用程序的安装程序/卸载程序。
问题:为什么你不喜欢单独的exe?
答案 2 :(得分:1)
- 如何处理队列?
- 您是否在global.asax的Application_Start中启动了一个单独的线程 听队列?如果有消息,则将其发送给 时间。
- 是否有必要在单独的线程中执行此操作?如果在 global.asax你只是调用一个单例来开始监听 队列?在这个单身人士运行的线程中? (那是什么线索 调用global.asax)
[跳过]
- 我不喜欢这个想法,但是你可以在你的网站的根目录上放一个exe,一个>开始一个听队列的过程......
通常,另一个程序处理队列 - 而不是ASP.NET。 Windows服务或您在调度程序下运行的可执行文件(并且没有理由将其放在您的网站的根目录中)。
- 如果您从队列中收到消息,请在拉动时将其删除 如果此会话的非规范化,则将其删除或删除它 成功?如果你把它拉出去的东西就去掉了 错...
对于重要工作,您执行交易阅读。在您提交读取操作之前,不会从队列中删除项目,但在事务处于打开状态时,其他任何进程都无法获取该项目。
- 实施此操作的最佳做法是什么?链接?资源?教程?实例
This tutorial is a good introduction和John Breakwell's blog is excellent并提供了许多良好的链接(包括易于查找的侧栏“MSMQ文档”中的链接)。