Создайте пул рабочих процессов Cloud Run для подписок Pub/Sub на основе Pull

1. Введение

Обзор

Пулы рабочих процессов — это ресурс Cloud Run, специально разработанный для рабочих нагрузок, не связанных с запросами, таких как очереди запросов. Обратите внимание, что пулы рабочих процессов не обладают следующими функциями:

  • Нет конечной точки/URL
  • Развернутому контейнеру не требуется прослушивать запросы на каком-либо порту.
  • Автоматическое масштабирование отсутствует.

В этом практическом задании вы создадите пул рабочих процессов, который будет непрерывно получать сообщения из подписки Pub/Sub с функцией pull. Подробнее о подписках Pub/Sub с функцией pull можно узнать в документации и в этом примере кода .

Что вы узнаете

  • Как создать и развернуть приложение в пуле рабочих процессов Cloud Run
  • Как получать сообщения из подписки Pub/Sub, основанной на механизме Pull-based

2. Настройка и требования

Для начала установите переменные окружения для этого практического задания:

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

Прежде чем начать использовать этот практический пример, активируйте следующие 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"

Наконец, предоставьте учетной записи службы Cloud Run доступ к PubSub:

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. Поздравляем!

Поздравляем с завершением практического занятия!

Мы рекомендуем ознакомиться с документацией Cloud Run .

Что мы рассмотрели

  • Как создать и развернуть приложение в пуле рабочих процессов Cloud Run
  • Как получать сообщения из подписки Pub/Sub, основанной на механизме Pull-based

8. Уборка

Чтобы удалить пул рабочих процессов Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/run и удалите пул рабочих процессов codelab-workers-pubsub .

Чтобы удалить весь проект, перейдите в раздел «Управление ресурсами» , выберите проект, созданный на шаге 2, и нажмите «Удалить». Если вы удалите проект, вам потребуется изменить проекты в вашем Cloud SDK. Вы можете просмотреть список всех доступных проектов, выполнив gcloud projects list .