1. Giới thiệu
Tổng quan
Nhóm worker là một tài nguyên Cloud Run được thiết kế dành riêng cho các tải công việc không phải là yêu cầu, chẳng hạn như hàng đợi kéo. Xin lưu ý rằng nhóm nhân viên không có các tính năng sau:
- Không có điểm cuối/URL
- Không có yêu cầu nào về việc vùng chứa được triển khai phải lắng nghe các yêu cầu tại một cổng
- Không có tính năng tự động cấp tài nguyên bổ sung
Trong lớp học lập trình này, bạn sẽ tạo một nhóm worker liên tục truy xuất các thông báo từ một gói thuê bao kéo Pub/Sub. Bạn có thể tìm hiểu thêm về các thuê bao kéo Pub/Sub trong tài liệu và trong ví dụ về mã này.
Kiến thức bạn sẽ học được
- Cách tạo và triển khai cho một nhóm worker Cloud Run
- Cách truy xuất tin nhắn từ gói thuê bao Pub/Sub dựa trên thao tác kéo
2. Thiết lập và yêu cầu
Trước tiên, hãy thiết lập các biến môi trường cho lớp học lập trình này:
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
Tiếp theo, hãy định cấu hình gcloud để sử dụng mã dự án của bạn
gcloud config set project $PROJECT_ID
Trước khi có thể bắt đầu sử dụng lớp học lập trình này, hãy bật các API sau bằng cách chạy:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Tạo tài khoản dịch vụ bằng cách chạy:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Cuối cùng, hãy cấp cho tài khoản dịch vụ Cloud Run quyền truy cập vào PubSub:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Tạo nhóm nhân viên Cloud Run
Trước tiên, hãy tạo một thư mục cho mã nhóm worker:
mkdir codelab-worker-pools
cd codelab-worker-pools
Tiếp theo, hãy tạo một tệp có tên là 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"
}
}
Bây giờ, hãy tạo một tệp có tên là index.js
:
'use strict';
const subscriptionNameOrId = 'pull-pubsub-topic';
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. Triển khai Nhóm nhân viên
Tạo nhóm worker Cloud Run bằng cách chạy lệnh sau:
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Lệnh này tạo hình ảnh từ nguồn và triển khai tác vụ. Quá trình này sẽ mất vài phút để hoàn tất.
5. Xuất bản thông báo lên PubSub
Tạo một chủ đề PubSub
gcloud pubsub topics create $TOPIC
Tạo gói thuê bao kéo PubSub
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Chạy lệnh sau để xuất bản thông báo lên chủ đề PubSub của bạn.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Kiểm tra nhật ký cho nhóm worker
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
Bạn sẽ thấy Hello Worker Pools
trong nhật ký.
6. Xoá nhóm nhân viên
Vì nhóm nhân viên chạy liên tục, nên bạn cần xoá nhóm nhân viên.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. Xin chúc mừng!
Chúc mừng bạn đã hoàn thành lớp học lập trình này!
Bạn nên xem tài liệu về Cloud Run.
Nội dung đã đề cập
- Cách tạo và triển khai vào một nhóm worker Cloud Run
- Cách truy xuất tin nhắn từ gói thuê bao Pub/Sub dựa trên thao tác kéo
8. Dọn dẹp
Để xoá nhóm worker Cloud Run, hãy truy cập vào Cloud Run Cloud Console tại https://console.cloud.google.com/run rồi xoá nhóm worker codelab-workers-pubsub
.
Để xoá toàn bộ dự án, hãy chuyển đến phần Quản lý tài nguyên, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list
.