Importante
Questa pagina include istruzioni per la gestione dei componenti Azure IoT Operations usando i manifesti di distribuzione kubernetes, disponibile in ANTEPRIMA. Questa funzionalità viene fornita con diverse limitazioni e non deve essere usata per i carichi di lavoro di produzione.
Consultare i Termini supplementari di utilizzo per le anteprime di Microsoft Azure per i termini legali applicabili alle funzionalità di Azure in versione beta, anteprima o non ancora rilasciate in versione generale.
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.
Come funziona
Una trasformazione mappa può scrivere nei metadati dei messaggi, incluso l'argomento MQTT, usando il $metadata.topic percorso di output. Quindi, la destinazione usa la variabile ${outputTopic} per pubblicare in qualsiasi argomento impostato dalla trasformazione.
Due pezzi interagiscono:
-
All'interno della trasformazione: una regola della mappa scrive un valore stringa in
$metadata.topic.
-
Nella destinazione: il campo
dataDestination si riferisce a ${outputTopic}, che viene risolto nel valore scritto dalla trasformazione.
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:
- Aggiungere una sorgente che legga da
sensors/temperature.
- 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").
- 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.
resource dataflowGraph 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflowGraphs@2025-10-01' = {
name: 'dynamic-topic-routing'
parent: dataflowProfile
properties: {
profileRef: dataflowProfileName
mode: 'Enabled'
nodes: [
{
nodeType: 'Source'
name: 'sensors'
sourceSettings: {
endpointRef: 'default'
dataSources: [ 'sensors/temperature' ]
}
}
{
nodeType: 'Graph'
name: 'route-by-temperature'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"map":[{"inputs":["*"],"output":"*"},{"description":"Set topic based on temperature threshold","inputs":["temperature"],"output":"$metadata.topic","expression":"if($1 > 1000, \\"alerts\\", \\"historian\\")"}]}'
}
]
}
}
{
nodeType: 'Destination'
name: 'output'
destinationSettings: {
endpointRef: 'default'
dataDestination: 'factory/${outputTopic}'
}
}
]
nodeConnections: [
{ from: { name: 'sensors' }, to: { name: 'route-by-temperature' } }
{ from: { name: 'route-by-temperature' }, to: { name: 'output' } }
]
}
}
apiVersion: connectivity.iotoperations.azure.com/v1
kind: DataflowGraph
metadata:
name: dynamic-topic-routing
namespace: azure-iot-operations
spec:
profileRef: default
nodes:
- nodeType: Source
name: sensors
sourceSettings:
endpointRef: default
dataSources:
- sensors/temperature
- nodeType: Graph
name: route-by-temperature
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"map": [
{
"inputs": ["*"],
"output": "*"
},
{
"description": "Set topic based on temperature threshold",
"inputs": ["temperature"],
"output": "$metadata.topic",
"expression": "if($1 > 1000, \"alerts\", \"historian\")"
}
]
}
- nodeType: Destination
name: output
destinationSettings:
endpointRef: default
dataDestination: "factory/${outputTopic}"
nodeConnections:
- from: { name: sensors }
to: { name: route-by-temperature }
- from: { name: route-by-temperature }
to: { name: output }
Opzione 2: Diramarsi, mappare ogni percorso e unire i rami
Se sono necessarie trasformazioni diverse in ogni percorso (non solo un argomento diverso), usare una trasformazione di ramo per suddividere il flusso, una trasformazione mappa 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:
- Aggiungere una sorgente che legga da
sensors/temperature.
- Aggiungere una trasformazione di ramo con condizione
$1 > 1000 nel temperature campo.
- Nel percorso true aggiungere una trasformazione mappa con un pass-through con caratteri jolly e una regola che imposta
$metadata.topic su "alerts".
- Nel percorso false aggiungere una trasformazione mappa con un pass-through con caratteri jolly e una regola che imposta
$metadata.topic su "historian".
- Aggiungere una trasformazione concat per unire entrambi i percorsi.
- Aggiungere una destinazione con l'argomento
factory/${outputTopic}.
resource dataflowGraph 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflowGraphs@2025-10-01' = {
name: 'dynamic-topic-routing-branched'
parent: dataflowProfile
properties: {
profileRef: dataflowProfileName
mode: 'Enabled'
nodes: [
{
nodeType: 'Source'
name: 'sensors'
sourceSettings: {
endpointRef: 'default'
dataSources: [ 'sensors/temperature' ]
}
}
{
nodeType: 'Graph'
name: 'check-temperature'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-branch:1.0.0'
configuration: [
{
key: 'rules'
value: '{"branch":{"inputs":["temperature"],"expression":"$1 > 1000","description":"Route critical temperatures to alerts"}}'
}
]
}
}
{
nodeType: 'Graph'
name: 'set-alerts-topic'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"map":[{"inputs":["*"],"output":"*"},{"inputs":[],"output":"$metadata.topic","expression":"\\"alerts\\""}]}'
}
]
}
}
{
nodeType: 'Graph'
name: 'set-historian-topic'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-map:1.0.0'
configuration: [
{
key: 'rules'
value: '{"map":[{"inputs":["*"],"output":"*"},{"inputs":[],"output":"$metadata.topic","expression":"\\"historian\\""}]}'
}
]
}
}
{
nodeType: 'Graph'
name: 'merge'
graphSettings: {
registryEndpointRef: 'default'
artifact: 'azureiotoperations/graph-dataflow-concatenate:1.0.0'
}
}
{
nodeType: 'Destination'
name: 'output'
destinationSettings: {
endpointRef: 'default'
dataDestination: 'factory/${outputTopic}'
}
}
]
nodeConnections: [
{ from: { name: 'sensors' }, to: { name: 'check-temperature' } }
{ from: { name: 'check-temperature.output.true' }, to: { name: 'set-alerts-topic' } }
{ from: { name: 'check-temperature.output.false' }, to: { name: 'set-historian-topic' } }
{ from: { name: 'set-alerts-topic' }, to: { name: 'merge' } }
{ from: { name: 'set-historian-topic' }, to: { name: 'merge' } }
{ from: { name: 'merge' }, to: { name: 'output' } }
]
}
}
apiVersion: connectivity.iotoperations.azure.com/v1
kind: DataflowGraph
metadata:
name: dynamic-topic-routing-branched
namespace: azure-iot-operations
spec:
profileRef: default
nodes:
- nodeType: Source
name: sensors
sourceSettings:
endpointRef: default
dataSources:
- sensors/temperature
- nodeType: Graph
name: check-temperature
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-branch:1.0.0
configuration:
- key: rules
value: |
{
"branch": {
"inputs": ["temperature"],
"expression": "$1 > 1000",
"description": "Route critical temperatures to alerts"
}
}
- nodeType: Graph
name: set-alerts-topic
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"map": [
{ "inputs": ["*"], "output": "*" },
{ "inputs": [], "output": "$metadata.topic", "expression": "\"alerts\"" }
]
}
- nodeType: Graph
name: set-historian-topic
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-map:1.0.0
configuration:
- key: rules
value: |
{
"map": [
{ "inputs": ["*"], "output": "*" },
{ "inputs": [], "output": "$metadata.topic", "expression": "\"historian\"" }
]
}
- nodeType: Graph
name: merge
graphSettings:
registryEndpointRef: default
artifact: azureiotoperations/graph-dataflow-concatenate:1.0.0
- nodeType: Destination
name: output
destinationSettings:
endpointRef: default
dataDestination: "factory/${outputTopic}"
nodeConnections:
- from: { name: sensors }
to: { name: check-temperature }
- from: { name: check-temperature.output.true }
to: { name: set-alerts-topic }
- from: { name: check-temperature.output.false }
to: { name: set-historian-topic }
- from: { name: set-alerts-topic }
to: { name: merge }
- from: { name: set-historian-topic }
to: { name: merge }
- from: { name: merge }
to: { name: output }
Quale opzione scegliere
| 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 l'annidato if(), 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.
Dettagli della traduzione degli argomenti
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 la variabile dell'argomento non può essere risolta (ad esempio, $metadata.topic non è mai stata impostata), il messaggio viene eliminato e viene registrato un errore.
Passaggi successivi