Wachtrijtrigger

Voltooid

Een berichtenwachtrij is een softwareonderdeel dat wordt gebruikt voor het afhandelen van berichten tussen processen, threads of toepassingen. Een wachtrij kan een bericht opslaan en werknemers kunnen het bericht ophalen wanneer het een goed moment is.

In de cloud kunnen berichtenwachtrijen gebeurtenissen genereren met een nettolading. Een service zoals Azure Functions kan naar een dergelijk bericht luisteren en de bijbehorende code uitvoeren wanneer een bericht wordt gepubliceerd.

Werken met berichtenwachtrijen

Een Azure-functie kan alleen een bericht uit een berichtenwachtrij gebruiken als er een trigger en mogelijk een binding nodig zijn.

Een Azure-functie moet luisteren naar een specifieke wachtrij, zodat de code wordt geactiveerd wanneer een nieuw bericht in die wachtrij wordt gepubliceerd. Als u een trigger wilt instellen, moet u de juiste referenties opgeven, zodat de triggercode weet hoe verbinding moet worden gemaakt met de berichtenwachtrij. U maakt een vermelding in het bestand function.json voor de functie die naar de wachtrij luistert. Geef in het bindings element deze eigenschappen op voor een vermelding:

Eigenschappen Waarde
name Een naam waarnaar u in code kunt verwijzen
type queueTrigger
direction in
queueName Wat de wachtrij wordt genoemd
connection Een configuratievariabele in local.settings.json

Een voorbeeldvermelding kan als volgt worden gedefinieerd:

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

Als deze wachtrij zich in een opslagaccount bevindt, is de AzureWebJobsStorage waarde de waarde van de verbindingsreeks.

U hebt geen binding nodig wanneer u een bericht uit een wachtrij gebruikt. Als u echter naar een wachtrij wilt schrijven, hebt u een uitvoerbinding nodig. Met een dergelijke binding krijgt u een verwijzing naar de beoogde wachtrij.

Notitie

Momenteel worden alleen uitvoerbindingen ondersteund voor wachtrijen.

Lokaal ontwikkelen

Als ontwikkelaar wilt u korte feedbackcycli. U wilt er ook voor zorgen dat uw ontwikkelaarservaring zo dicht mogelijk bij een productieomgeving ligt. Een manier om beide doelstellingen te bereiken, is door gebruik te maken van een wachtrijemulator.

Met een wachtrijemulator kunt u echte wachtrijberichten simuleren waarop uw Azure-functie reageert. De emulator gebruiken:

  1. Installeer de emulator. Zoek naar Azurite in Visual Studio Code of download de Azurite-extensie.

  2. Als u de emulatorfunctionaliteit wilt gebruiken, start u deze door Azure: Queue Service starten in het opdrachtenpalet te selecteren.

    Als u deze opdracht uitvoert, wordt een listener met de naam Azure Storage Explorer gestart waarmee een andere toepassing kan worden opgehaald. Storage Explorer is een clienttoepassing waarmee u door uw cloudresources kunt bladeren en de emulatorfunctionaliteit kunt gebruiken.

  3. Download Azure Storage Explorer. Open vervolgens de toepassing en u ziet de volgende indicatie dat de emulator werkt:

    Screenshot that shows the emulator in Azure Storage Explorer.

  4. Maak een wachtrij op de emulator. U gebruikt deze wachtrij als onderdeel van het configureren van het functie-eindpunt. Door met de rechtermuisknop op het wachtrijelement te klikken, kunt u een nieuwe wachtrij maken.

  5. Om ervoor te zorgen dat uw Functions-app gebruikmaakt van de emulator, moet u de verbindingsreeks correct instellen. Open local.settings.json, zoek het AzureWebJobsStorage element en geef het de waarde "UseDevelopmentStorage=true".

    Notitie

    Vergeet niet deze eigenschap anders in te stellen wanneer u naar de cloud gaat. Deze moet verwijzen naar een werkelijke resource in Azure wanneer deze in productie is.

De functie bouwen

