Traitement d'images à l'aide de microservices et de messagerie asynchrone

Last reviewed 2023-07-17 UTC

Ce document explique comment mettre en œuvre l'architecture de référence décrite dans la section Intégrer des microservices avec Pub/Sub et GKE. L'architecture est conçue pour gérer les processus de longue durée en utilisant des conteneurs et une messagerie asynchrone.

Ce document utilise un exemple d'application de partage de photos qui génère des vignettes de photos. Vous déployez l'application à l'aide de Google Kubernetes Engine (GKE) et utilisez Pub/Sub pour appeler de manière asynchrone des processus de longue durée. Vous utilisez également des notifications Pub/Sub pour Cloud Storage afin d'ajouter des tâches secondaires sans modifier le code de l'application.

L'application est conteneurisée par Cloud Build et stockée dans Artifact Registry. Elle utilise Cloud Vision pour détecter les images au contenu inapproprié.

Architecture

Le schéma suivant illustre la conception de l'exemple d'application d'album photo qui met en œuvre l'architecture de référence.

Architecture de l'application d'album photo

Figure 1 : Architecture de traitement d'image basée sur l'utilisation de conteneurs et d'une messagerie asynchrone.

Le schéma précédent montre comment la vignette est générée :

  1. Un client importe une image dans l'application.
  2. L'application stocke l'image dans Cloud Storage.
  3. Une requête est générée pour la vignette.
  4. Le générateur de vignettes crée la vignette.
  5. La réponse positive est envoyée à l'application d'album photo.
  6. La réponse positive est envoyée au client et vous pouvez trouver la vignette dans Cloud Storage.

Le schéma suivant montre comment l'application met en œuvre la génération de vignettes en tant que service distinct et de manière asynchrone.

Architecture du processus d'extraction des vignettes.

Figure 2. Architecture du processus d'extraction des vignettes.

Vous utilisez Pub/Sub pour envoyer des requêtes de service au service de génération de vignettes. Cette nouvelle architecture rend l'appel de service asynchrone afin qu'une vignette soit créée en arrière-plan une fois que l'application a renvoyé la réponse à un client. Cette conception permet également au service de génération de vignettes de s'adapter afin que plusieurs tâches puissent s'exécuter en parallèle.

Objectifs

  • Déployer un exemple d'application d'album photo sur GKE
  • Effectuer des appels de service asynchrones à partir de l'application
  • Utiliser les notifications Pub/Sub pour Cloud Storage afin de déclencher l'application lorsqu'un nouveau fichier est importé dans le bucket Cloud Storage
  • Utiliser Pub/Sub pour effectuer plus de tâches sans modifier l'application

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez fini de créer l'exemple d'application, vous pouvez éviter de continuer à payer des frais en supprimant les ressources créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

Configurer l'environnement

Dans cette section, vous allez définir les paramètres par défaut pour les valeurs utilisées tout au long du document. Si vous fermez votre session Cloud Shell, vous perdrez ces paramètres d'environnement.

  1. Dans Cloud Shell, définissez votre projet Google Cloud par défaut :

    gcloud config set project PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.

  2. Définissez votre région Compute Engine par défaut :

    gcloud config set compute/region REGION
    export REGION=REGION
    

    Remplacez REGION par une région proche de vous. Pour en savoir plus, consultez la page Régions et zones.

  3. Définissez votre zone Compute Engine par défaut :

    gcloud config set compute/zone ZONE
    export ZONE=ZONE
    

    Remplacez ZONE par une zone proche de vous.

  4. Téléchargez les fichiers d'exemple d'application et accédez à votre répertoire actuel :

    git clone https://github.com/GoogleCloudPlatform/gke-photoalbum-example
    cd gke-photoalbum-example
    

