Men-deploy pemrosesan gambar menggunakan microservice dan pengiriman pesan asinkron

Last reviewed 2023-07-17 UTC

Dokumen ini menjelaskan cara menerapkan arsitektur referensi yang dijelaskan dalam Mengintegrasikan microservice dengan Pub/Sub dan GKE. Arsitektur ini dirancang untuk menangani proses yang berjalan lama dengan menggunakan container dan pengiriman pesan asinkron.

Dokumen ini menggunakan contoh aplikasi berbagi foto yang membuat thumbnail foto. Anda men-deploy aplikasi menggunakan Google Kubernete Engine (GKE) dan menggunakan Pub/Sub untuk memanggil proses yang berjalan lama secara asinkron. Anda juga dapat menggunakan notifikasi Pub/Sub untuk Cloud Storage guna menambahkan tugas samping tanpa mengubah kode aplikasi.

Aplikasi dimasukkan ke dalam container oleh Cloud Build dan disimpan di Artifact Registry. Teknologi ini menggunakan Cloud Vision untuk mendeteksi gambar yang tidak pantas.

Arsitektur

Diagram berikut mengilustrasikan desain contoh aplikasi album foto yang mengimplementasikan arsitektur referensi.

Arsitektur aplikasi album foto.

Gambar 1. Arsitektur untuk pemrosesan gambar yang didasarkan pada penggunaan kontainer dan pengiriman pesan asinkron.

Diagram sebelumnya menggambarkan cara thumbnail dibuat:

  1. Klien mengupload gambar ke aplikasi.
  2. Aplikasi menyimpan gambar di Cloud Storage.
  3. Permintaan untuk thumbnail akan dibuat.
  4. Pembuat thumbnail menghasilkan thumbnail.
  5. Respons yang berhasil akan dikirim ke aplikasi album foto.
  6. Respons yang berhasil akan dikirim ke klien dan Anda dapat menemukan thumbnail di Cloud Storage.

Diagram berikut menunjukkan cara aplikasi mengimplementasikan pembuatan thumbnail sebagai layanan terpisah secara asinkron.

Arsitektur proses ekstraksi thumbnail.

Gambar 2. Arsitektur proses ekstraksi thumbnail.

Anda dapat menggunakan Pub/Sub untuk mengirim permintaan layanan ke layanan pembuatan thumbnail. Arsitektur baru ini membuat panggilan layanan menjadi asinkron sehingga thumbnail dibuat di latar belakang setelah aplikasi mengirim respons kembali ke klien. Desain ini juga memungkinkan layanan pembuatan thumbnail untuk diskalakan sehingga beberapa tugas dapat berjalan secara paralel.

Tujuan

  • Deploy contoh aplikasi album foto di GKE.
  • Lakukan panggilan layanan asinkron dari aplikasi.
  • Gunakan notifikasi Pub/Sub untuk Cloud Storage guna memicu aplikasi saat file baru diupload ke bucket Cloud Storage.
  • Gunakan Pub/Sub untuk melakukan lebih banyak tugas tanpa mengubah aplikasi.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah selesai mem-build aplikasi contoh, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  8. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Menyiapkan lingkungan

Di bagian ini, Anda akan menetapkan setelan default untuk nilai yang digunakan di seluruh dokumen. Jika Anda menutup sesi Cloud Shell, Anda akan kehilangan setelan lingkungan ini.

  1. Di Cloud Shell, tetapkan project Google Cloud default Anda:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan ID project Google Cloud Anda.

  2. Tetapkan region Compute Engine default Anda:

    gcloud config set compute/region REGION
    export REGION=REGION
    

    Ganti REGION dengan region yang dekat dengan Anda. Untuk informasi selengkapnya, lihat Region dan zona.

  3. Tetapkan zona Compute Engine default Anda:

    gcloud config set compute/zone ZONE
    export ZONE=ZONE
    

    Ganti ZONE dengan zona yang dekat dengan Anda.

  4. Download file aplikasi contoh dan tetapkan direktori Anda saat ini:

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

Membuat bucket Cloud Storage dan upload gambar thumbnail default

  1. Di Cloud Shell, buat bucket Cloud Storage untuk menyimpan gambar dan thumbnail asli:

    export PROJECT_ID=$(gcloud config get-value project)
    gsutil mb -c regional -l ${REGION} gs://${PROJECT_ID}-photostore
    
  2. Upload file thumbnail default:

    gsutil cp ./application/photoalbum/images/default.png \
        gs://${PROJECT_ID}-photostore/thumbnails/default.png
    
    • Gambar yang diupload disimpan dalam format berikut: gs://PROJECT_ID-photostore/FILENAME, dengan FILENAME mewakili nama file gambar yang diupload.
    • Thumbnail yang dihasilkan disimpan dalam format berikut: gs://PROJECT_ID-photostore/thumbnails/FILENAME.
    • Gambar asli dan thumbnail yang sesuai memiliki nilai FILENAME yang sama, tetapi thumbnail disimpan di bucket thumbnails.
    • Saat thumbnail dibuat, gambar thumbnail placeholder berikut default.png ditampilkan dalam aplikasi album foto.

      Gambar thumbnail placeholder default.

  3. Ubah file thumbnail menjadi publik:

    gsutil acl ch -u AllUsers:R \
        gs://${PROJECT_ID}-photostore/thumbnails/default.png
    

