2009-08-31 116 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服務的傳輸層。