Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
体系结构队列asp.NET-MSMQ_Asp.net_Msmq - Fatal编程技术网

体系结构队列asp.NET-MSMQ

体系结构队列asp.NET-MSMQ,asp.net,msmq,Asp.net,Msmq,问题:大约300名考生使用Flex进行测试。一次测试包括大约100个练习。每次练习后,都会调用.NET服务来存储结果。如果考生完成了一项测试,他/她的所有测试数据都将通过Asp.NET进行非规范化。这种非规范化可能需要一些cpu,可能需要5到10秒。现在,大多数情况下,一些考生比其他考生提前完成考试,但仍有大约200人等待考试结束。在那一刻,200名考生完成了测试,同时200节课被反规范化。此时,服务器负载(cpu)过高,导致对Web服务器的调用出错。现在,我想使用MSMQ将它们添加到队列中,而

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

问题:

  • 如何处理队列
  • 是否在global.asax的应用程序_start中启动侦听队列的单独线程?如果有消息,则一次处理一条消息
  • 是否需要在单独的线程中执行此操作?如果在global.asax中,您只调用一个开始侦听队列的单例呢?此单例将在哪个线程中运行?(调用global.asax的线程是什么)
  • 实现这一点的最佳实践是什么?链接?资源?教程?例子
  • 我不喜欢这个主意,但是你能在你的网站的根上放一个exe吗,一个启动进程监听队列的exe
  • 如果您从队列中获取消息,那么您是在拉出消息时将其删除,还是在此会话的非规范化成功时将其删除?如果你把它拔出来的时候把它取了出来,结果出了问题
  • 我也可以在内存中创建自己的队列,但是重新启动Web服务器会清空队列,很多会话最终无法正常化,所以我想这真的是个坏主意。
    • MSMQ是一个好的选择还是有更好的选择

可以考虑使用MSMQ传输的WCF服务。我在计算佣金的应用程序中使用了这种方法:

用户完成asp.net向导配置计算参数 使用MSMQ传输将计算作业发送到WCF服务 一旦作业进入MSMQ,服务事务即完成 为处理作业实例创建了新的事务作用域

一个缺点是事务将需要MSDTC,这将在针对MS SQL Server时增加一些开销,在处理Oracle时甚至会增加更多开销

IDesign提供了有关WCF排队的信息

  • 如何处理队列
  • 是否在应用程序\u start of global.asax中启动单独的线程 听队列的那个?如果有消息,则一次处理一条消息 时间
  • 是否需要在单独的线程中执行此操作?如果在 例如,您只需调用一个开始侦听 排队?此单例将在哪个线程中运行?(那条线是什么 呼叫global.asax)
[跳过]

  • 我不喜欢这个主意,但是你能在你网站的根目录上放一个exe吗?一个exe,它>启动一个进程来监听队列
通常另一个程序处理队列-而不是ASP.NET。windows服务或在计划程序下运行的可执行文件(没有理由将其放在网站的根目录中)

  • 如果您从队列中获取消息,是否在拉取消息时将其删除 如果此会话的非规范化已完成,请将其删除或删除 成功的如果你把它拿出来,有东西掉了 错了
对于关键工作,执行事务性读取。在提交读取操作之前,不会从队列中删除项,但在事务打开时,其他进程无法获取该项

  • 实现这一点的最佳实践是什么?链接?资源?教程?例子

并且提供了很多很好的链接(包括他容易找到的侧栏“MSMQ文档”中的链接)。

我个人使用servicebus实现类似的场景。我知道这听起来有些过分,但我认为.net servicebusses非常好,它们需要您编写的代码最少,因为要为后台进程创建一个好的调度程序而不干扰webapp运行的应用程序池的线程是不容易的。NServicebus和MassTransit对于您的场景来说都是很好的服务总线。有了servicebus,您就有了一个框架,可以在messagequeue连接的多个应用程序中写入msmq并侦听msmq。通过该总线,您可以轻松创建单独的应用程序,该应用程序作为后台服务运行,并通过消息队列与您的web应用程序连接。当您使用topself(包括在nservicebus和masstransit中)时,服务总线会自动生成用于单独应用程序的安装程序/卸载程序


问题:为什么您不喜欢使用单独的exe?

“服务器负载(cpu)太高,导致对Web服务器的调用出错”-错误是什么?您是否认为您可以减少正常化所需的时间?对我来说似乎有点高…这真的没关系,因为200个会话被非规范化了,对服务器的调用慢了很多。如果您想知道错误,请查看以下内容:。我还没有真正弄清这件事的真相。似乎这也可能是flex中的一个bug。另一方面,它只会在很多会话同时完成时出错。是的,我们也在考虑缩短正常化的时间。问题是我们将练习(内容)存储在xml中,所以需要将该xml反序列化为对象。我们已经添加了缓存,所以通常它应该已经运行得更快了。但仍然有很多数据需要去规范化。你不觉得排队更好吗?我想负载会分布得更好(不知道这是不是英语)。