Daten in Datenflussdiagrammen drosseln

Eine Throttle-Transformation begrenzt, wie oft sie Nachrichten zu einem MQTT-Thema weiterleitet. Anstatt Nachrichten basierend auf ihrem Inhalt zu löschen, wirft die Throttle-Transformation Nachrichten basierend darauf, wann sie sie verarbeitet, und leitet höchstens eine Nachricht pro Thema-Muster innerhalb jedes konfigurierten Intervalls weiter. Verwenden Sie Drosselung, um nachgelagerte Systeme vor stoßweise auftretenden oder hochfrequenten Quellen zu schützen, ohne den Nachrichteninhalt zu ändern.

Eine Übersicht über Datenflussdiagramme und die Art und Weise, wie Transformationen in einer Pipeline erstellt werden, finden Sie in der Übersicht über Datenflussdiagramme.

Prerequisites

  • Eine Instanz von Azure IoT Einsatz, die in einem Kubernetes-Cluster bereitgestellt wird. Weitere Informationen finden Sie unter Deploy Azure IoT Einsatz.
  • Die Bereitstellung erstellt automatisch einen Standard-Registry-Endpunkt namens default , der auf mcr.microsoft.comverweist. Die integrierten Transformationen verwenden diesen Endpunkt.

Skalierungsbeschränkung für zustandsbehaftete Diagramme

Important

Fenster- und Drosselungs-Transformationen sind zustandsbehaftet. Jede Instanz behält ihren eigenen Zustand, und Instanzen teilen diesen Zustand nicht miteinander. Wenn die Anzahl der Instanzen im Datenflussprofil größer als eins ist, verteilen Sie Nachrichten aus gemeinsamen Abonnements über die Instanzen, sodass jede Instanz nur eine Teilmenge der Nachrichten sieht. Eine Fenstertransformation berechnet dann Aggregationen wie Durchschnitte, Summen und Zählungen über einen partiellen Datensatz, und eine Throttle-Transformation setzt die konfigurierte Ratenbegrenzung unabhängig in jeder Instanz durch, anstatt über die gesamte Pipeline hinweg.

Setze die Anzahl der Datenflussprofil-Instanzen für jeden Datenflussgraphen, der eine Fenster- oder Drosselungs-Transformation verwendet, auf 1. Zustandslose Datenflussgraphen, die ausschließlich Mapping-, Filter-, Verzweigungs- und Concatenate-Transformationen verwenden, können sicher höhere Instanzzahlen nutzen, um den Durchsatz zu erhöhen.

Wie die Gashebeltransformation funktioniert

Die Drosselungstransformation bewertet das Thema jeder eingehenden Nachricht anhand einer geordneten Liste von Regeln pro Thema:

  • Der Gewinner ist derjenige, der das erste Spiel gewinnt. Die Transformation bewertet die Regeln in der Reihenfolge. Die erste Regel, deren topic Muster mit dem Thema der Nachricht übereinstimmt, bestimmt, ob die Transformation die Nachricht weiterleitet. Die Transformation prüft spätere Regeln nicht, selbst wenn sie ebenfalls übereinstimmen würden.
  • Nicht übereinstimmende Themen werden durchgelassen. Wenn keine Regel mit dem Thema der Nachricht übereinstimmt, leitet die Transformation die Nachricht ohne Throttling weiter.
  • Die Weiterleitung erfolgt zeitbasiert, nicht zählbasiert. Bei einer abgestimmten Regel leitet die Transformation die erste von ihr verarbeitete Nachricht weiter und lässt dann jede nachfolgende Nachricht in diesem Muster fallen, bis das konfigurierte Intervall (1000 / maxMessagesPerSecond Millisekunden, aufgerundet) seit der letzten weitergeleiteten Nachricht verstrichen ist. Dieses Verhalten begrenzt die maximale Rate, erlaubt aber keine Bursts, um frühere Drops auszugleichen.
  • Gemeinsamer Zustand pro Muster, nicht pro Topic. Wenn das topic-Muster einer Regel einen Platzhalter verwendet, teilen alle konkreten Themen, die ihr entsprechen, innerhalb einer Transformationsinstanz denselben Drosselungszustand. Zum Beispiel begrenzt eine einzelne sensors/+ Regel die kombinierte Rate über sensors/temperature und sensors/humidity, nicht jede einzelne unabhängig voneinander.
  • 0 lässt alles fallen. Das Festlegen von maxMessagesPerSecond auf 0 für eine Regel verwirft jede Nachricht, die dem Muster dieser Regel entspricht.
  • Das Timing basiert auf der Bearbeitungszeit, nicht auf dem Inhalt der Nachrichten. Die Transformation verwendet ihre monotone Uhr, wenn sie jede Nachricht verarbeitet. Es liest kein Zeitstempelfeld aus dem Message-Payload.

