Instradare i messaggi verso diversi argomenti MQTT nei grafici di flusso dati

Alcuni scenari richiedono l'arrivo di messaggi su argomenti MQTT diversi a seconda del contenuto. Ad esempio, le letture dei sensori al di sopra di una soglia critica devono passare a un alerts topic, mentre le letture normali passano a un historian topic. Con i grafici del flusso di dati, è possibile impostare l'argomento di output in modo dinamico, anche se il flusso di dati ha una singola destinazione.

Il routing dinamico dei topic è una tecnica basata sulla map transform: una regola mappa scrive l'argomento di destinazione in metadati del messaggio, e la destinazione pubblica su quell'argomento. Per instradare i messaggi lungo diversi percorsi di elaborazione all'interno del grafo, vedi Filtra, ramifica e unisci dati.

Per una panoramica dei grafici del flusso di dati e della composizione delle trasformazioni in una pipeline, vedere Panoramica dei grafici del flusso di dati.

Prerequisiti

  • Un endpoint del Registro di sistema predefinito denominato default che punta a mcr.microsoft.com viene creato automaticamente durante la distribuzione. Le trasformazioni predefinite usano questo endpoint.

Gli esempi interfaccia della riga di comando di Azure in questo articolo usano variabili di ambiente così puoi impostare ogni valore una volta e poi copiare e incollare i comandi as-is. Se stai usando l'ambiente Operazioni di Azure IoT Codespaces dal quickstart, queste variabili sono già impostate per te e puoi saltare questo passaggio. Altrimenti, imposta le seguenti variabili di ambiente nella tua shell prima di eseguire i comandi.

I seguenti script impostano le variabili di ambiente più comunemente utilizzate:

Variabile di ambiente Description
SUBSCRIPTION_ID L'ID dell'abbonamento che contiene la tua istanza Operazioni di Azure IoT.
RESOURCE_GROUP Il nome del gruppo di risorse che contiene la tua istanza Operazioni di Azure IoT.
AIO_INSTANCE_NAME Il nome della tua istanza Operazioni di Azure IoT. Per elencare le tue istanze, esegui az iot ops list -o table.
CLUSTER_NAME Il nome del cluster Kubernetes abilitato Azure Arc che ospita la tua istanza.
LOCATION La regione Azure da utilizzare per nuove risorse, ad esempio eastus.
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>

Devi solo impostare le variabili utilizzate in questo articolo. Questo articolo potrebbe utilizzare variabili ambientali aggiuntive per i nomi delle risorse che scegli. L'articolo spiega come posizionarli dove vengono introdotti.

Come funziona l'instradamento dinamico degli argomenti

Una trasformazione mappa può scrivere nei metadati dei messaggi, incluso l'argomento MQTT, usando il percorso di output $metadata.topic. Quindi, la destinazione usa la variabile ${outputTopic} per pubblicare in qualsiasi argomento impostato dalla trasformazione.

Due pezzi interagiscono:

  1. All'interno della trasformazione: una regola della mappa scrive un valore stringa in $metadata.topic.
  2. Nella destinazione: il campo dataDestination si riferisce a ${outputTopic}, che viene risolto nel valore scritto dalla trasformazione.

Le trasformazioni utilizzano un linguaggio di espressione per calcolare valori, condizioni di test e campi di riferimento. Le espressioni si riferiscono agli input per posizione, non per nome: il primo input nella inputs lista è $1, il secondo è $2, e così via. Funzioni integrate come cToF convertono e manipolano tali valori.

Per l'elenco completo di operatori, funzioni, tipi di dati e campi di metadati, consulta il riferimento Expressions.

Questo articolo scrive nei metadati dei messaggi. Per i percorsi di metadati che puoi leggere e scrivere, vedi i campi Metadata.

Opzione 1: Instradare con una singola trasformata mappa e un'espressione condizionale

L'approccio più semplice utilizza una trasformazione della mappa con un'espressione if che seleziona l'argomento.

Nell'esperienza Operazioni creare un grafico del flusso di dati:

  1. Aggiungere una sorgente che legga da sensors/temperature.
  2. Aggiungere una trasformazione mappa con due regole:
    • Regola di trasmissione diretta con caratteri jolly (input *, output *).
    • Regola di calcolo con input temperature, output $metadata.topiced espressione if($1 > 1000, "alerts", "historian").
  3. Aggiungere una destinazione con l'argomento factory/${outputTopic}.

Quando la trasformazione della mappa scrive "alerts" in $metadata.topic, la destinazione risolve factory/${outputTopic} in factory/alerts.

Opzione 2: Percorso con diramazione, mappe per percorso e un'immergibile

Se sono necessarie trasformazioni diverse in ogni percorso (non solo in un argomento diverso), usare una trasformazione di diramazione per suddividere il flusso, una trasformazione di mappatura in ogni ramo per impostare l'argomento e applicare regole specifiche del percorso e una trasformazione di concatenazione per unire i percorsi.

Nell'esperienza operativa:

  1. Aggiungere una sorgente che legga da sensors/temperature.
  2. Aggiungere una trasformazione di ramo con condizione $1 > 1000 nel temperature campo.
  3. Nel percorso true aggiungere una trasformazione mappa con un pass-through con caratteri jolly e una regola che imposta $metadata.topic su "alerts".
  4. Nel percorso false aggiungere una trasformazione mappa con un pass-through con caratteri jolly e una regola che imposta $metadata.topic su "historian".
  5. Aggiungere una trasformazione concatenata per unire entrambi i percorsi.
  6. Aggiungere una destinazione con l'argomento factory/${outputTopic}.

Scegli tra una singola trasformazione della mappa e un ramo

Considerazione Opzione 1 (singola mappa) Opzione 2 (ramo + mappe)
Semplicità Meno nodi, più semplice da leggere Altri nodi, più espliciti
Indirizzamento basato su argomenti Ideal Funziona, ma più configurazione del necessario
Trasformazioni diverse per percorso È possibile con if() annidato, diventa complesso. Naturale: ogni ramo ha regole di mappa proprie
Aggiunta di altri percorsi Chiamate a catena if() Richiede rami annidati

Per semplificare il routing degli argomenti in base a una singola condizione, l'opzione 1 è più semplice. Usare l'opzione 2 quando ogni percorso richiede un'elaborazione diversa rispetto al nome dell'argomento.

Come la variabile outputTopic risolve l'argomento di destinazione

La ${outputTopic} variabile in dataDestination viene risolta nel valore completo di $metadata.topic come impostato dall'ultima trasformazione nella pipeline. È anche possibile usare segmenti con ${outputTopic.N} (1 indicizzato). Ad esempio, se la trasformazione imposta $metadata.topic su "region/west":

dataDestination Argomento risolto
factory/${outputTopic} factory/region/west
factory/${outputTopic.1} factory/region
factory/${outputTopic.2} factory/west

Se il flusso di dati non riesce a risolvere la variabile topic (ad esempio, $metadata.topic non è mai stata impostata), lascia cadere il messaggio e registra un errore.