架构排队asp.NET - MSMQ

时间:2010-02-16 07:45:25

标签: asp.net msmq

问题:大约300名候选人使用Flex进行测试。测试包括大约100个练习。每次练习后,都会调用.NET服务来存储结果。如果候选人完成测试,他/她的测试的所有数据都被Asp.NET非规范化。这种非规范化可能需要一些cpu,可能需要5到10秒。现在,大多数时候,一些候选人比其他人更早完成了测试,但仍有大约200人等到他们的时间到了。在那一刻,200名候选人完成了他们的考试,200名会议同时被非正规化。此时,服务器负载(cpu)太高并导致调用Web服务器出错。现在,我不想同时对所有这些会话进行规范化,而是希望使用MSMQ将它们添加到队列中。

问题:

  • 如何处理队列?
  • 您是否在global.asax的Application_Start中启动了一个侦听队列的单独线程?如果有消息,则会在当时发送消息。
  • 是否有必要在单独的线程中执行此操作?如果在global.asax中你只是调用一个单例来开始侦听队列怎么办?在这个单身人士运行的线程中? (什么是调用global.asax的线程)
  • 实施此操作的最佳做​​法是什么?链接?资源?教程?实例
  • 我不喜欢这个想法,但是你可以在你网站的根目录上放一个exe,一个启动进程监听队列的exe ...
  • 如果您从队列中收到消息,是否在将其拔出时将其删除,或者如果此会话的非规范化成功,您是否将其删除?如果你把它拉出来就会把它拿走而出现问题......
  • 我也可以在内存中创建自己的队列,但重新启动网络服务器会清空队列,很多会话最终都没有被规范化,所以我想这真是一个坏主意。
    • MSMQ是一个不错的选择还是有更好的选择?

3 个答案:

答案 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 introductionJohn Breakwell's blog is excellent并提供了许多良好的链接(包括易于查找的侧栏“MSMQ文档”中的链接)。