1

我試圖讓這個無服務器的事情發生心理轉變,並且我發現自己不理解如何移植我現有的後端代碼。我需要澄清以下假設:瞭解Azure函數行爲

  1. Azure函數是否被認爲是單線程代碼?
  2. 在函數內部使用TPL和PLINQ總是一個壞主意嗎?
  3. 與普通應用服務相比,static會員的費用是多少? 基本上,我們對AppDomain生命時間有任何保證嗎?
  4. 如果我使用日誌框架,如NLoglog4net其異步appenders需要一個專用線程我需要擔心什麼?
  5. 我該如何監測每個函數運行花費多少內存
  6. 是否可以設置DI容器,以便將我的依賴關係注入到Run方法中?類似的東西:

    [FunctionName("ServiceBusQueueTriggerCSharp")]      
    public async Task RunAsync(
        [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")] 
        string myQueueItem, 
        IBusinessLogicService blService, 
        ILogService logService, 
        IMailingService mailService) { 
    } 
    
  7. 是否有可能得到一個CancellationTokenRun方法,這樣我可以優雅地取消/關機?

回答

2
  1. 這取決於你所說的「單線程代碼段」是什麼。在高層次上,您應該查看您在函數中編寫的代碼,這與您可能在ASP.NET MVC控制器方法中編寫代碼的方式類似。發生單個事件(例如HTTP請求),運行應用程序的特定計算機已收到該事件,並且您的代碼描述瞭如何處理它。 Azure函數的動態擴展功能永遠不會執行單個執行,並且可以將該執行透明地分佈到多個線程或機器上。如果您有一個場景需要根據單個事件完成大量工作,那麼您應該將工作分成多個功能,以便系統可以擴展。最簡單的方法之一就是排隊。

  2. 有許多使用TPL的場景是有效的。例如,您的函數可能會從3個不同的數據源提取數據並將其合併爲一個結果。在這種情況下,並行啓動這3個異步操作是有意義的。對於PLINQ我不太確定。我要說的是,當您爲了提高效率而需要並行執行大量計算時,最好將這些計算分解爲單獨的函數執行(例如,如上所述使用隊列)。

  3. 您可以使用基本沒有開銷的靜態變量,但是無法保證應用程序域的生命週期。所以你需要準備好在需要時重新初始化這些變量。

  4. Azure函數當前不公開每個函數內存使用統計信息。在功能應用程序級別有使用統計信息,有關信息,請參閱here

  5. Azure函數目前不支持DI。

  6. 是的,只需定義函數作爲一個返回任務異步函數,並讓它接受取消標記和一個將被傳遞給你。