Créer un bucket Cloud Storage et importer l'image de vignettes par défaut

  1. Dans Cloud Shell, créez un bucket Cloud Storage pour stocker les images et les vignettes d'origine :

    export PROJECT_ID=$(gcloud config get-value project)
    gcloud storage buckets create gs://${PROJECT_ID}-photostore --location=${REGION}
    
  2. Importez le fichier de vignettes par défaut :

    gcloud storage cp ./application/photoalbum/images/default.png \
        gs://${PROJECT_ID}-photostore/thumbnails/default.png
    
    • Les images importées sont stockées au format suivant : gs://PROJECT_ID-photostore/FILENAMEFILENAME représente le nom du fichier image importé.
    • Les vignettes générées sont stockées au format suivant : gs://PROJECT_ID-photostore/thumbnails/FILENAME.
    • L'image d'origine et la vignette correspondante ont le même FILENAME, mais la vignette est stockée dans le bucket thumbnails.
    • Pendant la création de la vignette, l'image de vignette d'espace réservé default.png suivante s'affiche dans l'album photo.

      Image miniature de l'espace réservé par défaut.

  3. Rendre le fichier de vignette public :

    gcloud storage buckets add-iam-policy-binding gs://${PROJECT_ID}-photostore \
        --member=allUsers --role=roles/storage.objectViewer
    

Créer une instance Cloud SQL et une base de données MySQL

  1. Dans Cloud Shell, créez l'instance Cloud SQL :

    gcloud sql instances create photoalbum-db --region=${REGION} \
        --database-version=MYSQL_8_0
    
  2. Récupérez le nom de la connexion :

    gcloud sql instances describe photoalbum-db \
        --format="value(connectionName)"
    

    Notez ce nom, car vous l'utiliserez plus tard.

  3. Définissez le mot de passe de l'utilisateur MySQL root@%.

    gcloud sql users set-password root --host=% --instance=photoalbum-db \
        --password=PASSWORD
    

    Remplacez PASSWORD par un mot de passe sécurisé pour l'utilisateur root@%.

  4. Connectez-vous à l'instance Cloud SQL.

    gcloud sql connect photoalbum-db --user=root --quiet
    

    Lorsque vous y êtes invité, saisissez le mot de passe que vous avez configuré à l'étape précédente.

  5. Créez une base de données appelée photo_db, dont l'utilisateur est appuser avec le mot de passe pas4appuser :

    create database photo_db;
    create user 'appuser'@'%' identified by 'pas4appuser';
    grant all on photo_db.* to 'appuser'@'%' with grant option;
    flush privileges;
    
  6. Confirmez le résultat et quittez MySQL :

    show databases;
    select user from mysql.user;
    exit
    

    Dans le résultat, vérifiez que la base de données photo_db et l'utilisateur appuser sont créés :

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | photo_db           |
    | sys                |
    +--------------------+
    5 rows in set (0.16 sec)
    
    mysql> \t
    Outfile disabled.
    mysql> select user from mysql.user;
    +-------------------+
    | user              |
    +-------------------+
    | appuser           |
    | cloudsqlreplica   |
    | cloudsqlsuperuser |
    | root              |
    | cloudsqlexport    |
    | cloudsqlimport    |
    | cloudsqloneshot   |
    | root              |
    | cloudsqlexport    |
    | cloudsqlimport    |
    | cloudsqloneshot   |
    | root              |
    | cloudsqlapplier   |
    | cloudsqlimport    |
    | mysql.infoschema  |
    | mysql.session     |
    | mysql.sys         |
    | root              |
    +-------------------+
    18 rows in set (0.16 sec)
    
    mysql> exit
    Bye
    

Créer un sujet et un abonnement Pub/Sub

  1. Dans Cloud Shell, créez un sujet Pub/Sub appelé thumbnail-service :

    gcloud pubsub topics create thumbnail-service
    

    L'application d'album photo envoie des requêtes au service de génération de vignettes en publiant un message sur le sujet thumbnail-service.

  2. Créez un abonnement Pub/Sub appelé thumbnail-workers :

    gcloud pubsub subscriptions create --topic thumbnail-service thumbnail-workers
    

    Le service de génération de vignettes reçoit des requêtes de l'abonnement thumbnail-workers.

