Déclencheur de file d’attente

Effectué

Une file d’attente de messages est un composant logiciel qui est utilisé pour gérer les messages entre les processus, les threads ou les applications. Une file d’attente peut stocker un message, et les workers peuvent récupérer au moment opportun.

Dans le cloud, les files d’attente de messages peuvent générer des événements avec une charge utile. Un service comme Azure Functions peut écouter ce type de message et exécuter son code lorsqu’un message est publié.

Utiliser des files d’attente de messages

Pour qu’une fonction Azure puisse consommer un message à partir d’une file d’attente de messages, elle a besoin d’un déclencheur et éventuellement d’une liaison.

Une fonction Azure doit écouter une file d’attente spécifique pour que son code soit déclenché lors de la publication d’un nouveau message sur cette file d’attente. Pour configurer un déclencheur, vous devez fournir les informations d’identification appropriées afin que le code du déclencheur sache comment se connecter à la file d’attente de messages. Vous créez une entrée dans le fichier function.json pour la fonction qui écoute la file d’attente. Dans l’élément bindings, spécifiez ces propriétés sur une entrée :

Propriété Valeur
name Nom auquel vous pouvez vous référer dans le code
type queueTrigger
direction in
queueName La file d’attente appelée
connection Une variable de configuration dans local.settings.json

Un exemple d’entrée peut être défini comme suit :

{
    "name": "myQueueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName": "messages-incoming",
    "connection": "AzureWebJobsStorage"
  }

Si cette file d’attente se trouve sur un compte de stockage, la valeur AzureWebJobsStorage est la valeur de la chaîne de connexion.

Vous n’avez pas strictement besoin d’une liaison lors de la consommation d’un message à partir d’une file d’attente. Toutefois, si vous souhaitez écrire dans une file d’attente, vous avez besoin d’une liaison de sortie. Avec une telle liaison, vous pouvez obtenir une référence à la file d’attente souhaitée.

Notes

Actuellement, seules les liaisons de sortie sont prises en charge pour les files d’attente.

Développer en local

En tant que développeur, vous souhaitez des cycles de retours courts. Vous souhaitez également vous assurer que votre expérience de développement est aussi proche que possible d’un environnement de production. Pour atteindre ces deux objectifs, vous pouvez utiliser un émulateur de file d’attente.

Un émulateur de file d’attente vous permet de simuler des messages de file d’attente réels auxquels votre fonction Azure peut répondre. Pour utiliser l’émulateur :

  1. Installez l’émulateur. Recherchez Azurite dans Visual Studio Code, ou téléchargez l’extension Azurite.

  2. Pour utiliser la fonctionnalité d’émulateur, démarrez-la en sélectionnant Azure : démarrer le service de file d’attente dans la palette de commandes.

    L’exécution de cette commande démarre un écouteur appelé Explorateur Stockage Azure qu’une autre application peut sélectionner. L’Explorateur Stockage est une application cliente qui vous permet de parcourir vos ressources cloud et d’utiliser les fonctionnalités de l’émulateur.

  3. Téléchargez l’Explorateur Stockage Azure. Ouvrez ensuite l’application, et vous verrez l’indication suivante que l’émulateur fonctionne :

    Screenshot that shows the emulator in Azure Storage Explorer.

  4. Créez une file d’attente sur l’émulateur. Vous utiliserez cette file d’attente dans le cadre de la configuration du point de terminaison de la fonction. En cliquant avec le bouton droit sur l’élément de file d’attente, vous pouvez créer une nouvelle file d’attente.

  5. Pour vous assurer que votre application Functions utilise l’émulateur, vous devez définir la chaîne de connexion correctement. Ouvrez local.settings.json, localisez l’élément AzureWebJobsStorage et attribuez-lui la valeur "UseDevelopmentStorage=true".

    Notes

    N’oubliez pas de définir cette propriété différemment lorsque vous passez au cloud. Elle doit pointer vers une ressource réelle sur Azure en production.

Création de la fonction

Vous disposez maintenant d’un émulateur local configuré et d’une file d’attente. Vous avez également configuré votre projet de façon à ce qu’il pointe vers l’émulateur local. Vous devez maintenant créer une fonction pour gérer un déclencheur de file d’attente.

Créer un point de terminaison de fonction

