[GO] GCP: Link-Funktionen und Pub / Sub

Vorwort

Ich habe versucht, Pub / Sub zu verwenden, um andere Funktionen aus Google Cloud-Funktionen aufzurufen.

Verfassung

Versuchen

Was ist Pub / Sub?

Messaging und Ingesting für ereignisgesteuerte Systeme und Streaming-Analyse. Cloud Pub/Sub  |  Google Cloud

Pub / Sub ist ein asynchroner Messaging-Dienst, der den Dienst, der Ereignisse verarbeitet, von dem Dienst trennt, der Ereignisse generiert. Pub/Was ist Sub|  Cloud Pub/Unterdokument|  Google Cloud

Das offizielle Dokument ist leicht verständlich für die Beziehung zwischen Begriffen und Zeichen. Publisher-Subscriber-Beziehung

Der allgemeine Fluss ist wie folgt.

  1. Erstellen Sie im Voraus ein Thema
  2. Der Publisher (sogenannter Anrufer) veröffentlicht eine Nachricht (Daten) zu einem Thema
  3. Der Abonnent (sogenannter Angerufene) erstellt das Abonnement und empfängt die Nachricht
  4. Wenn alle Nachrichten empfangen wurden, endet das Abonnement

Verlage und Abonnenten können frei auf Eins-zu-Viele oder Viele-zu-Viele anstatt Eins-zu-Eins eingestellt werden.

Mit GCP ausführen

Grobe Prozedur

  1. Erstellen Sie ein Thema in Pub / Sub
  2. Erstellen Sie in Funktionen einen Pub / Sub-Trigger
  3. Erstellen Sie Funktionen, um die Nachricht zum Thema zu veröffentlichen

3 HTTP-Trigger-> 1 Thema-> 2 Funktionen Es wird der Fluss.

1. Erstellen Sie ein Thema in Pub / Sub

"Erstellen Sie ein Thema" über die Themen GCP-Konsole> Pub / Sub>. Legen Sie eine beliebige Zeichenfolge für die Themen-ID fest.

2. Erstellen Sie in Funktionen einen Pub / Sub-Trigger

"Erstellen Sie eine Funktion" über GCP Console> Cloud-Funktionen. Setzen Sie den Triggertyp auf "Cloud Pub / Sub", wählen Sie das in 1 erstellte Thema aus und speichern Sie die Konfiguration.

Wählen Sie die gewünschte Codelaufzeit. Diesmal ist es Java 11.

Überprüfung des Abonnements (Pub / Sub-> Funktionen)

Wenn Sie dies eingerichtet haben, kehren Sie zum Pub / Sub-Thema in 1 zurück und stellen Sie sicher, dass es ausgelöst wird. Öffnen Sie das Thema in der GCP-Konsole> Pub / Sub> und unter "Nachricht veröffentlichen". Ich möchte es nur überprüfen, also füge die Nachricht "einmal" in "Eine Nachricht veröffentlichen" hinzu.

Öffnen Sie das "Protokoll" der Zielfunktion unter GCP Console> Cloud Functions. Wenn alles gut geht, wird eine Nachricht wie diese veröffentlicht. image.png

3. Erstellen Sie Funktionen, um die Nachricht zum Thema zu veröffentlichen

Erstellt mit gradle unter Bezugnahme auf die Quelle des offiziellen Dokuments. Veröffentlichen Sie eine Nachricht zu einem Thema|  Cloud Pub/Sub  |  Google Cloud

PublishFunction.java


import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.protobuf.ByteString;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.PubsubMessage;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;

public class PublishFunction implements HttpFunction {
    private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT");
    private static final String TOPIC_NAME = System.getenv("GOOGLE_CLOUD_PUBSUB_TOPIC");

    @Override
    public void service(HttpRequest request, HttpResponse response) throws Exception {
        String message = request.getFirstQueryParameter("message").get();
        ByteString byteStr = ByteString.copyFrom(message, StandardCharsets.UTF_8);
        PubsubMessage pubsubApiMessage = PubsubMessage.newBuilder().setData(byteStr).build();

        try {
            Publisher publisher = Publisher.newBuilder(ProjectTopicName.of(PROJECT_ID, TOPIC_NAME)).build();
            try {
                publisher.publish(pubsubApiMessage).get();
                response.setStatusCode(200);
                response.getWriter().write(message);
            } finally {
                publisher.shutdown();
                publisher.awaitTermination(1, TimeUnit.MINUTES);
            }
        } catch (InterruptedException | ExecutionException e) {
            System.out.println("Error publishing Pub/Sub message: " + e.getMessage());
            response.setStatusCode(500);
            response.getWriter().write(message);
        }
    }
}

Stellen Sie Folgendes ein

build.gradle


dependencies {
	implementation platform("com.google.cloud:libraries-bom:5.3.0");
	implementation("com.google.cloud:google-cloud-pubsub");
	implementation('com.google.protobuf:protobuf-java:3.13.0')
}

Registrieren Sie die erstellte Quelle in Funktionen (bereitgestellt von Cloud Build). Der Triggertyp sollte HTTP sein.

Sie müssen auch die Laufzeitvariable GOOGLE_CLOUD_PROJECT setzen. Der TOPIC_NAME kann direkt in den Code geschrieben werden, diesmal wurde er jedoch als Laufzeitvariable festgelegt. Verwendung von Umgebungsvariablen | Dokumente zu Google Cloud-Funktionen

Publish (Funktionen-> Pub / Sub) Überprüfung

Rufen Sie den HTTP-Trigger der in 3 erstellten Funktion auf. Da der URL-Parameter message übergeben werden kann, setzen Sie hier ein beliebiges Zeichen. Wenn dies in 1 als Nachricht an Pub / Sub veröffentlicht und schließlich in 2 an die Funktion ausgegeben wird, ist dies erfolgreich.

Versuchen Sie es vor Ort

Selbst wenn ich die Umgebungsvariable "GOOGLE_APPLICATION_CREDENTIALS" lokal setze, tritt die folgende Ausnahme auf. Ich weiß nicht, wie ich es hier machen soll: Denken:

java.io.IOException: The Application Default Credentials are not available. 
They are available if running in Google Compute Engine. 
Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. 
See https://developers.google.com/accounts/docs/application-default-credentials for more information.

Schließlich

Ich kam in Pub / Sub an und suchte nach Möglichkeiten, um Funktionen zu verknüpfen. Funktionen werden für die Startzeit berechnet, daher erscheint es zweckmäßig, sie asynchron verarbeiten zu können.

Recommended Posts

GCP: Link-Funktionen und Pub / Sub
GCP: Wiederholen Sie den Vorgang von Pub / Sub zu Cloud-Funktionen und von Cloud-Funktionen zu Pub / Sub
Funktionen und Dekorateure höherer Ordnung
Anonyme Funktion und Kartenfunktion
Verknüpfen Sie Hatena Bookmark und Yammer
Reagieren und Kolben zu GCP
Python 3 Sortier- und Vergleichsfunktionen
Klassenvererbung und Superfunktion
Emulieren Sie GCP Cloud-Funktionen lokal
Funktionen höherer Ordnung und Einschlussnotation in Python