Diese Seite bietet eine konzeptionelle Übersicht über die Einbindung von Dataflow in Pub/Sub. In der Übersicht werden einige Optimierungen beschrieben, die in der Dataflow Runner-Implementierung des Pub/Sub-I/O-Connectors verfügbar sind. Pub/Sub ist ein skalierbares, langlebiges System zur Aufnahme und Übermittlung von Ereignissen. Dataflow ergänzt das skalierbare Pub/Sub-Modell von mindestens einer Übermittlung durch die Deduplizierung von Nachrichten und der genau einmaligen Verarbeitung in Reihenfolge, wenn Fenster und Zwischenspeicher verwendet werden. Zur Verwendung von Dataflow schreiben Sie die Pipeline mit dem Apache Beam SDK und führen dann den Pipeline-Code im Dataflow-Dienst aus.
Bevor Sie beginnen, machen Sie sich mit den grundlegenden Konzepten von Apache Beam und Streamingpipelines vertraut. Weitere Informationen finden Sie in den folgenden Ressourcen:
- Einführung in Apache Beam-Konzepte wie PCollections, Trigger, Fenster und Wasserzeichen
- After Lambda: Exactly-once processing in Dataflow Part 1 und Part 3: Sources and Sinks
- Streaming: The world beyond batch: 101 und 102
- Programmieranleitung für Apache Beam
Streamingpipelines mit Pub/Sub erstellen
Um die Vorteile der Dataflow-Einbindung in Pub/Sub zu nutzen, können Sie Ihre Streamingpipelines auf eine der folgenden Arten erstellen:
Verwenden Sie den vorhandenen Streamingpipeline-Beispielcode aus dem Apache Beam-GitHub-Repository, z. B. Streaming-Wortextrahierung (Java) und Streaming-Wortzählung (Python).
Schreiben Sie eine neue Pipeline mithilfe der Apache Beam API-Referenz (Java oder Python).
Verwenden Sie von Google bereitgestellte Dataflow-Vorlagen und den entsprechenden Quellcode der Vorlage in Java.
Google bietet eine Reihe von Dataflow-Vorlagen, die eine UI-basierte Möglichkeit bieten, Pipelines für die Pub/Sub-Streamverarbeitung zu starten. Wenn Sie Java verwenden, können Sie auch den Quellcode dieser Vorlagen als Ausgangspunkt für die Erstellung einer benutzerdefinierten Pipeline verwenden.
Die folgenden Streamingvorlagen exportieren Pub/Sub-Daten an verschiedene Ziele:
- Pub/Sub-Abo für BigQuery
- Pub/Sub für Pub/Sub-Relay
- Pub/Sub für Cloud Storage Avro
- Pub/Sub für Cloud Storage Text
- Storage Text für Pub/Sub (Stream)
Mit der folgenden Batchvorlage wird ein Datenstrom in ein Pub/Sub-Thema importiert:
Folgen Sie der Pub/Sub-Kurzanleitung zur Streamverarbeitung mit Dataflow, um eine einfache Pipeline auszuführen.
Pub/Sub und Features für die Einbindung von Dataflow
Apache Beam bietet eine Implementierung der Referenz-E/A-Quelle (PubsubIO
) für Pub/Sub (Java und Python), die von Nicht-Dataflow-Runnern wie dem Apache Spark-Runner, dem Apache Flink-Runner und dem direkten Runner verwendet wird.
Der Dataflow-Runner verwendet jedoch eine andere, private Implementierung von PubsubIO
. Bei dieser Implementierung werden die Vorteile von Google Cloud-internen APIs und Diensten genutzt, um drei wichtige Vorteile zu bieten: Wasserzeichen mit niedriger Latenz, hohe Wasserzeichengenauigkeit (und somit Vollständigkeit der Daten) und eine effiziente Deduplizierung.
Die Implementierung von PubsubIO
durch den Dataflow-Runner erkennt Nachrichten automatisch, sobald sie in den nichtflüchtigen Speicher (Shuffle oder Senke) geschrieben wurden. Daher werden Nachrichten nur bestätigt, wenn Dataflow garantieren kann, dass kein Datenverlust auftritt, wenn eine Komponente abstürzt oder eine Verbindung unterbrochen wird.
Wasserzeichen mit niedriger Latenz
Dataflow hat Zugriff auf die private API von Pub/Sub, die das Alter der ältesten nicht bestätigten Nachricht in einem Abo mit einer niedrigeren Latenz angibt, als in Cloud Monitoring verfügbar ist. Zum Vergleich: Die in Cloud Monitoring verfügbaren Pub/Sub-Rückstandsmesswerte werden in der Regel um zwei bis drei Minuten verzögert, aber die Messwerte werden für Dataflow nur um etwa zehn Sekunden verzögert. Dadurch kann Dataflow Pipeline-Wasserzeichen vorziehen und die Ergebnisse der Fensterberechnungen früher ausgeben.
Hohe Wasserzeichengenauigkeit
Ein weiteres wichtiges Problem, das nativ durch die Dataflow-Einbindung in Pub/Sub gelöst wird, ist die Notwendigkeit eines robusten Wasserzeichens für in Ereigniszeit definierte Fenster. Die Ereigniszeit ist ein Zeitstempel, der von der Publisher-Anwendung als Attribut einer Pub/Sub-Nachricht angegeben wird, also nicht das Feld publish_time
, das vom Pub/Sub-Dienst für eine Nachricht festgelegt wird. Da Pub/Sub Rückstandsstatistiken nur in Bezug auf die Zeitstempel für zugewiesene Dienste oder Verarbeitungszeiten berechnet, erfordert die Schätzung des Ereigniszeit-Wasserzeichens einen separaten Mechanismus.
Um dieses Problem zu lösen, erstellt der Dataflow-Dienst ein zweites Tracking-Abo, wenn der Nutzer benutzerdefinierte Ereigniszeitstempel verwenden möchte. Dieses Tracking-Abo wird verwendet, um die Ereigniszeiten der Nachrichten im Rückstand des Basisabos zu prüfen und den Rückstand der Ereigniszeit zu schätzen. Weitere Informationen finden Sie auf der StackOverflow-Seite mit Informationen zur Berechnung von Pub/Sub-Wasserzeichen durch Dataflow.
Effiziente Deduplizierung
Die Nachrichtendeduplizierung ist für die Verarbeitung einmaliger Nachrichten erforderlich.
Dataflow dedupliziert Nachrichten in Bezug auf die Pub/Sub-Nachrichten-ID. Daher kann die gesamte Verarbeitungslogik davon ausgehen, dass die Nachrichten bereits eindeutig in Bezug auf die Pub/Sub-Nachrichten-ID sind. Der effiziente, inkrementelle Aggregationsmechanismus hierfür wird in der PubsubIO
API abstrahiert.
Wenn PubsubIO
für die Verwendung von benutzerdefinierten Nachrichten-IDs konfiguriert ist, dedupliziert Dataflow Nachrichten. Dazu wird eine Liste aller benutzerdefinierten IDs verwaltet, die in den letzten 10 Minuten erkannt wurden. Wenn sich die ID einer neuen Nachricht in dieser Liste befindet, wird davon ausgegangen, dass die Nachricht doppelt vorhanden ist und verworfen wird.