Udostępnij za pośrednictwem


Jak uruchomić rozszerzenie Durable Functions jako zadania WebJob

Domyślnie rozszerzenie Durable Functions używa środowiska uruchomieniowego usługi Azure Functions do hostowania aranżacji. Mogą jednak istnieć pewne scenariusze, w których potrzebna jest większa kontrola nad kodem, który nasłuchuje zdarzeń. W tym artykule pokazano, jak zaimplementować aranżację przy użyciu zestawu SDK usługi WebJobs. Aby wyświetlić bardziej szczegółowe porównanie funkcji i zadań WebJob, zobacz Porównanie funkcji i zadań WebJob.

Usługi Azure Functions i rozszerzenie Durable Functions są oparte na zestawie SDK usługi WebJobs. Hostem zadań w zestawie SDK zadań WebJobs jest środowisko uruchomieniowe w usłudze Azure Functions. Jeśli musisz kontrolować zachowanie w sposób, który nie jest możliwy w usłudze Azure Functions, możesz samodzielnie opracowywać i uruchamiać rozszerzenie Durable Functions przy użyciu zestawu SDK usługi WebJobs.

W wersji 3.x zestawu SDK usługi WebJobs host jest implementacją IHostelementu , a w wersji 2.x jest używany JobHost obiekt .

Przykład rozszerzenia Durable Functions jest dostępny w wersji 2.x zestawu WebJobs SDK: pobierz lub sklonuj repozytorium Durable Functions, a następnie wyewidencjonuj gałąź v1 i przejdź do folderu samples\webjobssdk\chaining .

Wymagania wstępne

W tym artykule założono, że znasz podstawy zestawu SDK zadań WebJobs, programowania bibliotek klas języka C# dla usługi Azure Functions i rozszerzenia Durable Functions. Jeśli potrzebujesz wprowadzenia do tych pojęć, zobacz następujące zasoby:

Aby wykonać kroki opisane w tym artykule:

  • Zainstaluj program Visual Studio 2019 z pakietem roboczym Programowanie na platformie Azure.

    Jeśli masz już program Visual Studio, ale nie masz tego obciążenia, dodaj obciążenie, wybierając pozycję Narzędzia Pobierz narzędzia>i funkcje.

    (Możesz użyć polecenia Zamiast tego program Visual Studio Code , ale niektóre instrukcje są specyficzne dla programu Visual Studio).

  • Zainstaluj i uruchom emulator magazynu Azurite. Alternatywą jest zaktualizowanie pliku App.config przy użyciu rzeczywistego parametry połączenia usługi Azure Storage.

Wersje zestawu SDK usługi WebJobs

W tym artykule wyjaśniono, jak opracować projekt zestawu SDK 2.x usługi WebJobs (odpowiednik usługi Azure Functions w wersji 1.x). Aby uzyskać informacje o wersji 3.x, zobacz zestaw WebJobs SDK 3.x w dalszej części tego artykułu.

Tworzenie aplikacji konsolowej

Aby uruchomić rozszerzenie Durable Functions jako zadania WebJob, musisz najpierw utworzyć aplikację konsolową. Projekt zestawu SDK usługi WebJobs to tylko projekt aplikacji konsolowej z zainstalowanymi odpowiednimi pakietami NuGet.

W oknie dialogowym Nowy projekt programu Visual Studio wybierz pozycję Klasyczna aplikacja konsoli klasycznej>systemu Windows (.NET Framework). W pliku TargetFrameworkVersion projektu element powinien mieć wartość v4.6.1.

Program Visual Studio ma również szablon projektu zadania WebJob, którego można użyć, wybierając pozycję Cloud>Azure WebJob (.NET Framework). Ten szablon instaluje wiele pakietów, z których niektóre mogą nie być potrzebne.

Instalowanie pakietów NuGet

Potrzebujesz pakietów NuGet dla zestawu SDK zadań WebJobs, powiązań podstawowych, struktury rejestrowania i rozszerzenia Durable Task. Poniżej przedstawiono Menedżer pakietów polecenia konsoli dla tych pakietów z najnowszymi stabilnymi numerami wersji zgodnie z datą napisaną w tym artykule:

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

Potrzebujesz również dostawców rejestrowania. Następujące polecenia instalują dostawcę aplikacja systemu Azure Insights i .ConfigurationManager Umożliwia ConfigurationManager uzyskanie klucza instrumentacji usługi Application Insights z ustawień aplikacji.

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

Następujące polecenie instaluje dostawcę konsoli:

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

Kod JobHost

Po utworzeniu aplikacji konsolowej i zainstalowaniu potrzebnych pakietów NuGet możesz użyć rozszerzenia Durable Functions. W tym celu należy użyć kodu JobHost.

Aby użyć rozszerzenia Durable Functions, wywołaj UseDurableTaskJobHostConfiguration obiekt w metodzie Main :

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

Aby uzyskać listę właściwości, które można ustawić w DurableTaskExtension obiekcie, zobacz host.json.

Metoda Main jest również miejscem konfigurowania dostawców rejestrowania. Poniższy przykład umożliwia skonfigurowanie konsoli i dostawców usługi Application Insights.

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();
    }
}

Funkcje

