2009-08-31 133 views
7

我正在研究Web应用程序排队的概念(即将某些类型的作业放在队列中以便由单独的工作人员完成,而不是在Web请求周期中完成)。ASP.NET MVC排队解决方案

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

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

谢谢!

UPDATE:

只是为了澄清,我不是在谈论排队传入的请求。我会尽量说明我的意思......

1)标准情况:

  • 从浏览器请求
  • 服务器处理开始
  • 长作业开始
  • 长时间完成
  • 服务器处理完
  • 响应返回给浏览器

2)我在寻找到什么:

  • Requsest从浏览器
  • 服务器处理开始
  • 放置在长工作队列
  • 服务器处理完
  • 响应返回给浏览器

而在另一个进程(在发送响应可能后):

  • 从队列中取出长工作
  • 长期作业开始
  • 长期工作已完成

在第一个例子中,用户已经等待很长一段时间服务器resoponse,在第二个很快。

当然有某些类型的工作适合这个,有些是不适合的。

UPDATE2:

客户端不必与长作业的结果会立即更新。只要用户碰巧刷新一个页面(在完成作业之后),这些更改就会显示在应用程序中。

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

+0

队列由IIS完成。每个请求都被放入由工作进程处理的队列中。工作进程和请求/响应处理的维护由IIS完成。为什么实施第二个排队机制? – Christian13467 2009-08-31 12:00:11

+1

@ Christian13467:我在谈论一个不同的概念 - 请参阅更新中的说明。 – UpTheCreek 2009-08-31 13:05:00

回答

5

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

+0

这比我想象的要低一点,但也许我以错误的方式看待它 - 我没有任何MSMQ技能,但我会研究它 - 谢谢。 – UpTheCreek 2009-08-31 13:12:44

0

我觉得Chrisitan的评论可能是你的答案,但考虑到我不知道很多有关IIS,并用它排队,我的解决办法是:

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

编辑

我的回答可能仍然工作,但你需要在客户端上的一些轮询机制,不断检查数据库,看看是否能用户的作业完成,然后抓住你所需要的数据。

+1

不,基督徒的评论不是我的答案;) 我已经考虑过'使用数据库'滚动你自己的路线,但我正在寻找一些更多的重建和建立目的。我不想重新发明轮子(我的轮子可能不会很完美) – UpTheCreek 2009-08-31 12:53:46

+0

只是为了澄清重新编辑 - 客户端不需要更新作业的结果,因此不需要轮询。 – UpTheCreek 2009-08-31 12:56:06

2

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

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

感谢,

哈尔

+0

我会检查公交 - 我注意到它建立在MSMQ上。相当于像Amazon SQS那样的东西可能是我正在寻找的 - 谢谢。 – UpTheCreek 2009-08-31 13:11:16

3

犀牛服务总线是另一种解决方案,可以为你工作:
http://ayende.com/Blog/archive/2008/12/17/rhino-service-bus.aspx

+0

谢谢 - 我会检查出来。我很喜欢在过去的其他主题上阅读Ayende的帖子:)这是准备好了吗? – UpTheCreek 2009-08-31 13:14:34

+0

我个人从未在生产中使用过它,但是,我知道那些在生产中使用过它的人。 – 2009-08-31 18:25:44

0

你有没有考虑MSMQ?没有什么能阻止你在MVC中使用它,并且开始使用它非常简单。

1

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