Lire en anglais

Partager via


Comment exécuter Durable Functions en tant que WebJobs

Par défaut, Durable Functions utilise le runtime Azure Functions pour héberger les orchestrations. Toutefois, dans certains scénarios, il vous faudra mieux contrôler le code qui écoute les événements. Cet article vous explique comment implémenter votre orchestration à l’aide du kit de développement logiciel (SDK) WebJobs. Pour une comparaison détaillée de Functions et WebJobs, consultez Comparer Functions et WebJobs.

Azure Functions et l’extension Fonctions durables reposent sur le SDK WebJobs. L’hôte de travail dans le kit de développement logiciel (SDK) WebJobs correspond au runtime dans Azure Functions. Si vous devez contrôler le comportement en fonction de paramètres impossibles dans Azure Functions, vous pouvez développer et exécuter Durable Functions à l'aide du kit de développement logiciel (SDK) WebJobs.

Dans la version 3.x du kit de développement logiciel (SDK) WebJobs, l’hôte est une implémentation de IHost tandis que dans la version 2.x vous utilisez l’objet JobHost.

L'exemple de chaînage des Fonctions Durables est disponible dans une version 2.x du SDK WebJobs : téléchargez ou clonez le dépôt des Fonctions Durables , et vérifiez la branche v1 et allez dans le dossier samples\webjobssdk\chaining.

Prérequis

Cet article suppose que vous connaissez les principes de base du SDK WebJobs, du développement de bibliothèque de classes C# pour Azure Functions et de l’extension Fonctions durables. Si vous avez besoin d’une présentation de ces concepts, veuillez consulter les ressources suivantes :

Pour accomplir les étapes décrites dans cet article :

  • Installez Visual Studio 2019 avec la charge de travail de développement Azure.

    Si vous possédez déjà Visual Studio, mais que vous n’avez pas cette charge de travail, ajoutez-la en sélectionnant Outils>Obtenir les outils et fonctionnalités.

    (Vous pouvez utilisez en lieu et place Visual Studio Code, mais certaines des instructions sont spécifiques à Visual Studio.)

  • Installez et démarrez l’émulateur de stockage Azurite. Une autre solution est de mettre à jour le fichier App.config avec une chaîne de connexion Stockage Azure réelle.

Versions du SDK WebJobs

Cet article vous explique comment développer un projet SDK WebJobs 2.x (équivalent à Azure Functions version 1.x). Pour plus d’informations sur la version 3.x, consultez SDK WebJobs 3.x plus bas dans cet article.

Créer une application console

Pour exécuter Durable Functions en tant que WebJobs, vous devez d’abord créer une application console. Un projet SDK WebJobs est simplement un projet d’application console avec les packages NuGet appropriés installés.

Dans la boîte de dialogue Nouveau projet Visual Studio, sélectionnez Bureau classique Windows>Application console (.NET Framework) . Dans le fichier de projet, l’élément TargetFrameworkVersion doit être défini sur v4.6.1.

Visual Studio propose également un modèle de projet WebJob, que vous pouvez utiliser en sélectionnant Cloud>Azure WebJob (.NET Framework) . Ce modèle installe de nombreux packages, qui ne vous seront peut-être pas tous utiles.

Installer les packages NuGet

Vous avez besoin des packages NuGet pour le SDK WebJobs, les liaisons essentielles, l’infrastructure de journalisation et l’extension Tâche durable. Voici les commandes de la console du gestionnaire de package pour ces packages, avec les derniers numéros de version stables au moment où cet article a été écrit :

PowerShell
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

Vous avez également besoin de fournisseurs de journalisation. Les commandes suivantes installent le fournisseur Azure Application Insights et l’élément ConfigurationManager. L’élément ConfigurationManager vous permet de récupérer la clé d’instrumentation Application Insights des paramètres d’application.

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

La commande suivante installe le fournisseur de console :

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

Code JobHost

Après avoir créé l’application console et installé les packages NuGet dont vous avez besoin, vous êtes prêt à utiliser Durable Functions. Pour ce faire, utilisez le code JobHost.

Pour utiliser l’extension Fonctions durables, appelez UseDurableTask sur l’objet JobHostConfiguration dans votre méthode Main :

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

Pour obtenir la liste des propriétés que vous pouvez définir dans l’objet DurableTaskExtension, consultez le fichier host.json.

La méthode Main sert également à définir les fournisseurs de journalisation. L’exemple suivant configure les fournisseurs de la console et Application Insights.

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

Fonctions

Durable Functions diffère selon s'il est utilisé dans le contexte de WebJobs ou d'Azure Functions. Il est important de connaître ces différences lorsque vous écrivez votre code.

