【问题标题】:Architecture Queuing asp.NET - MSMQ体系结构队列 asp.NET - MSMQ
【发布时间】: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,这很有帮助。

标签: asp.net msmq


【解决方案1】:

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

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

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

IDesign 在 WCF 队列中提供 a lot of useful samples and best practices

【讨论】:

  • 谢谢,将检查这个 WCF 队列,看看我是否可以使用它。
【解决方案2】:

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

问题:你为什么不喜欢有一个单独的 exe 的想法?

【讨论】:

  • 好吧,因为那时我必须从站点复制所有 dll。从持续集成的角度来看,它更难维护。
  • 但是如果单独的exe是最好的方法,那真的没问题。
  • 如果你把exe放在站点的根目录下,那么它可以使用站点的dll。这是好习惯吗?
  • 只需在后台和 web 应用程序中引用 dll。比在哪里部署后台应用程序无关紧要。
【解决方案3】:
  • 如何处理队列?
  • 是否在 global.asax 的 Application_Start 中启动一个单独的线程 听队列?如果有消息,它们会在 时间。
  • 是否有必要在单独的线程中执行此操作?如果在 global.asax 你只需调用一个单例,例如开始收听 队列?这个单例将在哪个线程中运行? (那是什么线 调用 global.asax)

[跳过]

  • 我不喜欢这个主意,但是您能否在您网站的根目录中放置一个 exe,该 exe > 启动一个监听队列的进程...

通常另一个程序处理队列 - 而不是 ASP.NET。 Windows 服务或您在调度程序下运行的可执行文件(没有理由将其放在您网站的根目录中)。

  • 如果从队列中得到消息,是否在拉取时将其删除 如果此会话的非规范化是,则将其删除或将其删除 成功的?如果您在拉出它时将其移除并且有什么东西发生了 错了……

对于关键工作,您执行事务性读取。在您提交读取操作之前,项目不会从队列中删除,但是当事务打开时,没有其他进程可以获取该项目。

  • 实施此操作的最佳做​​法是什么?链接?资源?教程?例子?

This tutorial is a good introductionJohn Breakwell's blog is excellent 并提供了很多很好的链接(包括他易于查找的侧边栏“MSMQ 文档”中的链接)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2014-10-06
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多