1. บทนำ
ภาพรวม
พูลผู้ปฏิบัติงานคือทรัพยากร Cloud Run ที่ออกแบบมาโดยเฉพาะสำหรับภาระงานที่ไม่ใช่คำขอ เช่น คิวการดึงข้อมูล โปรดทราบว่าพูลผู้ปฏิบัติงานไม่มีฟีเจอร์ต่อไปนี้
- ไม่มีปลายทาง/URL
- ไม่จำเป็นต้องให้คอนเทนเนอร์ที่ติดตั้งใช้งานรอรับคำขอที่พอร์ต
- ไม่มีการปรับขนาดอัตโนมัติ
ใน Codelab นี้ คุณจะสร้างพูลผู้ปฏิบัติงานที่จะดึงข้อความจากการสมัครใช้บริการแบบดึงของ Pub/Sub อย่างต่อเนื่อง ดูข้อมูลเพิ่มเติมเกี่ยวกับการสมัครใช้บริการแบบดึงของ Pub/Sub ได้ในเอกสารประกอบและตัวอย่างโค้ดนี้
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างและทำให้ใช้งานได้ในพูลผู้ปฏิบัติงาน Cloud Run
- วิธีดึงข้อมูลข้อความจากการสมัครใช้บริการ Pub/Sub ที่อิงตามการดึงข้อมูล
2. การตั้งค่าและข้อกำหนด
ก่อนอื่น ให้ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับ Codelab นี้
export PROJECT_ID=<your_project_id>
export REGION=<your_region>
export WORKER_POOL_NAME=codelab-workers-pubsub
export SERVICE_ACCOUNT=worker-pools-sa
export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
export TOPIC=pull-pubsub-topic
จากนั้นกำหนดค่า gcloud ให้ใช้รหัสโปรเจ็กต์
gcloud config set project $PROJECT_ID
ก่อนที่จะเริ่มใช้ Codelab นี้ได้ ให้เปิดใช้ API ต่อไปนี้โดยการเรียกใช้
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
สร้างบัญชีบริการโดยเรียกใช้คำสั่งต่อไปนี้
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
สุดท้าย ให้สิทธิ์เข้าถึง PubSub แก่บัญชีบริการ Cloud Run โดยทำดังนี้
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. สร้างพูลผู้ปฏิบัติงาน Cloud Run
ก่อนอื่น ให้สร้างไดเรกทอรีสำหรับโค้ดพูลผู้ปฏิบัติงาน
mkdir codelab-worker-pools
cd codelab-worker-pools
จากนั้นสร้างไฟล์ชื่อ package.json
{
"name": "codelab-worker-pools",
"version": "1.0.0",
"description": "A codelab example of a Cloud Run worker pool retrieving messages from a Pull-based PubSub subscription",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=22.0.0"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/pubsub": "^5.1.0"
}
}
ตอนนี้ให้สร้างไฟล์ชื่อ index.js โดยทำดังนี้
'use strict';
const subscriptionNameOrId = 'codelab-subscription';
const { PubSub } = require('@google-cloud/pubsub');
// Creates a Pub/Sub client; cache this for further use.
const pubSubClient = new PubSub();
// References an existing subscription.
const subscription = pubSubClient.subscription(subscriptionNameOrId);
// This function is called when a shutdown signal is received.
const handleShutdown = async (signal) => {
console.log(`\n${signal} signal caught. Shutting down gracefully...`);
try {
// 1. Stop listening for new messages. The `close()` method returns a Promise.
console.log('Closing Pub/Sub subscription...');
await subscription.close();
console.log('Pub/Sub subscription closed.');
// 2. Add any other cleanup logic here, like closing database connections.
} catch (err) {
console.error('Error during graceful shutdown:', err);
} finally {
console.log('Worker Pool exited.');
process.exit(0);
}
};
// Listen for termination signals.
// SIGINT handles Ctrl+C locally.
// SIGTERM handles signals from services like Cloud Run.
process.on('SIGINT', () => handleShutdown('SIGINT'));
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
// ------------------ Pub/Sub Message Handling ------------------
// Create an event handler to process incoming messages.
const messageHandler = message => {
console.log(`Received message ${message.id}:`);
console.log(`\tData: ${message.data}`);
console.log(`\tAttributes: ${JSON.stringify(message.attributes)}`);
// Ack the message so it is not sent again.
message.ack();
};
// Register the message handler and listen for messages.
subscription.on('message', messageHandler);
console.log(
`Worker started. Listening for messages on "${subscriptionNameOrId}".`
);
console.log('If running locally, press Ctrl+C to quit.');
// The application will now listen for messages indefinitely until a shutdown
// signal is received.
4. ติดตั้งใช้งานพูลผู้ปฏิบัติงาน
สร้างพูลผู้ปฏิบัติงาน Cloud Run โดยเรียกใช้คำสั่งต่อไปนี้
gcloud beta run worker-pools deploy $WORKER_POOL_NAME \
--region=$REGION \
--source . \
--service-account $SERVICE_ACCOUNT_EMAIL
คำสั่งนี้จะสร้างอิมเมจจากแหล่งที่มาและทำให้งานใช้งานได้ ซึ่งอาจใช้เวลาดำเนินการสักครู่
5. เผยแพร่ข้อความไปยัง PubSub
สร้างหัวข้อ PubSub
gcloud pubsub topics create $TOPIC
สร้างการสมัครใช้บริการ PubSub แบบดึงข้อมูล
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
เรียกใช้คำสั่งต่อไปนี้เพื่อเผยแพร่ข้อความไปยังหัวข้อ PubSub
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
ตรวจสอบบันทึกสำหรับพูลผู้ปฏิบัติงาน
gcloud logging read 'resource.type="cloud_run_worker_pool" AND resource.labels.worker_pool_name="'$WORKER_POOL_NAME'" AND resource.labels.location="'$REGION'"' --limit 10
คุณควรเห็น Hello Worker Pools ในบันทึก
6. ลบพูลผู้ปฏิบัติงาน
เนื่องจากพูลผู้ปฏิบัติงานทำงานอย่างต่อเนื่อง คุณจึงควรลบพูลผู้ปฏิบัติงาน
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. ยินดีด้วย
ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์
เราขอแนะนำให้อ่านเอกสารประกอบของ Cloud Run
สิ่งที่เราได้พูดถึงไปแล้ว
- วิธีสร้างและทำให้ใช้งานได้ในพูลผู้ปฏิบัติงาน Cloud Run
- วิธีดึงข้อมูลข้อความจากการสมัครใช้บริการ Pub/Sub ที่อิงตามการดึงข้อมูล
8. ล้างข้อมูล
หากต้องการลบกลุ่ม Worker ของ Cloud Run ให้ไปที่ Cloud Console ของ Cloud Run ที่ https://console.cloud.google.com/run แล้วลบcodelab-workers-pubsubกลุ่ม Worker
หากต้องการลบทั้งโปรเจ็กต์ ให้ไปที่จัดการทรัพยากร เลือกโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่พร้อมใช้งานได้โดยเรียกใช้ gcloud projects list