Créer un cluster GKE

  1. Dans Cloud Shell, créez un cluster GKE autorisé à appeler des API :

    gcloud container clusters create "photoalbum-cluster" \
        --scopes "https://www.googleapis.com/auth/cloud-platform" \
        --num-nodes "5"
    
  2. Récupérez les identifiants d'accès configurés pour pouvoir gérer le cluster à l'aide de la commande kubectl lors des étapes suivantes :

    gcloud container clusters get-credentials photoalbum-cluster
    
  3. Affichez la liste des nœuds :

    kubectl get nodes
    

    Dans le résultat, vérifiez qu'il existe cinq nœuds dont la valeur STATUS est Ready :

    NAME                                                STATUS   ROLES    AGE     VERSION
    gke-photoalbum-cluster-default-pool-d637570a-2pfh   Ready    <none>   2m55s   v1.24.10-gke.2300
    gke-photoalbum-cluster-default-pool-d637570a-3rm4   Ready    <none>   2m55s   v1.24.10-gke.2300
    gke-photoalbum-cluster-default-pool-d637570a-f7l4   Ready    <none>   2m55s   v1.24.10-gke.2300
    gke-photoalbum-cluster-default-pool-d637570a-qb2z   Ready    <none>   2m53s   v1.24.10-gke.2300
    gke-photoalbum-cluster-default-pool-d637570a-rvnp   Ready    <none>   2m54s   v1.24.10-gke.2300
    

Créer le dépôt Artifact Registry

  • Dans Cloud Shell, créez un dépôt pour stocker les images de conteneurs :

    gcloud artifacts repositories create photoalbum-repo \
        --repository-format=docker \
        --location=us-central1 \
        --description="Docker repository"
    

Créer des images pour l'application

  1. Dans un éditeur de texte, ouvrez le fichier application/photoalbum/src/auth_decorator.py et mettez à jour le nom d'utilisateur et le mot de passe :

    USERNAME = 'username'
    PASSWORD = 'passw0rd'
    
  2. Dans Cloud Shell, créez une image pour l'application d'album photo à l'aide du service Cloud Build :

    gcloud builds submit ./application/photoalbum -t \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app
    
  3. Créez une image pour le service de génération de vignettes thumbnail-worker à l'aide du service Cloud Build :

    gcloud builds submit ./application/thumbnail -t \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker
    

Déployer l'application d'album photo

  1. Dans Cloud Shell, mettez à jour les fichiers manifestes de déploiement Kubernetes pour l'album photo et le générateur de vignettes avec les valeurs de votre environnement :

    connection_name=$(gcloud sql instances describe photoalbum-db \
        --format "value(connectionName)")
    
    digest_photoalbum=$(gcloud container images describe \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app:latest --format \
        "value(image_summary.digest)")
    
    sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \
        -e "s/\[CONNECTION_NAME\]/${connection_name}/" \
        -e "s/\[DIGEST\]/${digest_photoalbum}/" \
        config/photoalbum-deployment.yaml
    
    digest_thumbnail=$(gcloud container images describe \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker:latest --format \
        "value(image_summary.digest)")
    
    sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \
        -e "s/\[CONNECTION_NAME\]/${connection_name}/" \
        -e "s/\[DIGEST\]/${digest_thumbnail}/" \
            config/thumbnail-deployment.yaml
    
  2. Créez des ressources de déploiement pour lancer l'application d'album photo et le service de génération de vignettes :

    kubectl create -f config/photoalbum-deployment.yaml
    kubectl create -f config/thumbnail-deployment.yaml
    
  3. Créez une ressource de service pour attribuer une adresse IP externe à l'application :

    kubectl create -f config/photoalbum-service.yaml
    
  4. Vérifiez les résultats des pods :

    kubectl get pods
    

    Dans le résultat, vérifiez qu'il existe trois pods pour chaque pod photoalbum-app et thumbail-worker, et que leur valeur STATUS est Running :

    NAME                                READY     STATUS    RESTARTS   AGE
    photoalbum-app-555f7cbdb7-cp8nw     2/2       Running   0          2m
    photoalbum-app-555f7cbdb7-ftlc6     2/2       Running   0          2m
    photoalbum-app-555f7cbdb7-xsr4b     2/2       Running   0          2m
    thumbnail-worker-86bd95cd68-728k5   2/2       Running   0          2m
    thumbnail-worker-86bd95cd68-hqxqr   2/2       Running   0          2m
    thumbnail-worker-86bd95cd68-xnxhc   2/2       Running   0          2m
    

    Les pods thumbnail-worker s'abonnent aux requêtes de génération de vignettes de l'abonnement thumbnail-workers. Pour en savoir plus, découvrez l'utilisation de la fonction callback dans le code source.

  5. Vérifiez les résultats des services :

    kubectl get services
    

    Dans le résultat, vérifiez qu'il y a bien une adresse IP externe dans la colonne EXTERNAL-IP du service photoalbum-service. Quelques minutes peuvent s'écouler avant que les services ne soient tous en cours d'exécution.

    NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
    kubernetes           ClusterIP      10.23.240.1     <none>            443/TCP        20m
    photoalbum-service   LoadBalancer   10.23.253.241   146.148.111.115   80:32657/TCP   2m
    

    Notez l'adresse IP externe, car elle sera utilisée ultérieurement. Dans cet exemple, la valeur est de 146.148.111.115.