Le SDK WebJobs ne prend pas en charge les fonctions suivantes d’Azure Functions :

Attribut FunctionName

Dans un projet de SDK WebJobs, le nom de la méthode d’une fonction est le nom de la fonction. L’attribut FunctionName est utilisé uniquement dans Azure Functions.

Déclencheur HTTP

Le Kit de développement logiciel (SDK) WebJobs ne comporte pas de déclencheur HTTP. Le client d’orchestration de l’exemple de projet utilise un déclencheur de minuteur :

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

API de gestion HTTP

Dans la mesure où il ne présente aucun déclencheur HTTP, le SDK WebJobs ne possède aucune API de gestion HTTP.

Dans un projet de kit de développement logiciel (SDK) WebJobs, vous pouvez appeler des méthodes sur l’objet du client d’orchestration au lieu d’envoyer des requêtes HTTP. Les méthodes suivantes correspondent aux trois tâches pouvant être effectuées avec l’API de gestion HTTP :

  • GetStatusAsync
  • RaiseEventAsync
  • TerminateAsync

La fonction du client d’orchestration de l’exemple de projet démarre la fonction d’orchestration, puis entre dans une boucle qui appelle GetStatusAsync toutes les 2 secondes :

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

Exécution de l'exemple

Vous avez configuré Durable Functions pour s’exécuter en tant que WebJob, et comprenez en quoi cela diffère d'une exécution de Durable Functions dans le contexte autonome d'Azure Functions. À ce stade, examinez son fonctionnement dans un exemple peut être utile.

Cette section fournit une vue d’ensemble de l’exécution de l’exemple de projet. Pour obtenir des instructions détaillées sur la méthode d’exécution en local du projet SDK WebJobs et son déploiement sur une tâche web Azure, consultez la section Prise en main du kit de développement logiciel (SDK) WebJobs.

Exécution locale

  1. Assurez-vous que l’émulateur de stockage est en cours d’exécution (consultez les Prérequis).

  2. Si vous souhaitez afficher les fichiers journaux d’activité dans Application Insights lorsque vous exécutez le projet en local :

    a. Créez une ressource Application Insights et utilisez le type d'application Général.

    b. Enregistrez la clé d’instrumentation dans le fichier App.config.

  3. Exécutez le projet.

Exécuter dans Azure

  1. Créez une application web et un compte de stockage.

  2. Dans l’application web, enregistrez les informations de connexion de stockage dans un paramètre d’application nommé AzureWebJobsStorage. Pour bénéficier du niveau de sécurité le plus élevé, nous vous recommandons d’utiliser une connexion d’identité managée à votre compte de stockage.

  3. Créez une ressource Application Insights et utilisez le type d'application Général.

  4. Enregistrez la clé d’instrumentation dans un paramètre d’application nommé APPINSIGHTS_INSTRUMENTATIONKEY.

  5. Déployer le projet en tant qu’objet WebJob.

SDK WebJobs 3.x

Cet article vous explique comment développer un projet de kit de développement logiciel (SDK) WebJobs 2.x. Si vous développez un projet de kit de développement logiciel (SDK) WebJobs 3.x, cette section vous aidera à comprendre les différences.

Le principal changement introduit est l’utilisation de .NET Core au lieu de .NET Framework. Pour créer un projet de kit de développement logiciel (SDK) WebJobs 3.x, les instructions demeurent identiques, aux exceptions suivantes :

  1. Créez une application console .NET Core. Dans la boîte de dialogue Nouveau Projet Visual Studio, sélectionnez .NET Core>Application console (.NET Core). Le fichier de projet spécifie que l’élément TargetFramework est défini sur netcoreapp2.x.

  2. Choisissez la version du kit de développement logiciel (SDK) WebJobs 3.x des packages suivants :

    • Microsoft.Azure.WebJobs.Extensions
    • Microsoft.Azure.WebJobs.Extensions.Storage
    • Microsoft.Azure.WebJobs.Logging.ApplicationInsights
  3. Définissez la chaîne de connexion de stockage et la clé d’instrumentation Application Insights dans un fichier appsettings.json, à l’aide de l’infrastructure de configuration .NET Core. Voici un exemple :

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

    Important

    Pour bénéficier du niveau de sécurité le plus élevé, nous vous recommandons d’utiliser une connexion d’identité managée à votre compte de stockage. Pour plus d’informations, consultez Guide pratique pour utiliser des identités managées avec App Service et Azure Functions.

  4. Pour ce faire, modifiez le code de la méthode Main. Voici un exemple :

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

Étapes suivantes

Pour plus d’informations sur le SDK WebJobs, consultez la section How to use the WebJobs SDK (Utilisation du Kit de développement logiciel (SDK) WebJobs).