2010-07-27 77 views
2

我剛剛運行Visual Studio 2010線程事件探查器對我的Azure代碼,並注意到我收到了很多爭用。我的代碼比運行時經常被阻塞!什麼是導致與我的Azure隊列代碼的線程爭用?

我的工作人員根本沒有自定義線程邏輯。這是一個簡單的While循環,如果他們有工作,它會詢問各種隊列。我創建了QueueRepositoryClass的一個實例,然後調用GetQueueMessage函數。

看起來像是由於某些原因,多個線程正在擊中我的GetQueueMessage方法並且正在使用同一個queueClient實例。也許它是我使用CloudStorageAccount對象的結果?或者它是CreateCloudQueueClient擴展方法?

回答

0

我切換到使用異步QueueClient方法和整個系統現在執行好得多。

3

沒有看到調用代碼,這部分是推測,但它似乎是在相當緊密的循環中調用GetMessage()。 GetMessage是一個同步調用,這樣做會使該特定線程在等待隊列響應(其他線程繼續運行)時阻塞自己。在剖析器中,這看起來非常糟糕,因爲其餘的循環邏輯執行起來非常快(也就是說,你花了一兩個執行代碼獲得一條消息的50ms,看起來就像那樣)。其他

一個說明,你需要非常小心查詢有以下幾個原因在緊密的循環隊列:

1)雖然每次的Tx費用小,它不爲0,我通常建議一些後退邏輯 - 即如果隊列是空的,等待100ms後再次檢查。空兩次,退回到500毫秒等等。顯然你必須平衡那與你將要進行的用戶體驗。

2)如果您最終擴展應用程序 - 您有效地創建了針對隊列的DoS攻擊。 100個實例都在嚴密的循環中衝擊隊列,可能真的會傷害perf。

帕特

相關問題