[JAVA] GCP: fonctions de lien et Pub / Sub

Préface

J'ai essayé d'utiliser Pub / Sub pour appeler d'autres fonctions à partir de Google Cloud Functions.

Constitution

Essayer

Qu'est-ce que Pub / Sub?

Messagerie et ingestion pour les systèmes événementiels et l'analyse en continu. Cloud Pub/Sub  |  Google Cloud

Pub / Sub est un service de messagerie asynchrone qui sépare le service qui gère les événements du service qui génère des événements. Pub/Qu'est-ce que Sub|  Cloud Pub/Sous-document|  Google Cloud

Le document officiel est facile à comprendre la relation entre les termes et les caractères. Relation éditeur-abonné

Le flux général est le suivant.

  1. Créez un sujet à l'avance
  2. L'éditeur (appelé appelant) publie un message (données) sur un sujet
  3. L'abonné (appelé appelé) crée l'abonnement et reçoit le message
  4. Lorsque tous les messages sont reçus, l'abonnement prend fin

Les éditeurs et les abonnés peuvent être librement définis sur un à plusieurs ou plusieurs à plusieurs au lieu de un à un.

Exécuter avec GCP

Procédure approximative

  1. Créez un sujet dans Pub / Sub
  2. Créez un déclencheur Pub / Sub dans Functions
  3. Créez des fonctions pour publier le message sur le sujet

3 déclencheurs HTTP-> 1 sujet-> 2 fonctions Cela devient le flux.

1. Créez un sujet dans Pub / Sub

«Créer un sujet» depuis la console GCP> Pub / Sub> Sujets. Définissez une chaîne de caractères pour l'ID de rubrique.

2. Créez un déclencheur Pub / Sub dans Functions

"Créer une fonction" depuis la console GCP> Cloud Functions. Définissez le type de déclencheur sur «Cloud Pub / Sub», sélectionnez le sujet créé en 1 et enregistrez la configuration.

Choisissez le code d'exécution que vous aimez. Cette fois, c'est Java 11.

Vérification de l'abonnement (Pub / Sub-> Fonctions)

Une fois que vous avez configuré cela, revenez au sujet Pub / Sub en 1 et assurez-vous qu'il est déclenché. Ouvrez le sujet dans le sujet de la console GCP> Pub / Sub> et dans "Publier le message". Je veux juste le vérifier, alors ajoutez le message "une fois" dans "Publier un message".

Ouvrez le "journal" de la fonction cible dans la console GCP> Cloud Functions. Si tout se passe bien, vous verrez un message publié comme celui-ci. image.png

3. Créez des fonctions pour publier le message sur le sujet

Créé avec gradle, en référence à la source du document officiel. Publier un message sur un sujet|  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);
        }
    }
}

Définissez les éléments suivants

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')
}

Enregistrez la source créée dans Functions (déployée à partir de Cloud Build). Le type de déclencheur doit être HTTP.

Vous devez également définir la variable d'exécution GOOGLE_CLOUD_PROJECT. Le TOPIC_NAME peut être écrit directement dans le code, mais cette fois, il a été défini comme une variable d'exécution. Utilisation de variables d'environnement | Documents sur Google Cloud Functions

Vérification de la publication (Fonctions-> Pub / Sub)

Appelez le déclencheur HTTP de la fonction créée en 3. Puisque le paramètre d'URL message peut être transmis, définissez n'importe quel caractère ici. Si cela est publié sous forme de message à Pub / Sub dans 1 et finalement sorti vers la fonction dans 2, cela réussit.

Essayez localement

Même si je définis la variable d'environnement de GOOGLE_APPLICATION_CREDENTIALS localement, l'exception suivante se produit. Je ne sais pas comment faire ici: penser:

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.

finalement

Je suis arrivé à Pub / Sub, à la recherche de ce qui serait bon pour lier des fonctions. Les fonctions sont facturées pour le temps de démarrage, il semble donc pratique de pouvoir les traiter de manière asynchrone.

Recommended Posts

GCP: fonctions de lien et Pub / Sub
GCP: répétez de Pub / Sub vers Cloud Functions et de Cloud Functions vers Pub / Sub
Fonctions et décorateurs d'ordre supérieur
Fonction anonyme et fonction de carte
Lien Hatena Bookmark et Yammer
React and Flask to GCP
Fonctions de tri et de comparaison Python 3
Héritage de classe et super fonction
Émulez les fonctions GCP Cloud localement
Fonctions d'ordre supérieur et notation d'inclusion en Python