Rozszerzenie Durable Functions w kontekście zadań WebJob różni się nieco od rozszerzenia Durable Functions w kontekście usługi Azure Functions. Ważne jest, aby pamiętać o różnicach podczas pisania kodu.

Zestaw SDK usługi WebJobs nie obsługuje następujących funkcji usługi Azure Functions:

Atrybut FunctionName

W projekcie zestawu SDK usługi WebJobs nazwa metody funkcji to nazwa funkcji. Atrybut FunctionName jest używany tylko w usłudze Azure Functions.

Wyzwalacz HTTP

Zestaw SDK usługi WebJobs nie ma wyzwalacza HTTP. Klient orkiestracji przykładowego projektu używa wyzwalacza czasomierza:

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

Interfejs API zarządzania HTTP

Ponieważ nie ma wyzwalacza HTTP, zestaw SDK usługi WebJobs nie ma interfejsu API zarządzania HTTP.

W projekcie zestawu SDK usługi WebJobs można wywoływać metody w obiekcie klienta orkiestracji, zamiast wysyłać żądania HTTP. Następujące metody odpowiadają trzem zadaniam, które można wykonać za pomocą interfejsu API zarządzania HTTP:

  • GetStatusAsync
  • RaiseEventAsync
  • TerminateAsync

Funkcja klienta orkiestracji w przykładowym projekcie uruchamia funkcję orkiestratora, a następnie przechodzi do pętli, która wywołuje co GetStatusAsync 2 sekundy:

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));
}

Uruchamianie aplikacji przykładowej

Masz skonfigurowaną usługę Durable Functions do uruchamiania jako zadanie WebJob, a teraz masz wiedzę na temat tego, jak będzie to różnić się od uruchamiania rozszerzenia Durable Functions jako autonomicznej usługi Azure Functions. W tym momencie obserwowanie pracy w przykładzie może być przydatne.

Ta sekcja zawiera omówienie sposobu uruchamiania przykładowego projektu. Aby uzyskać szczegółowe instrukcje, które wyjaśniają, jak uruchomić projekt zestawu SDK usługi WebJobs lokalnie i wdrożyć go w ramach zadania WebJob platformy Azure, zobacz Rozpoczynanie pracy z zestawem SDK zadań WebJobs.

Uruchamianie polecenia w środowisku lokalnym

  1. Upewnij się, że emulator magazynu jest uruchomiony (zobacz Wymagania wstępne).

  2. Jeśli chcesz wyświetlić dzienniki w usłudze Application Insights podczas lokalnego uruchamiania projektu:

    a. Utwórz zasób usługi Application Insights i użyj dla niego typu aplikacji Ogólne .

    b. Zapisz klucz instrumentacji w pliku App.config .

  3. Uruchamianie projektu.

Uruchamianie na platformie Azure

  1. Utwórz aplikację internetową i konto magazynu.

  2. W aplikacji internetowej zapisz informacje o połączeniu magazynu w ustawieniu aplikacji o nazwie AzureWebJobsStorage. W przypadku najwyższego poziomu zabezpieczeń należy użyć połączenia tożsamości zarządzanej z kontem magazynu.

  3. Utwórz zasób usługi Application Insights i użyj dla niego typu aplikacji Ogólne .

  4. Zapisz klucz instrumentacji w ustawieniu aplikacji o nazwie APPINSIGHTS_INSTRUMENTATIONKEY.

  5. Wdrażanie jako zadania WebJob.

Zestaw SDK usługi WebJobs w wersji 3.x

W tym artykule wyjaśniono, jak opracować projekt zestawu WebJobs SDK 2.x. Jeśli tworzysz projekt zestawu WebJobs SDK 3.x , ta sekcja ułatwia zrozumienie różnic.

Główną zmianą jest użycie platformy .NET Core zamiast programu .NET Framework. Aby utworzyć projekt zestawu WebJobs SDK 3.x, instrukcje są takie same, z następującymi wyjątkami:

  1. Utwórz aplikację konsolową platformy .NET Core. W oknie dialogowym Nowy projekt programu Visual Studio wybierz pozycję Aplikacja konsolowa platformy .NET Core>(.NET Core). Plik projektu określa, że TargetFramework to netcoreapp2.x.

  2. Wybierz wersję wersji zestawu WebJobs SDK 3.x następujących pakietów:

    • Microsoft.Azure.WebJobs.Extensions
    • Microsoft.Azure.WebJobs.Extensions.Storage
    • Microsoft.Azure.WebJobs.Logging.ApplicationInsights
  3. Ustaw parametry połączenia magazynu i klucz instrumentacji usługi Application Insights w pliku appsettings.json przy użyciu platformy konfiguracji platformy .NET Core. Oto przykład:

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

    Ważne

    W przypadku najwyższego poziomu zabezpieczeń należy użyć połączenia tożsamości zarządzanej z kontem magazynu. Aby uzyskać więcej informacji, zobacz How to use managed identities for App Service and Azure Functions (Jak używać tożsamości zarządzanych dla usług App Service i Azure Functions).

  4. Zmień kod metody, Main aby to zrobić. Oto przykład:

    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();
         }
    }
    

Następne kroki

Aby dowiedzieć się więcej na temat zestawu SDK usługi WebJobs, zobacz How to use the WebJobs SDK (Jak używać zestawu SDK usługi WebJobs).