Note

Die Drosselungsrtansformation legt lediglich fest, ob eine Nachricht weitergeleitet oder verworfen wird. Sie verändert den Inhalt der Nachrichten nie.

Konfiguriere die Drosselregeln pro Thema

Definiere Drosselregeln im Konfigurationsschlüssel throttle (nicht rules) als JSON-Objekt mit einem perTopicThrottles Array.

In der Drosselungstransformationskonfiguration fügen Sie eine oder mehrere Drosselungsregeln hinzu. Geben Sie für jede Regel Folgendes an:

Setting Description
Topic Das abzugleichende MQTT-Topic-Muster. Unterstützt die Platzhalter + (eine Ebene) und # (mehrere Ebenen).
Maximal Nachrichten pro Sekunde Die maximale Weiterleitungsrate für Themen, die diesem Muster entsprechen. Auf 0 setzen, um alle passenden Nachrichten zu verwerfen.

Mit dieser Regel leitet die Transformation die erste sensors/temperature von ihr verarbeitete Nachricht weiter und entfernt dann alle weiteren Nachrichten zu diesem Thema, die sie weniger als 100 Millisekunden später verarbeitet (1000 / 10). Diese Regel betrifft keine anderen Themen als sensors/temperature.

Jeder Eintrag in perTopicThrottles besitzt folgende Eigenschaften:

Eigentum Erforderlich Description
topic Yes Das MQTT-Themenmuster passt dazu. Unterstützt die Platzhalter + (eine Ebene) und # (mehrere Ebenen).
maxMessagesPerSecond Yes Maximale Weiterleitungsrate für Themen, die diesem Muster entsprechen, in Nachrichten pro Sekunde. Die Transformation erlaubt Bruchwerte. Zum Beispiel 0.1 erlaubt eine Nachricht alle 10 Sekunden. Muss null oder eine positive, endliche Zahl sein. Setzen Sie dies auf 0, um alle Nachrichten zu verwerfen, die dem Muster entsprechen. Timing hat eine Genauigkeit von 1 Millisekunde, sodass Werte größer als 1000 denselben effektiven Grenzwert wie 1000haben.

Important

Jedes topic-Muster in perTopicThrottles muss eindeutig sein. Die Transformation lehnt das Konfigurieren derselben Musterzeichenfolge während der Initialisierung mehrmals ab.

Verwenden Sie mehrere Regeln pro Thema

Da die Transformation die Regeln der Reihe nach bewertet und der erste Treffer gilt, listen Sie spezifischere Muster auf, bevor Sie allgemeinere auflisten, wenn Sie möchten, dass sie ein eigenes Rate-Limit haben:

Fügen Sie zwei Regeln hinzu, in folgender Reihenfolge:

Bestellung Thema Maximal Nachrichten pro Sekunde
1 sensors/temperature 10
2 sensors/# 1