Membuat instance Cloud SQL dan database MySQL

  1. Di Cloud Shell, buat instance Cloud SQL:

    gcloud sql instances create photoalbum-db --region=${REGION} \
        --database-version=MYSQL_8_0
    
  2. Ambil nama koneksi:

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

    Catat nama tersebut karena Anda akan menggunakannya nanti.

  3. Setel sandi untuk pengguna MySQL root@%:

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

    Ganti PASSWORD dengan sandi yang aman untuk pengguna root@%.

  4. Hubungkan ke instance Cloud SQL:

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

    Saat diminta, masukkan sandi yang telah Anda siapkan pada langkah sebelumnya.

  5. Buat database bernama photo_db, dengan pengguna adalah appuser dan sandinya adalah pas4appuser:

    create database photo_db;
    create user 'appuser'@'%' identified by 'pas4appuser';
    grant all on photo_db.* to 'appuser'@'%' with grant option;
    flush privileges;
    
  6. Konfirmasi hasilnya dan keluar dari MySQL:

    show databases;
    select user from mysql.user;
    exit
    

    Di output, konfirmasi bahwa database photo_db dan pengguna appuser sudah dibuat:

    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
    

Membuat topik Pub/Sub dan langganan

  1. Di Cloud Shell, buat topik Pub/Sub bernama thumbnail-service:

    gcloud pubsub topics create thumbnail-service
    

    Aplikasi album foto mengirimkan permintaan ke layanan pembuatan thumbnail dengan memublikasikan pesan tentang topik thumbnail-service.

  2. Buat langganan Pub/Sub bernama thumbnail-workers:

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

    Layanan pembuatan thumbnail menerima permintaan dari langganan thumbnail-workers.

Membuat cluster GKE

  1. Di Cloud Shell, buat cluster GKE yang memiliki izin untuk memanggil API:

    gcloud container clusters create "photoalbum-cluster" \
        --scopes "https://www.googleapis.com/auth/cloud-platform" \
        --num-nodes "5"
    
  2. Konfigurasi kredensial akses agar Anda dapat mengelola cluster menggunakan kubectl perintah pada langkah-langkah berikutnya:

    gcloud container clusters get-credentials photoalbum-cluster
    
  3. Tampilkan daftar node:

    kubectl get nodes
    

    Di output, konfirmasi bahwa ada lima node yang STATUSnilainya adalah 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
    

Membuat repositori Artifact Registry

  • Di Cloud Shell, buat repositori untuk menyimpan image container:

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

Mem-build gambar untuk aplikasi

  1. Di editor teks, buka application/photoalbum/src/auth_decorator.py file lalu perbarui nama pengguna dan sandi:

    USERNAME = 'username'
    PASSWORD = 'passw0rd'
    
  2. Di Cloud Shell, mem-build gambar untuk aplikasi album foto menggunakan layanan Cloud Build.

    gcloud builds submit ./application/photoalbum -t \
        us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app
    
  3. Mem-build gambar untuk thumbnail-workerlayanan pembuatan thumbnail menggunakan layanan Cloud Build:

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

Men-deploy aplikasi album foto

  1. Di Cloud Shell, perbaru manifes Deployment Kubernetes untuk album foto dan pembuat thumbnail dengan nilai dari lingkungan Anda:

    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. Buat resource deployment untuk meluncurkan aplikasi album foto dan layanan pembuatan thumbnail:

    kubectl create -f config/photoalbum-deployment.yaml
    kubectl create -f config/thumbnail-deployment.yaml
    
  3. Buat resource layanan untuk menetapkan alamat IP eksternal pada aplikasi:

    kubectl create -f config/photoalbum-service.yaml
    
  4. Periksa hasil pod:

    kubectl get pods
    

    Di output, konfirmasi bahwa terdapat tiga pod untuk setiap pod photoalbum-app dan thumbail-worker pod dan STATUS serta nilai mereka adalah 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
    

    Pod thumbnail-worker berlangganan permintaan pembuatan thumbnail dari langganan thumbnail-workers. Untuk mengetahui informasi selengkapnya, lihat cara fungsi callback digunakan dalam kode sumber.

  5. Periksa hasil layanan:

    kubectl get services
    

    Di output, konfirmasi bahwa ada alamat IP eksternal di kolom EXTERNAL-IP untuk layanan photoalbum-service. Mungkin perlu waktu beberapa menit sampai semua layanan berjalan.

    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
    

    Catat alamat IP eksternal karena akan digunakan nanti. Dalam contoh ini, atribut berisi 146.148.111.115.