Vous êtes prêt à créer une fonction qui peut gérer les messages de file d’attente entrants. Créez un dossier pour votre fonction et nommez-le, par exemple queueTrigger. Créez ensuite un fichier function.json et donnez-lui le contenu suivant :

{
  "bindings": [{
    "name" "queueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName" : "items",
    "connection": "AzureWebJobsStorage"
  }]
}

La valeur de l’élément name est importante, car vous y ferez référence plus tard dans votre code pour analyser les données entrantes à partir de la file d’attente. La valeur doit être de type queueTrigger afin que la file d’attente la déclenche lorsqu’il y a un nouveau message.

L’élément queueName identifie de façon unique la file d’attente avec laquelle vous interagissez. La valeur que vous entrez ici doit correspondre au nom de la file d’attente dans l’émulateur ou au nom que vous lui donnez ultérieurement dans Azure.

L’élément connection pointe sur la valeur de l’élément AzureWebJobsStorage dans local.settings.json.

Gérer un message de file d’attente

Pour gérer un message de file d’attente entrant, vous devez écrire du code qui peut analyser le message dont vous avez besoin. À ce stade, vous pouvez décider de ce qu’il faut faire ensuite. Par exemple, vous pouvez démarrer une requête web, placer ce message dans une autre file d’attente ou envoyer le message à une base de données.

Configurer un itinéraire

Vous avez besoin d’un itinéraire pour gérer les requêtes entrantes. Azure Functions gérera les requêtes dans une file d’attente à la racine. Quand vous configurez un itinéraire comme suit, votre requête est appelée en tant que http://localhost:<port>/queueTrigger :

http.HandleFunc("/queueTrigger", handleQueueTrigger)

Décoder une requête

Lorsque le message de la file d’attente vous est envoyé, sa forme est la suivante :

{
  "Data": {
    "queueItem": "your message"
  },
  "Metadata": {
    "DequeueCount": 1,
    "ExpirationTime": "2019-10-16T17:58:31+00:00",
    "Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
    "InsertionTime": "2019-10-09T17:58:31+00:00",
    "NextVisibleTime": "2019-10-09T18:08:32+00:00",
    "PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
    "sys": {
      "MethodName": "QueueTrigger",
      "UtcNow": "2019-10-09T17:58:32.2205399Z",
      "RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
    }
  }
}

Dans le cadre du décodage de cette requête entrante, vous avez besoin d’une structure d’assistance qui modélise le message précédent. Il doit se présenter comme suit :

type InvokeRequest {
   Data map[string]json.RawMessage
   Metadata map[string]interface{}
}

Commencez à écrire du code pour récupérer cette requête entrante et la décoder :

func handleQueueTrigger(w http.ResponseWrite, r *http.Request) {
   var invokeRequest InvokeRequest
   d := json.NewDecoder(r.Body)
   d.Decode(&invokeRequest)
}

Vous êtes maintenant à un stade où la requête a été décodée, mais vous devez encore analyser le message de la file d’attente.

Analyser un message de file d’attente

Une fois la requête décodée, votre message de file d’attente peut être récupéré à partir de la requête sur la propriété Data. Vous devez également faire référence au message en fonction de la valeur de la propriété name que vous avez configurée dans le fichier function.json. Le code permettant de récupérer le message tient sur une seule ligne, comme suit :

invokeRequest.Data["queueItem"]

Étant donné que vous devez être en mesure de lire ce message en texte clair, vous allez utiliser une bibliothèque JSON et l’analyser. La bibliothèque JSON utilise une méthode Unmarshal() qui accepte deux paramètres : le message à analyser et la variable sur laquelle placer le message analysé. Ainsi, votre code doit ressembler à ceci :

var parsedMessage string
json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)

À ce stade, parsedMessage contient votre message. Si vous souhaitez l’imprimer sur la console, utilisez le code suivant :

fmt.Println(parsedMessage) // your message

Notes

Si votre message est plus avancé qu’une chaîne, parsedMessage doit avoir une structure qui correspond à la forme de ce vers quoi queueMessage pointe.

Déclencher un message

Pour tester votre application, vous pouvez utiliser l’Explorateur Stockage Azure. Dans le volet droit de l’outil, sélectionnez le bouton Ajouter un message pour créer un message dans la file d’attente.

Screenshot that shows the button for adding a message on the queue.

Si votre application Functions est exécutée à ce stade, elle déclenchera la liaison et votre code sera appelé.