Tester l'application d'album photo

  1. Pour accéder à l'application déployée dans un navigateur Web, accédez à l'URL suivante, puis saisissez le nom d'utilisateur et le mot de passe que vous avez précédemment configurés :

    http://EXTERNAL_IP
    

    Remplacez EXTERNAL_IP par l'adresse IP que vous avez copiée à l'étape précédente.

  2. Pour importer un fichier image, cliquez sur Importer.

    Vignette d&#39;espace réservé qui s&#39;affiche pendant que le service génère une vignette unique.

    L'image de vignette d'espace réservé apparaît à l'écran.

    En arrière-plan, le service de génération de vignettes crée une vignette de l'image importée. Pour afficher la vignette générée, cliquez sur Refresh (Actualiser). L'API Cloud Vision ajoute des libellés aux images qu'elle détecte.

    Vignette avec libellés d&#39;image associés

    Pour afficher l'image d'origine, cliquez sur la vignette.

Ajouter une fonctionnalité de détection d'images inappropriées

L'image suivante montre comment utiliser les notifications Pub/Sub pour Cloud Storage afin de déclencher un service de détection de contenu inapproprié. Cette fonctionnalité floute l'image lorsqu'un nouveau fichier avec du contenu inapproprié est stocké dans le bucket Cloud Storage.

Architecture de la fonctionnalité de contenu inapproprié

Dans l'image précédente, le service utilise la fonctionnalité de détection de recherche sécurisée de l'API Cloud Vision pour détecter le contenu inapproprié dans une image.

L'application photo déclenche le générateur de vignettes et le vérificateur d'image de manière asynchrone. Par conséquent, rien ne garantit que ces composants seront exécutés dans un ordre spécifique. Si la génération de vignettes se produit avant le floutage de l'image, une vignette inappropriée peut s'afficher pendant une courte période. Cependant, l'outil de vérification des images floute finalement l'image inappropriée et la vignette inappropriée.

Créer un sujet, un abonnement et une notification Pub/Sub

  1. Dans Cloud Shell, créez un sujet Pub/Sub appelé safeimage-service :

    gcloud pubsub topics create safeimage-service
    
  2. Créez un abonnement Pub/Sub appelé safeimage-workers :

    gcloud pubsub subscriptions create --topic safeimage-service \
        safeimage-workers
    
  3. Configurez une notification Pub/Sub afin qu'un message soit envoyé au sujet safeimage-service lorsqu'un nouveau fichier est importé dans le bucket Cloud Storage :

    gcloud storage buckets notifications create gs://${PROJECT_ID}-photostore \
        --topic=safeimage-service --payload-format=json
    

Créer et déployer l'image du nœud de calcul

  1. Dans Cloud Shell, créez une image de conteneur pour l'abonnement safeimage-workers à l'aide de Cloud Build :

    gcloud builds submit ./application/safeimage \
        -t us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker
    
  2. Mettez à jour les fichiers manifestes de déploiement Kubernetes pour le service d'images sécurisées avec l'ID de votre projet Google Cloud, le nom de la connexion Cloud SQL et les condensés des images de conteneur :

    digest_safeimage=$(gcloud container images describe \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker:latest --format \
        "value(image_summary.digest)")
    sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \
        -e "s/\[CONNECTION_NAME\]/${connection_name}/" \
        -e "s/\[DIGEST\]/${digest_safeimage}/" \
        config/safeimage-deployment.yaml
    

