簡體   English   中英

完成后在 Web 服務中分離線程

[英]Separate threads in a web service after it's completed

如果在我道歉之前有人問過這個問題,這是 .NET 2.0 ASMX Web 服務,再次道歉 =D

僅公開 Web 服務的 .NET 應用程序。 每天大約有 1000 萬條消息在多個 IIS 服務器之間進行負載平衡。 每個傳入消息都是 XML,傳出消息是 XML。 (XMLElement)(我們有在類固醇上運行的強大服務器)。

我有一個 SLA,所有消息都在 X 秒內處理。

一個函數,鏈接方法,在這個過程中現在需要 10-20 秒,每個事務都需要它,但是它在 Web 服務返回結果之前發生並不重要。 正因為如此,我建議把它扔到另一個線程上,但現在意識到我的話和他們背后的熱心開發人員可能沒有完全考慮到這一點。

下面的示例在左側顯示了當前的流程。 在右邊正在嘗試什么

實際上,我正在尋找的是讓 Web 服務產生一個長時間運行(10-20 秒)的線程,即使在 Web 服務完成后,該線程也會執行。

我正在尋找的示例

實際上,這就是正在發生的事情:

        Thread linkThread= new Thread(delegate()
        {
            Linkmembers(GetContext(), ID1, ID2, SomeOtherThing, XMLOrSomething);
        });
        linkThread.Start();

使用它,我們將開發箱的時間從 19 秒減少到 2.1 秒,這是相當可觀的。

我擔心隨着我們獲得的流量如此之大,如果供應商/外部方決定限制我們,IIS 可能會決定在這些線程完成處理之前回收/終止這些線程。 我同意我們的解決方案可能不是“最好的”,但是我們沒有時間構建隊列系統或其他 Windows 服務來處理這個問題。

有一個更好的方法嗎? 有什么需要考慮的注意事項嗎?

謝謝。

除了你描述的問題,我想不出任何問題。 話雖如此,有一些方法可以解決問題,而無需從頭開始構建自己的解決方案。

MSMQ 與 WCF 結合使用:使用由IIS 托管的 MSMQ 端點創建 WCF 服務(只要啟用了 WAS,就無需使用 Windows 服務),並從 ASMX 服務內部調用該服務。 您無需構建自己的隊列即可獲得可靠隊列的所有好處。

另外,如果您的 MSMQ 服務失敗或拋出異常,它將自動重新處理。 如果您使用 DTC 並且正在訪問數據庫,您甚至可以將 MSMQ 事務流​​傳輸到數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM