1

Ich versuche, eine mentale Verschiebung in Richtung dieser serverlosen Sache zu machen, und ich merkte nicht, wie ich meinen vorhandenen Backend-Code portieren sollte. Ich brauche die folgenden Annahmen zu klären:Verhalten von Azure-Funktionen verstehen

  1. eine Azure Funktion ist als ein Single-Threaded-Stück Code sein?
  2. Ist es immer eine schlechte Idee, TPL und PLINQ in einer Funktion zu verwenden?
  3. Wie hoch ist der Overhead von static Mitgliedern im Vergleich zum regulären App-Service? Grundsätzlich haben wir irgendwelche Garantien auf AppDomain Lebensdauer?
  4. Wenn ich ein Logging-Framework wie NLog verwenden oder log4net deren async Appen benötigen einen eigenen Thread muss ich von irgendetwas sein müssen besorgt?
  5. Wie kann ich überwachen, wie viel Speicher jeder Funktion ausgeführt wurde?
  6. Ist es möglich, einen DI-Container einzurichten, so dass meine Abhängigkeiten in Run Methode injiziert werden? So etwas Ähnliches:

    [FunctionName("ServiceBusQueueTriggerCSharp")]      
    public async Task RunAsync(
        [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")] 
        string myQueueItem, 
        IBusinessLogicService blService, 
        ILogService logService, 
        IMailingService mailService) { 
    } 
    
  7. Ist es möglich, eine CancellationToken in Run Methode zu erhalten, so dass ich stornieren/shutdown anmutig?

Antwort

2
  1. Es hängt davon ab, was Sie mit "Single-Threaded-Codestück" bedeuten. Auf einer höheren Ebene sollten Sie den Code, den Sie in Ihrer Funktion schreiben, ähnlich dem Code in einer ASP.NET MVC-Controller-Methode schreiben. Ein einzelnes Ereignis ist aufgetreten (z. B. eine HTTP-Anforderung), ein bestimmter Computer, auf dem Ihre Anwendung ausgeführt wird, hat dieses Ereignis empfangen und Ihr Code beschreibt, wie Sie damit umgehen. Die dynamischen Skalierungsfunktionen von Azure-Funktionen werden niemals einzeln ausgeführt und verteilen diese Ausführung transparent auf mehrere Threads oder Maschinen. Wenn Sie ein Szenario haben, bei dem aufgrund eines einzelnen Ereignisses viel Arbeit erledigt werden muss, sollten Sie Ihre Arbeit auf mehrere Funktionen aufteilen, damit das System sie skalieren kann. Eine der einfachsten Möglichkeiten, dies zu tun, ist mit Warteschlangen.

  2. Es gibt viele Szenarien, in denen die Verwendung von TPL gültig ist. Beispielsweise könnte Ihre Funktion Daten aus drei verschiedenen Datenquellen abrufen und sie zu einem Ergebnis kombinieren. In diesem Fall wäre es sinnvoll, diese 3 asynchronen Operationen parallel zu initiieren. Ich bin nicht ganz so sicher in Bezug auf PLINQ. Was ich sagen würde ist, dass Sie, wenn Sie signifikante Berechnungen haben, die aus Effizienzgründen parallel ablaufen müssen, diese Berechnungen am besten in separate Funktionsausführungen aufteilen (z. B. mit Warteschlangen, wie ich oben erwähnt habe).

  3. Sie können statische Variablen mit praktisch keinem Overhead verwenden, aber es gibt keine Garantie für die Lebensdauer der App-Domäne. Sie müssen also bereit sein, diese Variablen bei Bedarf neu zu initialisieren.

  4. Die Azure-Funktionen sind derzeit nicht pro Speicherauslastungsstatistik verfügbar. Es gibt Nutzungsstatistiken auf der Ebene der Funktions-App, siehe here für Informationen.

  5. Azure-Funktionen unterstützt derzeit nicht DI.

  6. Ja, einfach definieren Sie Ihre Funktion als eine asynchrone Funktion, die eine Aufgabe zurückgibt und es eine Stornierung Token akzeptieren und eins wird Ihnen übergeben werden.

Verwandte Themen