Tutorial ini menunjukkan cara membuat layanan chat real-time multi-ruangan menggunakan WebSockets dengan koneksi persisten untuk komunikasi dua arah. Dengan WebSockets, klien dan server dapat mengirim pesan satu sama lain tanpa melakukan polling di server untuk update.
Meskipun Anda dapat mengonfigurasi Cloud Run untuk menggunakan afinitas sesi, hal ini memberikan afinitas upaya terbaik, yang berarti bahwa setiap permintaan baru masih dapat berpotensi dirutekan ke instance yang berbeda. Akibatnya, pesan pengguna dalam layanan chat perlu disinkronkan di semua instance, bukan hanya antara klien yang terhubung ke satu instance.
Desain untuk layanan chat real-time
Layanan chat contoh ini menggunakan instance Memorystore for Redis untuk menyimpan dan menyinkronkan pesan pengguna di semua instance. Redis menggunakan mekanisme Pub/Sub, yang berbeda dengan produk Cloud Pub/Sub, untuk mengirim data ke klien yang berlangganan yang terhubung ke instance apa pun, guna menghilangkan polling HTTP untuk update.
Namun, meskipun dengan update push, instance apa pun yang dijalankan hanya akan menerima pesan baru yang dikirim ke container. Untuk memuat pesan sebelumnya, histori pesan harus disimpan dan diambil dari solusi penyimpanan persisten. Contoh ini menggunakan fungsi konvensional Redis tentang penyimpanan objek untuk meng-cache dan mengambil histori pesan.
Instance Redis dilindungi dari internet menggunakan IP pribadi dengan akses yang dikontrol dan terbatas untuk layanan yang berjalan pada Virtual Private Network yang sama dengan instance Redis. Sebaiknya gunakan traffic keluar VPC Langsung.
Batasan
Tutorial ini tidak menunjukkan autentikasi pengguna akhir atau cache sesi. Untuk mempelajari autentikasi pengguna akhir lebih lanjut, lihat tutorial Cloud Run untuk autentikasi pengguna akhir.
Tutorial ini tidak menerapkan database seperti Firestore untuk penyimpanan tanpa batas dan pengambilan histori pesan chat.
Elemen tambahan diperlukan agar layanan contoh ini siap produksi. Sebaiknya gunakan instance Redis Tingkat Standar untuk menyediakan Ketersediaan Tinggi menggunakan replikasi dan failover otomatis.
Tujuan
Menulis, membangun, dan men-deploy layanan Cloud Run yang menggunakan WebSockets.
Menghubungkan ke instance Memorystore untuk Redis untuk memublikasikan dan berlangganan ke pesan baru di berbagai instance.
Menghubungkan layanan Cloud Run dengan Memorystore menggunakan Traffic keluar VPC Langsung.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Memorystore for Redis, Artifact Registry, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - Instal dan lakukan inisialisasi gcloud CLI.
-
Pembaca Artifact Registry (
roles/artifactregistry.reader) -
Editor Cloud Build (
roles/cloudbuild.builds.editor) -
Admin Cloud Memorystore Redis (
roles/redis.admin) -
Admin Cloud Run (
roles/run.admin) -
Buat Akun Layanan (
roles/iam.serviceAccountCreator) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin) -
Service Account Admin (
roles/iam.serviceAccountAdmin) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Menyiapkan default gcloud
Untuk mengonfigurasi gcloud dengan setelan default untuk layanan Cloud Run Anda:
Setel project default Anda:
gcloud config set project PROJECT_ID
Ganti PROJECT_ID dengan nama project yang Anda buat untuk tutorial ini.
Konfigurasi gcloud untuk region yang Anda pilih:
gcloud config set run/region REGION
Ganti REGION dengan region Cloud Run pilihan Anda yang didukung.
Lokasi Cloud Run
Cloud Run bersifat regional, berarti infrastruktur yang
menjalankan layanan Cloud Run Anda terletak di region tertentu dan
dikelola oleh Google agar tersedia secara redundan di
semua zona dalam region tersebut.
Memenuhi persyaratan latensi, ketersediaan, atau ketahanan adalah faktor utama
untuk memilih region tempat layanan Cloud Run dijalankan.
Pada umumnya, Anda dapat memilih region yang paling dekat dengan pengguna Anda, tetapi Anda harus mempertimbangkan
lokasi produk Google Cloud
lainnya yang digunakan oleh layanan Cloud Run Anda.
Menggunakan Google Cloud produk secara bersamaan di beberapa lokasi dapat memengaruhi
latensi serta biaya layanan Anda.
Cloud Run tersedia di region berikut:
Tergantung harga Tingkat 1
asia-east1(Taiwan)asia-northeast1(Tokyo)asia-northeast2(Osaka)asia-south1(Mumbai, India)europe-north1(Finlandia)CO2 Rendah
europe-north2(Stockholm)CO2 Rendah
europe-southwest1(Madrid)CO2 Rendah
europe-west1(Belgia)CO2 Rendah
europe-west4(Belanda)CO2 Rendah
europe-west8(Milan)europe-west9(Paris)CO2 Rendah
me-west1(Tel Aviv)northamerica-south1(Meksiko)us-central1(Iowa)CO2 Rendah
us-east1(South Carolina)us-east4(North Virginia)us-east5(Columbus)us-south1(Dallas)CO2 Rendah
us-west1(Oregon)CO2 Rendah
Tergantung harga Tingkat 2
africa-south1(Johannesburg)asia-east2(Hong Kong)asia-northeast3(Seoul, Korea Selatan)asia-southeast1(Singapura)asia-southeast2(Jakarta)asia-south2(Delhi, India)australia-southeast1(Sydney)australia-southeast2(Melbourne)europe-central2(Warsawa, Polandia)europe-west10(Berlin)europe-west12(Turin)europe-west2(London, Inggris Raya)CO2 Rendah
europe-west3(Frankfurt, Jerman)europe-west6(Zurich, Swiss)CO2 Rendah
me-central1(Doha)me-central2(Dammam)northamerica-northeast1(Montreal)CO2 Rendah
northamerica-northeast2(Toronto)CO2 Rendah
southamerica-east1(Sao Paulo, Brasil)CO2 Rendah
southamerica-west1(Santiago, Cile)CO2 Rendah
us-west2(Los Angeles)us-west3(Salt Lake City)us-west4(Las Vegas)
Jika sudah membuat layanan Cloud Run, Anda dapat melihat region di dasbor Cloud Run di konsolGoogle Cloud .
Mengambil contoh kode
Untuk mengambil contoh kode agar dapat digunakan:
Clone repositori contoh ke komputer lokal Anda:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Atau, Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya.
Ubah ke direktori yang memuat kode contoh Cloud Run:
Node.js
cd nodejs-docs-samples/run/websockets/
Memahami kode WebSockets
Socket.io adalah library yang memungkinkan komunikasi dua arah secara real-time antara browser dan server. Meskipun bukan implementasi WebSocket, Socket.io menggabungkan fungsi untuk menyediakan API yang lebih sederhana bagi beberapa protokol komunikasi dengan fitur tambahan seperti keandalan yang lebih baik, sambungan ulang otomatis, dan menyiarkan pesan ke semua atau sebagian klien.
Integrasi sisi klien
Klien membuat instance instance Socket baru untuk setiap koneksi. Karena contoh ini dirender di sisi server, URL server tidak perlu ditentukan. Instance soket dapat memunculkan dan memproses peristiwa.
Integrasi sisi server
Di sisi server, server Socket.io diinisialisasi dan dipasang ke server HTTP. Mirip dengan sisi klien, setelah server Socket.io membuat koneksi ke klien, instance socket dibuat untuk setiap koneksi yang dapat digunakan untuk memunculkan dan memproses pesan. Socket.io juga menyediakan antarmuka untuk membuat "ruang" atau saluran arbitrer tempat soket dapat bergabung dan keluar.
Socket.io juga menyediakan adaptor Redis untuk menyiarkan peristiwa ke semua klien, terlepas dari server mana yang melayani soket. Socket.io hanya menggunakan mekanisme Pub/Sub Redis dan tidak menyimpan data apa pun.
Adaptor Redis Socket.io dapat menggunakan kembali klien Redis yang digunakan untuk menyimpan histori pesan ruang. Setiap container akan membuat koneksi ke instance Redis dan Cloud Run dapat membuat instance dalam jumlah besar. Koneksi ini jauh di bawah 65.000 koneksi yang dapat didukung Redis.
Sambungan ulang
Cloud Run memiliki waktu tunggu maksimum 60 menit. Jadi, Anda perlu menambahkan logika sambungan ulang untuk kemungkinan waktu tunggu. Dalam beberapa kasus, Socket.io secara otomatis mencoba menghubungkan kembali setelah peristiwa pemutusan koneksi atau error koneksi. Tidak ada jaminan bahwa klien akan terhubung kembali ke instance yang sama.
Instance akan tetap ada jika ada koneksi yang aktif hingga semua permintaan ditutup atau waktu habis. Meskipun Anda menggunakan afinitas sesi Cloud Run, permintaan baru dapat di-load balanced ke container aktif, sehingga container dapat menurunkan skala. Jika Anda khawatir mengenai banyaknya container yang terus ada setelah terjadi lonjakan traffic, Anda dapat menurunkan nilai waktu tunggu maksimum agar soket yang tidak digunakan lebih sering dibersihkan.
Mengirimkan layanan
Buat instance Memorystore untuk Redis:
gcloud redis instances create INSTANCE_ID --size=1 --region=REGION
Ganti kode berikut:
- INSTANCE_ID: nama instance—misalnya,
my-redis-instance. - REGION_ID: region
untuk semua resource dan layanan Anda—misalnya,
europe-west1.
Instance akan secara otomatis mendapatkan alokasi rentang IP dari rentang jaringan layanan default. Tutorial ini menggunakan memori 1 GB untuk cache lokal pesan dalam instance Redis. Pelajari lebih lanjut cara Menentukan ukuran awal instance Memorystore untuk kasus penggunaan Anda.
- INSTANCE_ID: nama instance—misalnya,
Tentukan variabel lingkungan dengan alamat IP jaringan yang diizinkan instance Redis:
export REDISHOST=$(gcloud redis instances describe INSTANCE_ID --region REGION --format "value(host)")
Buat akun layanan untuk dijadikan sebagai identitas layanan. Secara default, opsi ini tidak memiliki hak istimewa selain keanggotaan project.
gcloud iam service-accounts create chat-identity gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:chat-identity@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageConsumer
Temukan nama jaringan VPC yang diberi otorisasi instance Redis Anda dengan menjalankan perintah berikut:
gcloud redis instances describe INSTANCE_ID --region REGION --format "value(authorizedNetwork)"
Ganti kode berikut:
- INSTANCE_ID: nama instance—misalnya,
my-redis-instance. - REGION_ID: region
untuk semua resource dan layanan Anda—misalnya,
europe-west1.
Catat nama jaringan VPC.
- INSTANCE_ID: nama instance—misalnya,
Bangun dan deploy image container ke Cloud Run:
gcloud run deploy chat-app --source . \ --allow-unauthenticated \ --timeout 3600 \ --service-account chat-identity \ --network NETWORK \ --subnet SUBNET \ --update-env-vars REDISHOST=$REDISHOST
Ganti kode berikut:
- NETWORK adalah nama jaringan VPC resmi yang terhubung ke instance Redis Anda.
- SUBNET adalah nama subnet Anda. Subnet harus
berukuran
/26atau lebih besar. Traffic keluar VPC langsung mendukung rentang IPv4 RFC 1918, RFC 6598, dan Class E.
Merespon setiap permintaan untuk menginstal API yang diperlukan dengan merespons
yketika diminta. Anda hanya perlu melakukan ini sekali untuk sebuah project. Merespons permintaan lainnya dengan menyediakan platform dan region, jika Anda belum menetapkan setelan default untuk permintaan tersebut seperti yang dijelaskan di halaman penyiapan. Pelajari lebih lanjut cara Men-deploy dari kode sumber.
Mencoba layanan
Untuk mencoba layanan lengkap:
Buka browser Anda ke URL yang diberikan pada langkah deployment.
Tambahkan nama Anda dan ruang chat untuk login.
Kirim pesan ke ruang.
Jika Anda memilih untuk terus mengembangkan layanan ini, perlu diingat bahwa layanan tersebut telah membatasi akses Identity and Access Management (IAM) ke bagian lain dari Google Cloud dan perlu diberi peran IAM tambahan guna mengakses banyak layanan lainnya.
Pembersihan
Agar tidak menimbulkan biaya tambahan pada akun Google Cloud Anda, hapus semua resource yang Anda deploy dengan tutorial ini.
Menghapus project
Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan perlu mempertahankannya tanpa perubahan yang Anda tambahkan dalam tutorial ini, hapus resource yang Anda buat untuk tutorial.
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Menghapus resource tutorial
Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini. Layanan Cloud Run tidak menimbulkan biaya hingga menerima permintaan.
Untuk menghapus layanan Cloud Run, jalankan perintah berikut:
gcloud run services delete SERVICE-NAME
Ganti SERVICE-NAME dengan nama layanan Anda.
Anda juga dapat menghapus layanan Cloud Run dari Google Cloud console.
Hapus konfigurasi region default
gcloudyang Anda tambahkan selama penyiapan tutorial:gcloud config unset run/regionHapus konfigurasi project:
gcloud config unset projectHapus resource Google Cloud lain yang dibuat dalam tutorial ini:
- Hapus image container layanan yang bernama
gcr.io/PROJECT_ID/chat-appdari Artifact Registry - Hapus akun layanan
chat-identity@PROJECT_ID.iam.gserviceaccount.com - Hapus instance Memorystore untuk Redis
- Hapus image container layanan yang bernama
Langkah berikutnya
Pelajari lebih lanjut cara kerja Socket.io dan penggunaan lebih lanjut.
Pelajari lebih lanjut Traffic keluar VPC langsung dengan jaringan VPC.
Tinjau praktik terbaik untuk Memorystore dan untuk Penggunaan WebSockets di Cloud Run.