Routeer berichten naar verschillende MQTT-onderwerpen in datastroomgrafieken

Voor sommige scenario's moeten berichten binnenkomen op verschillende MQTT-onderwerpen, afhankelijk van hun inhoud. Sensormetingen boven een kritieke drempelwaarde moeten bijvoorbeeld naar een alerts onderwerp gaan, terwijl normale metingen naar een historian onderwerp gaan. Met gegevensstroomgrafieken kunt u het uitvoeronderwerp dynamisch instellen, ook al heeft de gegevensstroom één bestemming.

Dynamische topicrouting is een techniek gebaseerd op de maptransformatie: een mapregel schrijft het doelonderwerp naar de metadata van het bericht, en de bestemming publiceert naar dat onderwerp. Om berichten via verschillende verwerkingspaden binnen de grafiek te routeren, zie Filter, branch en merge data.

Zie Het overzicht van gegevensstroomgrafieken voor een overzicht van gegevensstroomgrafieken en hoe transformaties in een pijplijn worden samengesteld.

Prerequisites

  • Een exemplaar van Azure IoT-bewerkingen geïmplementeerd in een Kubernetes-cluster. Zie Deploy Azure IoT-bewerkingen voor meer informatie.
  • Een standaardregistereindpunt dat naar defaultmcr.microsoft.com verwijst wordt automatisch gemaakt tijdens de implementatie. De ingebouwde transformaties gebruiken dit eindpunt.

De Azure CLI voorbeelden in dit artikel gebruiken omgevingsvariabelen zodat je elke waarde één keer kunt instellen en vervolgens de commando's kunt kopiëren en plakken as-is. Als je de Azure IoT-bewerkingen Codespaces-omgeving vanuit de quickstart gebruikt, zijn deze variabelen al voor je ingesteld en kun je deze stap overslaan. Anders stel je de volgende omgevingsvariabelen in je shell voordat je de commando's uitvoert.

De volgende scripts stellen de meest gebruikte omgevingsvariabelen in:

Omgevingsvariabele Description
SUBSCRIPTION_ID De ID van het abonnement dat je Azure IoT-bewerkingen-instantie bevat.
RESOURCE_GROUP De naam van de resourcegroep die je Azure IoT-bewerkingen-instantie bevat.
AIO_INSTANCE_NAME De naam van je Azure IoT-bewerkingen instance. Om je instanties op te sommen, voer az iot ops list -o tableje .
CLUSTER_NAME De naam van de Azure Arc-enabled Kubernetes-cluster die jouw instantie host.
LOCATION De Azure-regio om te gebruiken voor nieuwe bronnen, bijvoorbeeld eastus.
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>

Je hoeft alleen de variabelen in te stellen die dit artikel gebruikt. Dit artikel kan extra omgevingsvariabelen gebruiken voor de bronnamen die je kiest. Het artikel legt uit hoe je ze op de plek kunt plaatsen waar ze worden geïntroduceerd.

Hoe dynamische topic routing werkt

Een kaarttransformatie kan schrijven naar metagegevens van berichten, inclusief het MQTT-onderwerp, met behulp van het $metadata.topic uitvoerpad. De bestemming gebruikt dan de ${outputTopic} variabele om naar welk onderwerp de transformatieset ook maar ingesteld is, te publiceren.

Twee onderdelen werken samen:

  1. Binnen de transformatie: Een toewijzingsmapregel schrijft een stringwaarde naar $metadata.topic.
  2. In de bestemming: het dataDestination veld verwijst naar ${outputTopic}, wat resulteert in de waarde die de transformatie heeft geschreven.

Transformaties gebruiken een expressietaal om waarden, testvoorwaarden en referentievelden te berekenen. Expressies verwijzen naar invoer op positie, niet op naam: de eerste invoer in de inputs lijst is $1, de tweede is $2, enzovoort. Ingebouwde functies zoals cToF converteren en manipuleren deze waarden.

Voor de volledige lijst van operatoren, functies, datatypes en metadatavelden, zie de referentie Expressions.

Dit artikel schrijft naar de metadata van berichten. Voor de metadatapaden die je kunt lezen en schrijven, zie Metadatavelden.

Optie 1: Route met een enkele map-transformatie en een conditionele expressie

De eenvoudigste benadering maakt gebruik van één kaarttransformatie met een if expressie waarmee het onderwerp wordt gekozen.

Maak in de bewerkingservaring een gegevensstroomgrafiek:

  1. Voeg een bron toe waaruit sensors/temperaturewordt gelezen.
  2. Voeg een kaarttransformatie toe met twee regels:
    • Een passthrough-regel met jokertekens (invoer *, uitvoer *).
    • Een rekenregel met invoer temperature, uitvoer $metadata.topicen expressie if($1 > 1000, "alerts", "historian").
  3. Voeg een bestemming toe met onderwerp factory/${outputTopic}.

Wanneer de kaarttransformatie "alerts" naar $metadata.topic schrijft, wordt factory/${outputTopic} naar de bestemming omgezet in factory/alerts.

Optie 2: Route met een aftakking, per-pad kaarten en een samenvoeging

Als u verschillende transformaties voor elk pad nodig hebt (niet alleen een ander onderwerp), gebruikt u een vertakkingstransformatie om de stroom te splitsen, een kaarttransformatie op elke arm om het onderwerp in te stellen en padspecifieke regels toe te passen en een samenvoegingstransformatie om de paden samen te voegen.

In de operatie-ervaring:

  1. Voeg een bron toe waaruit sensors/temperaturewordt gelezen.
  2. Voeg een vertakkingstransformatie met voorwaarde $1 > 1000 toe aan het temperature veld.
  3. Voeg op het werkelijke pad een kaarttransformatie toe met een jokerteken-passthrough en een regel die wordt ingesteld $metadata.topic op "alerts".
  4. Op het valse pad voeg een map-transformatie toe met een jokerteken-passthrough en een regel die $metadata.topic op "historian" instelt.
  5. Voeg een samenvoegingstransformatie toe om beide paden samen te voegen.
  6. Voeg een bestemming toe met onderwerp factory/${outputTopic}.

Kies tussen een enkele maptransformatie en een branch

Consideratie Optie 1 (één kaart) Optie 2 (branch + kaarten)
Eenvoud Minder knooppunten, eenvoudiger te lezen Meer knooppunten, explicieter
Routering met alleen onderwerp Ideal Werkt, maar meer setup dan nodig is
Verschillende transformaties per pad Mogelijk met geneste if(), maar het wordt wel ingewikkeld. Natuurlijke: iedere vertakking heeft zijn eigen kaartregels
Meer paden toevoegen Ketenoproepen if() Vereist geneste vertakkingen

Voor eenvoudige onderwerproutering op basis van één voorwaarde is optie 1 eenvoudiger. Gebruik optie 2 wanneer elk pad een andere verwerking nodig heeft dan de onderwerpnaam.

Hoe de outputTopic-variabele het bestemmingsonderwerp oplost

De ${outputTopic} variabele in dataDestination wordt omgezet in de volledige waarde van $metadata.topic zoals ingesteld door de laatste transformatie in de pijplijn. U kunt segmenten ook gebruiken met ${outputTopic.N} (1 geïndexeerd). Als de transformatie bijvoorbeeld $metadata.topic naar "region/west" transformeert:

dataDestination Opgelost onderwerp
factory/${outputTopic} factory/region/west
factory/${outputTopic.1} factory/region
factory/${outputTopic.2} factory/west

Als de datastroom de topicvariabele niet kan oplossen (bijvoorbeeld $metadata.topic nooit is ingesteld), laat het het bericht vallen en registreert een foutmelding.