Freigeben über


Ausführen von Durable Functions als WebJobs

Standardmäßig verwendet Durable Functions die Azure Functions-Runtime zum Hosten von Orchestrierungen. Allerdings gibt es möglicherweise Szenarios, in denen Sie den Code, der auf Ereignisse lauscht, stärker steuern müssen. In diesem Artikel erfahren Sie, wie Sie Ihre Orchestrierung mithilfe des WebJobs SDK implementieren. Einen ausführlicheren Vergleich zwischen Functions und WebJobs finden Sie unter Vergleichen von Functions und WebJobs.

Azure Functions und die Erweiterung Durable Functions bauen auf dem WebJobs SDK auf. Der Auftragshost im WebJobs SDK ist die Runtime in Azure Functions. Wenn Sie das Verhalten auf eine Weise steuern müssen, die in Azure Functions nicht möglich ist, können Sie Durable Functions entwickeln und ausführen, indem Sie das WebJobs SDK selbst verwenden.

In Version 3.x des WebJobs SDK ist der Host eine Implementierung von IHost, und in Version 2.x verwenden Sie das Objekt JobHost.

Das Beispiel für die Verkettung von Durable Functions ist in einer WebJobs SDK 2.x-Version verfügbar: Laden Sie das Durable Functions-Repository herunter. Führen Sie einen Check-Out für den Branch v1 durch, und navigieren Sie zum Ordner samples\webjobssdk\chaining.

Voraussetzungen

Dieser Artikel setzt voraus, dass Sie mit den Grundlagen des WebJobs SDK, der Entwicklung von C#-Klassenbibliotheken für Azure Functions und Durable Functions vertraut sind. Wenn Sie eine Einführung in diese Konzepte benötigen, nutzen Sie die folgenden Ressourcen:

Zur Durchführung der in diesem Artikel aufgeführten Schritte ist Folgendes erforderlich:

  • Installieren Sie Visual Studio 2019 mit der Workload Azure-Entwicklung.

    Wenn Sie bereits über Visual Studio, jedoch nicht über diese Workload verfügen, müssen Sie die Workload hinzufügen, indem Sie Tools>Tools und Features abrufen auswählen.

    (Sie können stattdessen Visual Studio Code verwenden, aber einige der Anweisungen sind spezifisch für Visual Studio.)

  • Installieren Sie den Azurite-Speicheremulator und führen Sie ihn aus. Eine Alternative ist die Aktualisierung der App.config- Datei mit einer authentischen Azure Storage-Verbindungszeichenfolge.

WebJobs SDK-Versionen

In diesem Artikel wird erläutert, wie man ein WebJobs SDK 2.x-Projekt (entspricht Azure Functions Version 1.x) entwickelt. Informationen zu Version 3.x finden Sie weiter unten in diesem Artikel unter WebJobs SDK 3.x.

Erstellen einer Konsolen-App

Sie müssen zuerst eine Konsolen-App erstellen, um Durable Functions als WebJobs ausführen zu können. Ein WebJobs SDK-Projekt ist lediglich ein Konsolen-App-Projekt, für das die entsprechenden NuGet-Pakete installiert sind.

Wählen Sie im Visual Studio-Dialogfeld Neues Projekt die Option Klassischer Windows-Desktop>Konsolen-App (.NET Framework) aus. In der Projektdatei sollte die TargetFrameworkVersionv4.6.1 sein.

Visual Studio bietet auch eine WebJob-Projektvorlage, die Sie verwenden können, indem Sie Cloud>Azure WebJob (.NET Framework) auswählen. Diese Vorlage installiert viele Pakete, von denen einige möglicherweise nicht benötigt werden.

Installieren von NuGet-Paketen

Sie benötigen NuGet-Pakete für das WebJobs SDK, Hauptbindungen, das Protokollierungsframework und die Durable Task-Erweiterung. Hier sind Befehle der Paket-Manager-Konsole für diese Pakete mit den neuesten stabilen Versionsnummern zum Zeitpunkt der Erstellung dieses Artikels:

Install-Package Microsoft.Azure.WebJobs.Extensions -version 2.2.0
Install-Package Microsoft.Extensions.Logging -version 2.0.1
Install-Package Microsoft.Azure.WebJobs.Extensions.DurableTask -version 1.8.7

