J'ai essayé d'utiliser Pub / Sub pour appeler d'autres fonctions à partir de Google Cloud Functions.
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.
Les éditeurs et les abonnés peuvent être librement définis sur un à plusieurs ou plusieurs à plusieurs au lieu de un à un.
3 déclencheurs HTTP-> 1 sujet-> 2 fonctions Cela devient le flux.
«Créer un sujet» depuis la console GCP> Pub / Sub> Sujets. Définissez une chaîne de caractères pour l'ID de rubrique.
"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.
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.
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
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.
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.
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