對於消費計劃中的Azure函數應用程序,我有兩個定時器觸發的C#函數,大約需要1分鐘才能運行。Azure函數併發超時
如果他們在不同的時間運行,他們每個人都能成功運行。但是,如果我在時間上重疊運行它們,那麼這些功能將永遠無法完成,並且會超時。
我看不到併發問題可能來自哪裏。這些函數通過EF從Azure SQL讀取數據並將結果寫入Azure存儲上的不同Blob。
這兩個函數在ASP.NET MVC Web應用程序(Web應用程序)中承載Azure應用程序服務並同時正確運行的webjobs之前實現。
當我將兩個webjob移動到Azure函數應用程序時,我將Web App bin文件夾的內容複製到Function App bin文件夾中,然後在每個函數中引用必要的dll。
我認爲這個併發問題的一個原因是複製Web App bin文件夾的內容。
我能想到的另一個原因是,如果消費計劃沒有對每個新功能的內存進行預算,從而正確縮放。例如,如果觸發的新功能本身需要大量內存,則可能應將其分配給新的計算實例,而不是共享先前的計算實例。因爲我的函數佔用大量內存,所以如果第一個函數被分配給一個小的計算實例,並且第二個函數被分配給同一個小計算實例,則兩者都可能超過導致超時的限制。
編輯
從Matt Mason MSFT的建議之後的其他結果。
- 使用第二個功能應用程序。也在消費模式下,並在bin文件夾中具有相同的 文件。我能夠在不同的功能應用上以相同的 時間運行這兩個功能,並且他們成功完成。這 讓我相信問題應該來自功能應用程序和 而不是Azure SQL或Blob存儲依賴項。
但是,在單獨的應用程序中運行功能不是一個可接受的解決方案。從相同功能的應用程序同時運行的功能和 監控實況度量流
結果:
一個。每個函數都單獨成功運行,並顯示CPU總數爲70%至97%,內存爲400至700 MB。見第一張圖片。
b。兩個功能在同一時間。我看到110%的CPU和800 MB的內存,然後指標流空白,我看到了。 「無在線服務器」。一段時間後,我再次看到一臺服務器在線,但兩種功能狀態是「從未完成」。這是功能應用程序崩潰嗎?請參閱下面的圖像2,3和4。
您是否使用EF的共享(靜態)Db連接實例?運行在同一個底層主機上的函數共享一個AppDomain,這可能會導致一些怪異。 –
每個函數都將投射自己的EF的DbContext實例。作爲額外的結果。我可以在單獨的功能應用上同時運行這兩個功能(請參閱上面的編輯)。 – donquijote