異步已經成爲.net中的流行詞,MS已經在Web API 2中引入它,以便可以處理更多的請求,而其他人則在等待IO完成。什麼時候你真的需要web框架上的異步?
雖然我可以看到這個好處,但它真的是一個問題嗎? x64體系結構在線程池中有30000多個線程,因此除非您的網站上有許多併發用戶是真正需要的異步?即使你有很多沒有緩存的併發用戶,我也很確定SQL Server會因爲這麼多請求而崩潰嗎?
除了它是否真的需要在Web框架上進行異步路由時閃亮?
異步已經成爲.net中的流行詞,MS已經在Web API 2中引入它,以便可以處理更多的請求,而其他人則在等待IO完成。什麼時候你真的需要web框架上的異步?
雖然我可以看到這個好處,但它真的是一個問題嗎? x64體系結構在線程池中有30000多個線程,因此除非您的網站上有許多併發用戶是真正需要的異步?即使你有很多沒有緩存的併發用戶,我也很確定SQL Server會因爲這麼多請求而崩潰嗎?
除了它是否真的需要在Web框架上進行異步路由時閃亮?
這裏的許多其他答案都來自UI(桌面/移動應用程序)的角度,而不是Web服務器的角度。
異步已經成爲.net中的一個流行詞,MS已經在Web API 2中引入了它,以便可以處理更多的請求,而其他人則在等待IO完成。很長一段時間以前 -
async
和await
因爲.NET 2.0中引入的.NET 4.5/VS 2012年。然而,ASP.NET已經有異步請求的能力。並且有人在使用它。
什麼async
和await
帶來的是異步代碼,易於維護。
雖然我可以看到這個好處,它真的是一個問題嗎?
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採取的立場,異步數據庫調用是不值得的努力。請注意這篇文章中的假設很重要:
async
,越來越多的庫提供異步API(例如實體框架)。其中async
服務器真的很閃耀,當你的後端也可以擴展。例如:Web服務,Azure SQL,NoSQL集羣等。示例:我正在編寫一個MVC/WebAPI服務器,它在後端使用Azure SQL和存儲(出於所有實際目的,我可以像他們具有無限的可伸縮性一樣);在這種情況下,我要讓我的服務器async
。在這種情況下,可以使用async
將服務器擴展爲10倍或更多。
但是,如果您只有一個SQL Server後端(並且沒有計劃更改爲Azure SQL),那麼在您的Web服務器async
中沒有任何意義,因爲您受到後端的限制。
ASP.NET自HTTP 1.0處理程序自.NET 1.0開始具有異步請求功能。在2.0的Web API中,我們引入了異步頁面任務(和異步HTTP模塊,我認爲)。 –
我必須使用異步,當操作需要很長時間(上傳,導出,處理)和用戶必須知道進度。
'async'不能用於從ASP.NET請求向用戶報告進度。 –
看起來我有一個概念上的錯誤,因爲我認爲我們討論的是異步請求,而不僅僅是'async'語句。 – FSou1
你從哪裏得到30000。我不記得確切,但我認爲Asp.net使用12個核心線程數。
那麼IIS是如何發揮作用的,因爲可以處理超過12,24,36,48個請求的請求 – Jon
如果請求需要1秒處理,那麼Asp.net將只處理每個核心每秒12個請求。每個CPU啓動12個線程需要一些時間。 Asp.net不會每秒添加2個以上的線程。 –
我不認爲預取是ASP.NET上'async'的一個很好的用例。 –
你需要異步在下列情況下,
1)當你正在執行一個很長的操作,你不想凍結你的UI。
2)當你設計了一些需要在後臺完成的任務時。
例如,您正在渲染來自數據庫的圖像。但是你不希望你的頁面在那個時候被凍結,async是非常有用的。
我在想你已經把線程池和請求隊列限制混淆起來了。默認情況下,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
所以它只允許每核心100個,所以在一個四核上有400個併發用戶,並使用requestQueueLimit來排隊傳入的請求。 IIS在這方面沒有幫助允許更多的請求? – Jon