Pub/Sub 메시지 쓰기 및 응답

Cloud Pub/Sub는 애플리케이션 간의 신뢰도 높은 다대다 비동기 메시지 기능을 제공합니다. 게시자 애플리케이션은 메시지를 주제로 보낼 수 있으며 다른 애플리케이션은 주제를 구독하여 메시지를 수신할 수 있습니다.

이 문서에서는 Google Cloud 클라이언트 라이브러리를 사용하여 가변형 환경에서 실행 중인 앱에서 Cloud Pub/Sub 메시지를 보내고 받는 방법에 대해 설명합니다.

기본 요건

  • App Engine의 Node.js용 'Hello, World!' 안내에 따라 환경과 프로젝트를 설정하고 App Engine Node.js 앱의 구조화 방식을 이해합니다.
  • 이 문서에 설명된 샘플 애플리케이션을 실행할 때 필요하므로 프로젝트 ID를 기록해 둡니다.

샘플 앱 복제

샘플 앱을 로컬 머신에 복사하고 pubsub 디렉터리로 이동합니다.

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/pubsub

주제 및 구독 만들기

주제 및 구독을 만듭니다. 이 때 Pub/Sub 서버가 요청을 전송할 엔드포인트를 지정해야 합니다.

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic YOUR_TOPIC_NAME \
    --push-endpoint \
    https://YOUR_PROJECT_ID.appspot.com/pubsub/push?token=YOUR_TOKEN \
    --ack-deadline 10

YOUR_TOKEN을 무작위의 비밀 토큰으로 바꿉니다. 내보내기 엔드포인트에서 이 토큰을 사용해 요청을 확인합니다.

환경 변수 설정

app.flexible.yaml을 수정해 프로젝트 ID, 주제, 확인 토큰의 환경 변수를 설정합니다.

env_variables:
  PUBSUB_TOPIC: YOUR_TOPIC_NAME
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: YOUR_VERIFICATION_TOKEN

코드 검토

샘플 앱에서는 Google Cloud 클라이언트 라이브러리를 사용합니다.

샘플 앱에서는 app.flexible.yaml 파일에 설정된 값을 사용해 환경 변수를 구성합니다. 푸시 요청 핸들러에서는 이 값을 사용해 요청이 Pub/Sub에서 수신되었으며 신뢰할 수 있는 소스에서 보낸 것인지 확인합니다.

// The following environment variables are set by app.flexible.yaml when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
    projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);

샘플 앱에서는 전역 목록을 유지관리해 이 인스턴스에서 수신된 메시지를 저장합니다.

// List of all messages received by this instance
var messages = [];

이 메서드는 푸시된 메시지를 받아 messages 전역 목록에 추가합니다.

app.post('/pubsub/push', jsonBodyParser, (req, res) => {
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send();
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

  res.status(200).send();
});

이 메서드는 App Engine 웹 앱과 상호작용하여 새 메시지를 게시하고 수신된 메시지를 표시합니다.

app.get('/', (req, res) => {
  res.render('index', {messages, tokens, claims});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  const data = Buffer.from(req.body.payload);
  try {
    const messageId = await topic.publish(data);
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

로컬에서 샘플 실행

로컬에서 실행할 때 Cloud SDK를 사용하면 Google Cloud API 사용에 대한 인증을 제공할 수 있습니다. 기본 요건의 설명대로 환경을 설정했다면 이 인증을 제공하는 gcloud init 명령어를 이미 실행한 것입니다.

그런 다음 애플리케이션을 시작하기 전에 환경 변수를 설정합니다.

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

푸시 알림 시뮬레이션

애플리케이션은 로컬에서 메시지를 보낼 수 있지만 로컬에서 푸시 메시지를 받지는 못합니다. 하지만 로컬 푸시 알림 엔드포인트에 HTTP 요청을 전송하면 푸시 메시지를 시뮬레이션할 수 있습니다. 샘플에는 sample_message.json 파일이 포함되어 있습니다.

curl 또는 httpie를 사용하여 HTTP POST 요청을 보낼 수 있습니다.

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

또는

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

응답:

HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

요청이 완료되면 localhost:8080을 새로 고친 후 수신 메시지 목록에서 해당 메시지를 확인할 수 있습니다.

App Engine에서 실행

gcloud 명령줄 도구를 사용하여 App Engine에 데모 앱을 배포하려면 app.flexible.yaml이 위치한 디렉토리에서 다음 명령어를 실행합니다.

gcloud app deploy app.flexible.yaml

이제 https://[YOUR_PROJECT_ID].appspot.com에서 애플리케이션에 액세스할 수 있습니다. 양식을 사용하여 메시지를 제출할 수 있지만 애플리케이션에서 어떤 인스턴스가 알림을 수신하는지 보장하지는 못합니다. 여러 메시지를 전송하고 페이지를 새로 고쳐 수신된 메시지를 확인할 수 있습니다.