Darüber hinaus benötigen Sie Protokollanbieter. Die folgenden Befehle installieren den Azure Application Insights-Anbieter und den ConfigurationManager. Mit dem ConfigurationManager können Sie den Application Insights-Instrumentierungsschlüssel aus den App-Einstellungen abrufen.

Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights -version 2.2.0
Install-Package System.Configuration.ConfigurationManager -version 4.4.1

Über die folgenden Befehle wird der Konsolenanbieter installiert:

Install-Package Microsoft.Extensions.Logging.Console -version 2.0.1

JobHost-Code

Wenn die Konsolen-App erstellt und die erforderlichen NuGet-Pakete installiert sind, können Sie Durable Functions verwenden. Dazu verwenden Sie JobHost-Code.

Um die Erweiterung Durable Functions zu verwenden, rufen Sie UseDurableTask für das JobHostConfiguration-Objekt in Ihrer Main-Methode auf:

var config = new JobHostConfiguration();
config.UseDurableTask(new DurableTaskExtension
{
    HubName = "MyTaskHub",
};

Eine Liste der Eigenschaften, die Sie im DurableTaskExtension-Objekt festlegen können, finden Sie unter host.json.

Über die Main-Methode richten Sie auch den Protokollanbieter ein. In dem folgenden Beispiel werden die Konsole und Application Insights-Anbieter konfiguriert.

static void Main(string[] args)
{
    using (var loggerFactory = new LoggerFactory())
    {
        var config = new JobHostConfiguration();

        config.DashboardConnectionString = "";

        var instrumentationKey =
            ConfigurationManager.AppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"];

        config.LoggerFactory = loggerFactory
            .AddApplicationInsights(instrumentationKey, null)
            .AddConsole();

        config.UseTimers();
        config.UseDurableTask(new DurableTaskExtension
        {
            HubName = "MyTaskHub",
        });
        var host = new JobHost(config);
        host.RunAndBlock();
    }
}

Functions

Durable Functions im Kontext von WebJobs unterscheidet sich etwas von Durable Functions im Kontext von Azure Functions. Wenn Sie Ihren Code schreiben, ist es wichtig, diese Unterschiede zu berücksichtigen.

Die folgenden Azure Functions werden vom WebJobs SDK nicht unterstützt:

FunctionName-Attribut

In einem WebJobs-SDK-Projekt ist der Methodenname einer Funktion der Funktionsname. Das Attribut FunctionName wird nur in Azure Functions verwendet.

HTTP-Trigger

Das WebJobs SDK verfügt nicht über einen HTTP-Trigger. Der Orchestrierungsclient des Beispielprojekts verwendet einen Zeitgebertrigger:

public static async Task CronJob(
    [TimerTrigger("0 */2 * * * *")] TimerInfo timer,
    [OrchestrationClient] DurableOrchestrationClient client,
    ILogger logger)
{
  ...
}

HTTP-Verwaltungs-API

Da für das WebJobs SDK kein HTTP-Trigger vorhanden ist, verfügt es auch über keine HTTP-Verwaltungs-API.

In einem WebJobs SDK-Projekt können Sie Methoden für das Orchestrierungsclientobjekt aufrufen, anstatt HTTP-Anforderungen zu senden. Die folgenden Methoden entsprechen den drei Aufgaben, die Sie mit der HTTP-Verwaltungs-API ausführen können:

  • GetStatusAsync
  • RaiseEventAsync
  • TerminateAsync

Die Orchestrationsclientfunktion im Beispielprojekt startet die Orchestratorfunktion und wird dann in einer Schleife ausgeführt, die GetStatusAsync alle 2 Sekunden aufruft:

string instanceId = await client.StartNewAsync(nameof(HelloSequence), input: null);
logger.LogInformation($"Started new instance with ID = {instanceId}.");

DurableOrchestrationStatus status;
while (true)
{
    status = await client.GetStatusAsync(instanceId);
    logger.LogInformation($"Status: {status.RuntimeStatus}, Last update: {status.LastUpdatedTime}.");

    if (status.RuntimeStatus == OrchestrationRuntimeStatus.Completed ||
        status.RuntimeStatus == OrchestrationRuntimeStatus.Failed ||
        status.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
    {
        break;
    }

    await Task.Delay(TimeSpan.FromSeconds(2));
}

Ausführen des Beispiels

Sie haben Durable Functions für die Ausführung als WebJob-Dienst eingerichtet, und Sie verstehen, wie sich diese Ausführung von der Ausführung als eigenständiger Azure Functions-Dienst unterscheidet. An diesem Punkt kann es hilfreich sein, die Funktion in einem Beispiel zu sehen.

Dieser Abschnitt bietet eine Übersicht über die Ausführung des Beispielprojekts. Ausführliche Anweisungen, wie Sie ein WebJobs SDK-Projekt lokal ausführen und in einem Azure WebJob bereitstellen, finden Sie unter Erste Schritte mit dem WebJobs SDK.

Lokales Ausführen

  1. Stellen Sie sicher, dass der Speicheremulator ausgeführt wird (siehe Voraussetzungen).

  2. Wenn Sie beim lokalen Ausführen des Projekts Protokolle in Application Insights anzeigen möchten:

    a. Erstellen Sie eine Application Insights-Ressource, und verwenden Sie für die Ressource den App-Typ Allgemein.

    b. Speichern Sie den Instrumentierungsschlüssel in der Datei App.config.

  3. Führen Sie das Projekt aus.

Ausführen in Azure

  1. Erstellen Sie eine Web-App und eine Speicherkonto.

  2. Speichern Sie in der Web-App die Speicherverbindungsinformationen in einer App-Einstellung mit dem Namen AzureWebJobsStorage. Für die höchste Sicherheit sollten Sie mit Ihrem Speicherkonto eine Verbindung mit einer verwalteten Identität herstellen.

  3. Erstellen Sie eine Application Insights-Ressource, und verwenden Sie für die Ressource den App-Typ Allgemein.

  4. Speichern Sie den Instrumentierungsschlüssel in einer App-Einstellung namens APPINSIGHTS_INSTRUMENTATIONKEY.

  5. Führen Sie die Bereitstellung als WebJob aus.

WebJobs SDK 3.x

In diesem Artikel wird erläutert, wie man ein WebJobs SDK 2.x-Projekt entwickelt. Wenn Sie ein WebJobs SDK 3.x-Projekt entwickeln, hilft Ihnen dieser Abschnitt dabei, die Unterschiede zu verstehen.

Die wichtigste eingeführte Änderung ist die Verwendung von .NET Core anstelle von .NET Framework. Zum Erstellen eines WebJobs SDK 3.x-Projekts sind die Anweisungen identisch, mit diesen Ausnahmen:

  1. Erstellen Sie eine .NET Core-Konsolen-App. Wählen Sie im Visual Studio-Dialogfeld Neues Projekt die Option .NET Core>Konsolen-App (.NET Core) aus. Die Projektdatei gibt an, dass TargetFrameworknetcoreapp2.x ist.

  2. Wählen Sie die Releaseversion WebJobs SDK 3.x der folgenden Pakete:

    • Microsoft.Azure.WebJobs.Extensions
    • Microsoft.Azure.WebJobs.Extensions.Storage
    • Microsoft.Azure.WebJobs.Logging.ApplicationInsights
  3. Legen Sie die Speicherverbindungszeichenfolge und den Application Insights-Instrumentierungsschlüssel in einer appsettings.json-Datei mithilfe des .NET Core-Konfigurationsframeworks fest. Ein Beispiel:

        {
            "AzureWebJobsStorage": "<replace with storage connection string>",
            "APPINSIGHTS_INSTRUMENTATIONKEY": "<replace with Application Insights instrumentation key>"
        }
    

    Wichtig

    Für die höchste Sicherheit sollten Sie mit einer verwalteten Identität eine Verbindung mit Ihrem Speicherkonto herstellen. Weitere Informationen finden Sie unter Verwenden verwalteter Identitäten für App Service und Azure Functions.

  4. Ändern Sie den Main-Methodencode, um dies zu tun. Hier sehen Sie ein Beispiel:

    static void Main(string[] args)
    {
         var hostBuilder = new HostBuilder()
             .ConfigureWebJobs(config =>
             {
                 config.AddAzureStorageCoreServices();
                 config.AddAzureStorage();
                 config.AddTimers();
                 config.AddDurableTask(options =>
                 {
                     options.HubName = "MyTaskHub";
                     options.AzureStorageConnectionStringName = "AzureWebJobsStorage";
                 });
             })
             .ConfigureLogging((context, logging) =>
             {
                 logging.AddConsole();
                 logging.AddApplicationInsights(config =>
                 {
                     config.InstrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                 });
             })
             .UseConsoleLifetime();
    
         var host = hostBuilder.Build();
    
         using (host)
         {
             host.Run();
         }
    }
    

Nächste Schritte

Weitere Informationen zu dem WebJobs SDK finden Sie unter How to use the WebJobs SDK (Gewusst wie: Verwenden des WebJobs SDK).