7

我研究了 Web 应用程序排队的概念(即将某些类型的作业放入队列中以由单独的工作人员完成,而不是在 Web 请求周期中完成)。

我想知道是否有任何可以在 ASP.NET MVC 环境中使用的好的解决方案。

有没有人有任何(好的或坏的)经历?

谢谢!

更新:

澄清一下,我不是在谈论排队传入的请求。我将尝试说明我的意思...

1)标准情况:

  • 来自浏览器的请求
  • 服务器处理开始
  • 漫长的工作开始
  • 漫长的工作完成了
  • 服务器处理完毕
  • 响应返回到浏览器

2)我正在调查的内容:

  • 来自浏览器的请求
  • 服务器处理开始
  • 排在队列中的长作业
  • 服务器处理完毕
  • 响应返回到浏览器

在另一个过程中(可能在发送响应之后):

  • 从队列中取出的长时间工作
  • 漫长的工作开始
  • 漫长的工作完成了

在第一种情况下,用户等待服务器响应很长时间,在第二种情况下它很快。

当然,某些类型的工作适合此,有些则不适合。

更新2:

客户端不必立即使用长期工作的结果进行更新。只要用户碰巧刷新页面(当然是在作业完成之后),这些更改就会在应用程序中显示出来。

想想堆栈溢出中发生的一些事情——它们不会在应用程序的每个部分立即更新,但这发生得很快——我怀疑其中一些作业正在排队。

4

6 回答 6

5

在MSMQ 队列中发布作业数据并让 Windows 服务处理队列中的项目。或者,让 Web 请求产生一个处理队列中项目的进程。

于 2009-08-31T13:05:51.630 回答
3

Rhino Service Bus 是另一种可能适合您的解决方案:http:
//ayende.com/Blog/archive/2008/12/17/rhino-service-bus.aspx

于 2009-08-31T13:08:58.637 回答
2

您可能会检查是否使用 ESB。我玩过 MassTransit:http ://code.google.com/p/masstransit/ - 文档(或至少是)有点稀疏,但很容易实现。

此外,我开发了在 Amazon EC2 上运行的应用程序,并且非常喜欢他们的 AmazonSQS 服务。

谢谢,

哈尔

于 2009-08-31T12:59:13.530 回答
1

由于您在另一条评论中提到您正在寻找与亚马逊的 sqs 服务等效的服务......您可能想要研究 Windows Azure。他们有一个等效的队列 api:http:
//msdn.microsoft.com/en-us/library/dd179363.aspx

于 2009-08-31T18:27:32.440 回答
1

我通过让 Web 服务器异步调用 WCF 服务来实现此模式。当您使用 WCF 服务时,VS 向导将为您生成异步代理。如果您必须保证对服务的请求的交付,您可以使用 MSMQ 作为 WCF 服务的传输层。

于 2009-08-31T19:38:47.477 回答
0

我认为克里斯坦的评论可能是你的答案,但考虑到我对 IIS 和排队的了解不多,我的解决方案是:

发出异步请求并将作业详细信息加载到数据库中。然后有一个作业循环数据库并处理作业详细信息。我为我的一个站点执行此操作。可能不是最好的解决方案,但它可以完成工作。

编辑

我的回答可能仍然有效,但您需要在客户端上有一些轮询机制来不断检查数据库以查看该用户的工作是否完成,然后获取您需要的数据。

于 2009-08-31T12:47:52.397 回答