Menguji aplikasi album foto

  1. Untuk mengakses aplikasi yang di-deploy di browser web, buka URL berikut dan masukkan nama pengguna serta sandi yang Anda siapkan sebelumnya:

    http://EXTERNAL_IP
    

    Ganti EXTERNAL_IP dengan alamat IP yang Anda salin pada langkah sebelumnya.

  2. Untuk mengupload file gambar, klik Upload.

    Thumbnail placeholder yang ditampilkan saat Anda menunggu layanan untuk menghasilkan thumbnail unik.

    Placeholder thumbnail akan muncul di layar.

    Di latar belakang, layanan pembuatan thumbnail akan membuat thumbnail gambar yang diupload. Untuk melihat thumbnail yang dihasilkan, klik Refresh. Cloud Vision API menambahkan label gambar yang terdeteksi.

    Thumbnail dengan label gambar terkait.

    Untuk melihat gambar asli, klik thumbnail.

Menambahkan fitur deteksi gambar yang tidak pantas

Gambar berikut mengilustrasikan cara menggunakan notifikasi Pub/Sub untuk Cloud Storage guna memicu layanan yang mendeteksi konten tidak pantas. Fitur ini memburamkan gambar saat file baru dengan konten tidak pantas disimpan di bucket Cloud Storage.

Arsitektur fitur konten tidak pantas.

Pada gambar sebelumnya, layanan menggunakan fitur Deteksi Safe Search dari Vision API untuk mendeteksi konten tidak pantas dalam gambar.

Aplikasi foto memicu pembuat thumbnail dan pemeriksa gambar secara asinkron. Oleh karena itu, tidak ada jaminan bahwa perintah tersebut akan dijalankan dalam urutan tertentu. Jika pembuatan thumbnail terjadi sebelum gambar buram, Anda mungkin akan melihat thumbnail yang tidak pantas untuk sementara waktu. Namun, pemeriksa gambar pada akhirnya memburamkan gambar yang tidak pantas dan thumbnail yang tidak pantas.

Membuat topik Pub/Sub, langganan, dan notifikasi

  1. Di Cloud Shell, buat topik Pub/Sub bernama safeimage-service:

    gcloud pubsub topics create safeimage-service
    
  2. Buat langganan Pub/Sub bernama safeimage-workers:

    gcloud pubsub subscriptions create --topic safeimage-service \
        safeimage-workers
    
  3. Konfigurasikan notifikasi Pub/Sub sehingga pesan dikirim ke topik safeimage-service saat file baru diupload ke bucket Cloud Storage:

    gsutil notification create -t safeimage-service -f json \
        gs://${PROJECT_ID}-photostore
    

Mem-build dan men-deploy gambar pekerja

  1. Di Cloud Shell, mem-build image container untuk langganan safeimage-workers menggunakan Cloud Build:

    gcloud builds submit ./application/safeimage \
        -t us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker
    
  2. Perbarui manifes Deployment Kubernetes untuk layanan safe-image dengan ID project Google Cloud, nama koneksi Cloud SQL, dan ringkasan image container Anda:

    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
    

Membuat resource deployment

  1. Buat resource deployment yang disebut safeimage-deployment untuk men-deploy topik safeimage-service:

    kubectl create -f config/safeimage-deployment.yaml
    
  2. Periksa hasilnya:

    kubectl get pods
    

    Di output, konfirmasi bahwa ada tiga safeimage-worker pod yang STATUS nilainya adalahRunning.

    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
    

    Pod safeimage-worker berlangganan permintaan deteksi gambar yang tidak pantas dari langganan safeimage-workers. Untuk mengetahui informasi selengkapnya, lihat cara fungsi callback digunakan dalam kode sumber.

Menguji fitur deteksi gambar yang tidak pantas

Di bagian ini, Anda akan mengupload gambar pengujian untuk memverifikasi bahwa fitur Deteksi Safe Search memburamkan gambar yang tidak pantas. Gambar uji coba adalah gambar seorang gadis yang berpakaian seperti zombie (lisensi berdasarkan lisensi CC0 dari Pixaby).

  1. Download gambar uji coba.
  2. Untuk mengupload gambar, buka http://EXTERNAL_IP, lalu klik Upload.
  3. Klik Refresh. Aplikasi menampilkan thumbnail yang diburamkan.

    Thumbnail yang diburamkan.

    Untuk melihat apakah gambar yang diupload juga diburamkan, klik thumbnail.

Pembersihan

Jika tidak ingin menyimpan resource Google Cloud yang dibuat untuk aplikasi contoh, Anda dapat menghapusnya sehingga Anda tidak akan dikenai biaya untuk resource tersebut di masa mendatang. Anda dapat menghapus project sepenuhnya atau menghapus resource cluster lalu menghapus cluster.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource individual

Daripada menghapus project, Anda dapat menghapus resource individual yang telah dibuat.

  1. Hapus resource dari 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. Hapus cluster dari GKE:

    gcloud container clusters delete photoalbum-cluster --quiet
    
  3. Hapus repositori dari Artifact Registry:

    gcloud artifacts repositories delete photoalbum-repo --location us-central1 --quiet
    
  4. Hapus langganan dan topik dari 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. Hapus instance Cloud SQL:

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

    gsutil rm -r gs://${PROJECT_ID}-photostore
    gsutil rm -r gs://${PROJECT_ID}_cloudbuild
    
  7. Hapus file:

    cd ..
    rm -rf gke-photoalbum-example
    

Langkah selanjutnya