Créer une ressource de déploiement

  1. Créez une ressource de déploiement appelée safeimage-deployment pour déployer le sujet safeimage-service :

    kubectl create -f config/safeimage-deployment.yaml
    
  2. Vérifiez les résultats :

    kubectl get pods
    

    Dans le résultat, vérifiez qu'il existe trois pods safeimage-worker dont la valeur STATUS est Running.

    NAME                                READY     STATUS    RESTARTS   AGE
    photoalbum-app-555f7cbdb7-cp8nw     2/2       Running   0          30m
    photoalbum-app-555f7cbdb7-ftlc6     2/2       Running   0          30m
    photoalbum-app-555f7cbdb7-xsr4b     2/2       Running   8          30m
    safeimage-worker-7dc8c84f54-6sqzs   1/1       Running   0          2m
    safeimage-worker-7dc8c84f54-9bskw   1/1       Running   0          2m
    safeimage-worker-7dc8c84f54-b7gtp   1/1       Running   0          2m
    thumbnail-worker-86bd95cd68-9wrpv   2/2       Running   0          30m
    thumbnail-worker-86bd95cd68-kbhsn   2/2       Running   2          30m
    thumbnail-worker-86bd95cd68-n4rj7   2/2       Running   0          30m
    

    Les pods safeimage-worker s'abonnent aux requêtes de détection d'images inappropriées de l'abonnement safeimage-workers. Pour en savoir plus, découvrez l'utilisation de la fonction callback dans le code source.

Tester la fonctionnalité de détection d'images au contenu inapproprié

Dans cette section, vous importez une image test pour vérifier que la fonctionnalité de détection de recherche sécurisée floute une image inappropriée. L'image test est une photo d'une jeune fille déguisée en zombi (sous licence CC0 de Pixaby).

  1. Téléchargez l'image test.
  2. Pour importer l'image, accédez à http://EXTERNAL_IP, puis cliquez sur Upload (Importer).
  3. Cliquez sur Actualiser. L'application affiche une vignette floutée.

    Une vignette floutée

    Pour voir si l'image importée est également floutée, cliquez sur la vignette.

Effectuer un nettoyage

Si vous ne souhaitez pas conserver les ressources Google Cloud que vous avez créées pour l'exemple d'application, vous pouvez les supprimer afin qu'elles ne vous soient plus facturées. Vous pouvez soit supprimer entièrement le projet, soit supprimer les ressources du cluster, puis le supprimer.

Supprimer le projet

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Supprimer les ressources individuelles

Au lieu de supprimer le projet, vous pouvez supprimer les ressources individuelles que vous avez créées.

  1. Supprimez les ressources de GKE :

    kubectl delete -f config/safeimage-deployment.yaml
    kubectl delete -f config/photoalbum-service.yaml
    kubectl delete -f config/thumbnail-deployment.yaml
    kubectl delete -f config/photoalbum-deployment.yaml
    
  2. Supprimez le cluster de GKE :

    gcloud container clusters delete photoalbum-cluster --quiet
    
  3. Supprimez le dépôt dans Artifact Registry :

    gcloud artifacts repositories delete photoalbum-repo --location us-central1 --quiet
    
  4. Supprimez les abonnements et les sujets de Pub/Sub :

    gcloud pubsub subscriptions delete safeimage-workers
    gcloud pubsub topics delete safeimage-service
    gcloud pubsub subscriptions delete thumbnail-workers
    gcloud pubsub topics delete thumbnail-service
    
  5. Supprimez l'instance Cloud SQL :

    gcloud sql instances delete photoalbum-db --quiet
    
  6. Supprimez le bucket Cloud Storage :

    gcloud storage rm gs://${PROJECT_ID}-photostore --recursive
    gcloud storage rm gs://${PROJECT_ID}_cloudbuild --recursive
    
  7. Supprimez les fichiers :

    cd ..
    rm -rf gke-photoalbum-example
    

Étape suivante

  • Apprenez-en plus sur le DevOps et découvrez la fonctionnalité d'architecture associée à cette architecture de référence.
  • Effectuez l'évaluation DevOps rapide pour comprendre votre position par rapport au reste du secteur.
  • Pour découvrir d'autres architectures de référence, schémas et bonnes pratiques, consultez le Centre d'architecture cloud.