U hebt nu een lokale emulator ingesteld en er staat een wachtrij op. U hebt uw project ook geconfigureerd om naar de lokale emulator te verwijzen. Nu moet u een functie maken om een wachtrijtrigger af te handelen.

Een functie-eindpunt maken

U bent klaar om een functie te maken waarmee binnenkomende wachtrijberichten kunnen worden verwerkt. Maak een map voor uw functie en geef deze een naam, queueTriggerbijvoorbeeld. Maak vervolgens een function.json-bestand en geef het de volgende inhoud:

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

De waarde van het name element is belangrijk, omdat u dit later in uw code zult raadplegen om binnenkomende gegevens uit de wachtrij te parseren. Het moet van het type queueTrigger zijn, zodat de wachtrij deze activeert wanneer er een nieuw bericht is.

Het queueName element identificeert op unieke wijze met welke wachtrij u werkt. Wat u hier invoert, moet overeenkomen met wat u de wachtrij noemt in de emulator of wat u later uw werkelijke wachtrij in Azure noemt.

Het connection element verwijst naar de waarde van het AzureWebJobsStorage element in local.settings.json.

Een wachtrijbericht verwerken

Als u een binnenkomend wachtrijbericht wilt verwerken, moet u code schrijven waarmee het bericht dat u nodig hebt, kan worden geparseerd. Op dat moment kunt u beslissen wat u vervolgens moet doen. U kunt bijvoorbeeld een webaanvraag starten, dat bericht in een andere wachtrij plaatsen of het bericht naar een database verzenden.

Een route instellen

U hebt een route nodig om binnenkomende aanvragen te verwerken. Azure Functions verwerkt aanvragen naar een wachtrij in de hoofdmap. Wanneer u als volgt een route instelt, wordt uw aanvraag aangeroepen als http://localhost:<port>/queueTrigger:

http.HandleFunc("/queueTrigger", handleQueueTrigger)

Een aanvraag decoderen

Wanneer het wachtrijbericht naar u wordt verzonden, heeft dit de volgende shape:

{
  "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"
    }
  }
}

Als onderdeel van het decoderen van die binnenkomende aanvraag hebt u een helperstructuur nodig waarmee het voorgaande bericht wordt gemodelleerd. Dit ziet er als volgt uit:

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

Begin met het schrijven van code om die binnenkomende aanvraag te nemen en deze te decoderen:

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

Nu bent u op een punt waar de aanvraag is gedecodeerd, maar u moet het wachtrijbericht zelf parseren.

Een wachtrijbericht parseren

Nadat de aanvraag is gedecodeerd, kan het wachtrijbericht worden opgehaald uit de aanvraag op de Data eigenschap. U moet ook verwijzen naar het bericht door de name eigenschapswaarde die u hebt ingesteld in het bestand function.json . De code voor het ophalen van het bericht is een one-liner als volgt:

invokeRequest.Data["queueItem"]

Omdat u dit bericht in duidelijke tekst moet kunnen lezen, gebruikt u een JSON-bibliotheek en parseert u het. De JSON-bibliotheek gebruikt een Unmarshal() methode die twee parameters gebruikt: het bericht dat moet worden geparseerd en de variabele waarop het geparseerde bericht moet worden ingesteld. Uw code moet er dus als volgt uitzien:

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

Op dit moment parsedMessage bevat u uw bericht. Als u deze wilt afdrukken naar de console, gebruikt u de volgende code:

fmt.Println(parsedMessage) // your message

Notitie

Als uw bericht iets geavanceerder is dan een tekenreeks, parsedMessage moet u een structuur hebben die overeenkomt met de vorm van wat queueMessage verwijst.

Een bericht activeren

Als u uw toepassing wilt testen, kunt u Azure Storage Explorer gebruiken. Selecteer in het rechterdeelvenster van het hulpprogramma de knop Bericht toevoegen om een bericht in de wachtrij te maken.

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

Als u uw Functions-app hebt en deze op dit moment wordt uitgevoerd, wordt de binding geactiveerd en wordt uw code aangeroepen.