Streaming mit Pub/Sub

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:

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:

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.