Nachrichten auf sensors/temperature entsprechen der ersten Regel und sind auf 10 Nachrichten pro Sekunde begrenzt. Nachrichten zu einem anderen sensors/* Thema (zum Beispiel sensors/humidity) entsprechen der zweiten Regel und teilen sich ein kombiniertes Limit von 1 Nachricht pro Sekunde.

Important

Die Reihenfolge ist wichtig. Wenn die sensors/#-Regel zuerst aufgeführt würde, würde sie auch auf sensors/temperature-Nachrichten passen, und die Transformation würde nie die spezifischere Regel erreichen.

Themengruppen mittels Platzhalter drosseln

Das Muster topic unterstützt dieselben Wildcards wie MQTT-Themenfilter:

Platzhalter Übereinstimmungen Beispiel
+ Genau eine Themenebene sensors/+/status entspricht sensors/line1/status, aber nicht sensors/line1/sub/status
# Null oder mehr verbleibende Themenstufen, muss das letzte Segment sein sensors/# entspricht sensors, sensors/temperatureund sensors/line1/temperature

Alle konkreten Themen, die derselben Platzhalterregel entsprechen, teilen sich einen Drosselungszustand.

Füge eine Regel mit Thema sensors/+ hinzu und maximiere Nachrichten pro Sekunde 1.

Mit dieser Regel werden eine Nachricht auf sensors/temperature und eine Nachricht auf sensors/humidity, die im Abstand von 500 Millisekunden verarbeitet werden, nicht beide weitergeleitet – die zweite wird verworfen, weil sie auf dasselbe gemeinsame 1‑Sekunden‑Intervall wie die erste angerechnet wird, unabhängig davon, zu welchem konkreten Topic sie gehört.

Note

Ein nacktes # Muster passt zu jedem Thema und wendet innerhalb jeder Transformationsinstanz eine einheitliche kombinierte Ratenbegrenzung an.

Alle Nachrichten zu einem Thema verwerfen

Setze maxMessagesPerSecond auf 0 so, dass jede Nachricht, die einem Muster entspricht, droppt, ohne die Regel oder das Thema aus deiner Pipeline zu entfernen:

Füge eine Regel mit Thema debug/# hinzu und maximiere Nachrichten pro Sekunde 0.

Ein Datenflussdiagramm mit Drosselung bereitstellen

Um End-to-End-Throttling anzuwenden, sollte ein Datenflussgraph bereitgestellt werden, der eine Quelle, eine Throttle-Transformation und ein Ziel verbindet. Verwenden Sie das Tool, das zu Ihrem Arbeitsablauf passt.

Erstellen Sie in der Betriebsumgebung ein Datenflussdiagramm mit einer Drosselungstransformation:

  1. Fügen Sie eine Quelle hinzu, die aus Ihrem MQTT-Topic gelesen wird.
  2. Fügen Sie eine Gaspedal-Transformation hinzu. Füge pro Thema eine oder mehrere Regeln hinzu, von den am wenigsten bis am wenigsten spezifischen.
  3. Fügen Sie ein Ziel hinzu, das an Ihr Ausgabe-Topic sendet.

Beispiel: Höchstens zwei Nachrichten pro Sekunde weiterleiten

Dieses Beispiel reduziert einen Strom von 10 Nachrichten pro Sekunde auf höchstens 2. Weitergeleitete Nachrichten behalten ihren ursprünglichen Inhalt; überschüssige Nachrichten werden weggelassen. Nutze es, wenn du Zwischenwerte verwerfen kannst.

Erfüllen Sie die gemeinsamen Beispielvoraussetzungen, einschließlich des default Profils und factory-mqtt des MQTT-Endpunkts im Namensraum azure-iot-operations . Behalten Sie das Profil auf einer Instanz für die angegebene Rate; jede Instanz behält ihren eigenen Throttle-Zustand.

Diagramm mit zehn Nachrichten pro Sekunde, die in eine Drosselung eingehen, wodurch unveränderte Nachrichten im Abstand von mindestens 500 Millisekunden zum Ziel weiterleitet und die acht überschüssigen Nachrichten in der Beispielsekunde verworfen werden.

Erstellen Sie in der Betriebsumgebung ein Datenflussdiagramm namens rate-limit-telemetry im Profil default:

  1. Füge eine Quelle namens factory-mqtt mit Endpunkt factory/readings und Thema source hinzu.
  2. Fügen Sie die integrierte Drosselungs-Transformation namens throttle hinzu. Füge eine Pro-Topic-Regel mit Thema factory/readings und Maximale Nachrichten pro Sekunde auf 2 gesetzt hinzu.
  3. Fügen Sie ein Ziel namens destination hinzu, mit dem Endpunkt factory-mqtt und dem Thema factory/rate-limited.
  4. Verbinden Sie source mit throttle, dann throttle mit destination. Speichere und aktiviere das Diagramm.

Die Drosselung leitet Nachrichten unverändert mit mindestens 500 Millisekunden Abstand weiter und verwirft überschüssige Nachrichten. Es puffert keine Nachrichten und wählt nicht den neuesten Wert aus.

Überprüfen der Ausgabe

Für eine frische Transformationsinstanz diese zehn Nachrichten auf factory/readings im Abstand von 100 Millisekunden verarbeiten. Die Zeiten sind relativ zur Verarbeitung der ersten Nachricht. Die Transformation verwendet seine monotone Verarbeitungsuhr; Publisher-Zeitstempel und Zustellzeiten sind getrennt.

Eingabe in factory/readings Bearbeitungsdauer Ausgabe auf factory/rate-limited
{"messageId":"reading-001","temperature":20} 0 ms Gleiche Nutzlast
{"messageId":"reading-002","temperature":21} 100 ms Dropped
{"messageId":"reading-003","temperature":22} 200 ms Dropped
{"messageId":"reading-004","temperature":23} 300 ms Dropped
{"messageId":"reading-005","temperature":24} 400 ms Dropped
{"messageId":"reading-006","temperature":25} 500 ms Identische Payload
{"messageId":"reading-007","temperature":26} 600 ms Dropped
{"messageId":"reading-008","temperature":27} 700 ms Dropped
{"messageId":"reading-009","temperature":28} 800 ms Dropped
{"messageId":"reading-010","temperature":29} 900 ms Dropped

Die erwarteten zwei Ausgabemeldungen sind:

{"messageId":"reading-001","temperature":20}
{"messageId":"reading-006","temperature":25}

Die Drosselung verwirft überschüssige Messwerte sofort. Pufferung, Warteschlangenbildung, Auswahl des neuesten Werts und Glättung erfordern eine separate Verarbeitung. Verwenden Sie robustes Puffern und anwendungsgesteuerte Backpressure für Alarme, Befehle oder Audit-Ereignisse, bei denen jedes Ereignis gespeichert werden muss.

Für Zustands- und Skalierungsbeschränkungen siehe Einschränkungen.

Einschränkungen

  • Verändert keine Nachrichten. Die Throttle-Transformation leitet Nachrichten nur weiter oder verwirft sie; sie ändert deren Inhalt nicht.
  • Der Gewinner ist derjenige, der das erste Spiel gewinnt. Die Transformation gilt nur für die erste Regel, deren topic Muster mit dem Thema der Nachricht übereinstimmt. Führen Sie spezifischere Muster vor allgemeineren auf.
  • Geteilter Zustand gemäß Muster. Eine Wildcard-Regel teilt ihr Ratenlimit für jedes konkrete Thema, mit dem sie übereinstimmt. Es gibt kein separates Limit pro Thema.
  • Keine Spitzen. Die Transformation setzt eine Mindestzeit zwischen den weitergeleiteten Nachrichten pro abgestimmtem Muster vor. Es sammelt keine ungenutzte Kapazität aus früheren, langsameren Phasen an.
  • Millisekundenpräzision. Das minimale Drosselintervall beträgt 1 Millisekunde, daher erhöhen höhere Werte als 1000 für maxMessagesPerSecond die effektive Weiterleitungsrate nicht über 1.000 Nachrichten pro Sekunde.
  • Das Timing basiert auf der Bearbeitungszeit, nicht auf dem Inhalt der Nachrichten. Die Transformation verwendet die Zeit, in der jede Nachricht verarbeitet wird, nicht die Zeit, zu der der Broker sie empfangen hat, oder ein Zeitstempelfeld in der Nutzlast.
  • Der Zustand ist lokal und im Speicher. Jede Datenflussprofil-Instanz behält ihren eigenen Drosselungszustand. Ein Neustart oder Neukonfiguration der Transformation setzt diesen Zustand zurück. Wenn ein Profil mehrere Instanzen hat, setzt jede Instanz die konfigurierte Rate unabhängig durch.
  • Doppelte Themenmuster sind nicht erlaubt. Die Konfiguration desselben topic Strings mehrmals in perTopicThrottles schlägt fehl, wenn die Transformation initialisiert wird.