13 - Pub/Sub: Dead-Letter, Push und BigQuery-Subscription (CLI)¶
In dieser Aufgabe üben Sie den Umgang mit der gcloud-CLI für Google Cloud
Pub/Sub. Sie erstellen ein Topic, eine Pull-Subscription mit Dead-Letter-Topic,
eine Push-Subscription sowie eine BigQuery-Subscription, die eingehende
Nachrichten direkt in eine BigQuery-Tabelle schreibt.
Erstellen eines Pub/Sub Topics¶
Erstellen Sie ein neues Pub/Sub Topic. Topic-Namen müssen innerhalb des Projekts eindeutig sein.
gcloud pubsub topics create my-topic
Erstellen eines Dead-Letter Topics¶
Nachrichten, die nicht erfolgreich verarbeitet werden können, sollen später in ein separates Dead-Letter-Topic (DLQ) umgeleitet werden. Damit die DLQ Nachrichten auch tatsächlich aufbewahrt, legen Sie zusätzlich eine Subscription darauf an.
gcloud pubsub topics create my-topic-dlq
gcloud pubsub subscriptions create my-topic-dlq-sub \
--topic=my-topic-dlq
Berechtigungen für das Dead-Lettering¶
Damit Pub/Sub Nachrichten in die DLQ weiterleiten darf, benötigt der
Pub/Sub-Service-Agent die Rolle roles/pubsub.publisher auf dem
DLQ-Topic.
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT \
--format="value(projectNumber)")
PUBSUB_SA="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud pubsub topics add-iam-policy-binding my-topic-dlq \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/pubsub.publisher"
Erstellen einer Pull-Subscription mit Dead-Letter Policy¶
Erstellen Sie nun die eigentliche Pull-Subscription. Mit
--max-delivery-attempts=5 wird eine Nachricht nach fünf erfolglosen
Zustellversuchen in die DLQ verschoben. Der Pub/Sub-Service-Agent benötigt
zusätzlich die Rolle roles/pubsub.subscriber auf der Subscription.
gcloud pubsub subscriptions create my-subscription \
--topic=my-topic \
--ack-deadline=10 \
--dead-letter-topic=my-topic-dlq \
--max-delivery-attempts=5
gcloud pubsub subscriptions add-iam-policy-binding my-subscription \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/pubsub.subscriber"
Eine Nachricht in die Dead-Letter Queue befördern¶
Publizieren Sie eine Nachricht und rufen Sie sie wiederholt ab, ohne sie zu
bestätigen. Nach Ablauf des ack-deadline (10 Sekunden) wird die Nachricht
erneut zugestellt. Nach fünf Versuchen wandert sie automatisch in die DLQ.
gcloud pubsub topics publish my-topic --message="Hello DLQ"
for i in $(seq 1 6); do
echo "Versuch $i:"
gcloud pubsub subscriptions pull my-subscription --limit=1
sleep 11
done
Inspizieren der Dead-Letter Queue¶
Die nicht verarbeitete Nachricht sollte nun in der DLQ-Subscription liegen.
gcloud pubsub subscriptions pull my-topic-dlq-sub \
--limit=1 \
--auto-ack
Erstellen einer Push-Subscription¶
Eine Push-Subscription stellt eingehende Nachrichten aktiv per HTTP-POST an
einen externen Endpunkt zu. Öffnen Sie für diese Übung
https://webhook.site in einem neuen Tab und kopieren
Sie den Wert "Your unique URL". Tragen Sie diese URL in PUSH_URL ein:
export PUSH_URL="https://webhook.site/..."
gcloud pubsub subscriptions create my-push-subscription \
--topic=my-topic \
--push-endpoint=$PUSH_URL
gcloud pubsub topics publish my-topic --message="Hello Push"
Wechseln Sie zurück in den Browser-Tab. Nach wenigen Sekunden erscheint dort der eingehende Request mit der Nachricht im Body.
Erstellen einer BigQuery-Subscription¶
Eine BigQuery-Subscription schreibt empfangene Nachrichten direkt in eine BigQuery-Tabelle, ohne dass eigener Subscriber-Code nötig wäre. Erstellen Sie zunächst Dataset und Tabelle:
bq mk --location=europe-west1 -d pubsub_demo
bq mk --table $GOOGLE_CLOUD_PROJECT:pubsub_demo.messages data:STRING
Vergeben Sie dem Pub/Sub-Service-Agent die nötigen BigQuery-Rechte:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/bigquery.dataEditor"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/bigquery.metadataViewer"
Erstellen Sie die Subscription und publizieren Sie eine Nachricht:
gcloud pubsub subscriptions create my-bq-subscription \
--topic=my-topic \
--bigquery-table=$GOOGLE_CLOUD_PROJECT:pubsub_demo.messages
gcloud pubsub topics publish my-topic --message="Hello BigQuery"
Prüfen Sie nach kurzer Wartezeit das Ergebnis in BigQuery:
bq query --use_legacy_sql=false \
"SELECT * FROM \`$GOOGLE_CLOUD_PROJECT.pubsub_demo.messages\`"
Aufräumen¶
Führen Sie folgende Befehle aus, um die Umgebung aufzuräumen.
gcloud pubsub subscriptions delete \
my-subscription \
my-topic-dlq-sub \
my-push-subscription \
my-bq-subscription \
--quiet
gcloud pubsub topics delete my-topic my-topic-dlq --quiet
bq rm -r -f -d $GOOGLE_CLOUD_PROJECT:pubsub_demo
gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/bigquery.dataEditor"
gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member="serviceAccount:${PUBSUB_SA}" \
--role="roles/bigquery.metadataViewer"