2009-12-02 25 views
1

我正在尋找考慮可伸縮性和性能的最佳使用線程方式。ASP.NET線程:我應該使用數據庫進行數據庫和電子郵件操作嗎?

在我的地盤我有兩個場景是需要線程:

  1. UI觸發:例如用戶點擊一個按鈕,服務器應該讀從DB數據和發送電子郵件一些。這些操作需要時間,我不希望用戶請求延遲。這種情況經常發生。

  2. 後臺服務:當應用程序啓動時,它觸發運行,每10分鐘一個線程,從數據庫中讀取和發送電子郵件。

的解決方案,我發現:

A.使用線程池 - BeginInvoke的: 這是我今天用這兩種方案。 它工作正常,但它使用相同的線程爲頁面提供服務,所以我認爲我可能遇到可伸縮性問題,這會成爲一個問題嗎?

B.否使用游泳池 - 的ThreadStart: 我知道開始一個新的線程需要更多的資源,然後使用一個線程池。 這種方法可以更好地適用於我的場景嗎? 什麼是重用打開的線程的最佳方式?

C.自定義線程池: 因爲我的情況經常發生,也許最好的辦法是開始一個新的線程池?

謝謝。

回答

4

我會親自投入不同的服務這一點。讓您的用戶界面操作寫入數據庫,並擁有一個單獨的服務,該服務可以輪詢數據庫或對觸發器作出反應,並在此時發送電子郵件。

通過將其分離到不同的服務中,您不必擔心AppDomain的回收等問題,並且您可以在需要時將其放在整個不同的服務器上。我認爲它會給你一個更靈活的解決方案。

+0

+1好的解耦和更好的容錯性。 – 2009-12-02 09:10:09

+0

這兩種情況都適用嗎?或者第一個可以通過使用異步頁面來解決?目前我在共享主機上,所以不同的服務不是一種選擇,如果我不得不使用線程哪個選項更好? BeginInvoke會成爲一個可伸縮性問題嗎? – SirMoreno 2009-12-02 09:48:36

+0

我懷疑要麼使用單獨的線程,要麼線程池可以工作。鑑於您不希望用戶不得不等待,我不確定異步頁面是否會幫助您。我對他們瞭解不多,但他們似乎是要讓長期運行的請求更有效率 - 你不希望你的請求長時間運行,你只是想讓它開始後臺任務。 – 2009-12-02 10:22:10

0

我通過調用Web服務,然後調用使用委託異步的方法做這種事情。原始webservice調用返回Guid以允許跟蹤處理。

0

對於第一種情形使用ASP.NET異步頁面。異步頁面在可伸縮性方面是非常好的選擇,因爲在異步執行期間,HTTP請求線程被釋放並且可以被重新使用。

我同意喬恩斯基特,對於第二種情形,你應該使用單獨的服務 - Windows服務在這裏是一個不錯的選擇。

0

出你的三個方案中,不使用BeginInvoke。正如你所說,這會對可擴展性產生負面影響。

在另外兩個之間,如果任務是真正的背景,並且用戶沒有等待響應,那麼單個永久線程應該完成這項工作。當你有多個任務應該並行執行時,線程池更有意義。

但是,請記住,Web服務器有時會崩潰,AppPools回收等等。因此,如果任何排隊的工作需要可靠地執行,那麼將其移出進程可能是一個更好的主意(例如進入Windows服務)。保持請求順序並保持持久性的一種方法是使用Service Broker。您可以將請求寫入Web層的Service Broker隊列(使用異步請求),然後從運行在同一臺計算機或另一臺計算機上的服務中讀取這些消息。您也可以通過簡單地添加更多服務實例(或更多線程)來很好地進行縮放。

如果有幫助,我會在書中詳細介紹後臺線程和Service Broker,包括代碼示例:Ultra-Fast ASP.NET

相關問題