2013-08-01 76 views
9

異步已經成爲.net中的流行詞,MS已經在Web API 2中引入它,以便可以處理更多的請求,而其他人則在等待IO完成。什麼時候你真的需要web框架上的異步?

雖然我可以看到這個好處,但它真的是一個問題嗎? x64體系結構在線程池中有30000多個線程,因此除非您的網站上有許多併發用戶是真正需要的異步?即使你有很多沒有緩存的併發用戶,我也很確定SQL Server會因爲這麼多請求而崩潰嗎?

除了它是否真的需要在Web框架上進行異步路由時閃亮?

+0

我在想你已經把線程池和請求隊列限制混淆起來了。默認情況下,ASP.net 4.0僅爲每個CPU內核分配最多20個工作線程和20個IO線程,兩者的最大值爲100。這些配置使用web.config文件中的['processModel'](http://msdn.microsoft.com/en-us/library/vstudio/7w2sway1(v = vs.100).aspx)元素進行配置。如果你考慮30,000個帶有256KB堆棧的線程,每個線程需要約7.3GiB,而不是其他任何進程內存。對於它的價值,默認的'requestQueueLimit'是5,000。 – Joshua

+0

所以它只允許每核心100個,所以在一個四核上有400個併發用戶,並使用requestQueueLimit來排隊傳入的請求。 IIS在這方面沒有幫助允許更多的請求? – Jon

回答

9

這裏的許多其他答案都來自UI(桌面/移動應用程序)的角度,而不是Web服務器的角度。

異步已經成爲.net中的一個流行詞,MS已經在Web API 2中引入了它,以便可以處理更多的請求,而其他人則在等待IO完成。很長一段時間以前 -

asyncawait因爲.NET 2.0中引入的.NET 4.5/VS 2012年。然而,ASP.NET已經有異步請求的能力。並且有人在使用它。

什麼asyncawait帶來的是異步代碼,易於維護

雖然我可以看到這個好處,它真的是一個問題嗎?

async在服務器上的主要好處是可擴展性。簡而言之,async任務的規模遠遠好於線程。

@約書亞的評論是記憶的關鍵;一個線程需要大量的內存(並且不要忘記內核模式堆棧不能被分頁),而一個async請求只需要幾百個字節。

還有爆裂要考慮。 .NET線程池具有有限的注入速率,因此除非您將minWorkerThread計數設置爲比通常需要的值高得多的值,否則當您發生流量突發時,某些請求將在503啓動足夠的線程來處理它們之前發生503 。 async保持您的線程免費(儘可能),以便更好地處理突發流量。

x64體系結構在線程池中有30000多個線程,因此除非您的網站上有很多併發用戶是真正需要的異步嗎?

@Joshua再次指出您可能正在考慮請求隊列限制(IIS隊列的缺省值爲1000,ASP.NET請求限制的缺省值爲5000)。需要注意的是,一旦這個隊列被填滿(在突發流量期間),新的請求將被拒絕503.

即使你有很多沒有緩存的併發用戶,我很確定SQL Server會崩潰那麼多要求?

啊,現在這就是完全是另一個問題。

我在async服務器上特別給出talk at ThatConference 2013。談話的一部分是async沒有幫助的情況(my Twitter update)。

有一個excellent blog post here採取的立場,異步數據庫調用是不值得的努力。請注意這篇文章中的假設很重要:

  1. 在撰寫文章時,異步Web服務器很困難。現在我們有async,越來越多的庫提供異步API(例如實體框架)。
  2. 該體系結構假定具有單個SQL Server後端的單個Web服務器。傳統上這是一個非常常見的設置,但今天正在迅速改變。

其中async服務器真的很閃耀,當你的後端也可以擴展。例如:Web服務,Azure SQL,NoSQL集羣等。示例:我正在編寫一個MVC/WebAPI服務器,它在後端使用Azure SQL和存儲(出於所有實際目的,我可以像他們具有無限的可伸縮性一樣);在這種情況下,我要讓我的服務器async。在這種情況下,可以使用async將服務器擴展爲10倍或更多。

但是,如果您只有一個SQL Server後端(並且沒有計劃更改爲Azure SQL),那麼在您的Web服務器async中沒有任何意義,因爲您受到後端的限制。

+0

ASP.NET自HTTP 1.0處理程序自.NET 1.0開始具有異步請求功能。在2.0的Web API中,我們引入了異步頁面任務(和異步HTTP模塊,我認爲)。 –

0

我必須使用異步,當操作需要很長時間(上傳,導出,處理)和用戶必須知道進度。

+0

'async'不能用於從ASP.NET請求向用戶報告進度。 –

+0

看起來我有一個概念上的錯誤,因爲我認爲我們討論的是異步請求,而不僅僅是'async'語句。 – FSou1

1

你從哪裏得到30000。我不記得確切,但我認爲Asp.net使用12個核心線程數。

+0

那麼IIS是如何發揮作用的,因爲可以處理超過12,24,36,48個請求的請求 – Jon

+0

如果請求需要1秒處理,那麼Asp.net將只處理每個核心每秒12個請求。每個CPU啓動12個線程需要一些時間。 Asp.net不會每秒添加2個以上的線程。 –

3
  1. 當長時間的操作可以有效地並行執行。例如,您必須執行兩個SQL並加載三張圖片 - 以異步方式執行全部五個操作並等待它們全部。在這種情況下,總時間將是五次操作的最長持續時間,但不是的持續時間總和
  2. 預取。如果您可以預測(很有可能)用戶會做什麼(例如,幾乎可以肯定,(他)會希望看到詳細信息...),您可以在用戶閱讀前一頁時開始準備下一頁(框架,窗口)。
+0

我不認爲預取是ASP.NET上'async'的一個很好的用例。 –

-1

你需要異步在下列情況下,

1)當你正在執行一個很長的操作,你不想凍結你的UI。

2)當你設計了一些需要在後臺完成的任務時。

例如,您正在渲染來自數據庫的圖像。但是你不希望你的頁面在那個時候被凍結,async是非常有用的。

相關問題