Pub/Sub 메시지 쓰기 및 응답

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

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

선행 조건

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

    샘플 앱 복제

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

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

    주제 및 구독 만들기

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

    gcloud beta pubsub topics create YOUR_TOPIC_NAME
    gcloud beta 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 편집

    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: messages });
    });
    
    app.post('/', formBodyParser, (req, res, next) => {
      if (!req.body.payload) {
        res.status(400).send('Missing payload');
        return;
      }
    
      publisher.publish(Buffer.from(req.body.payload), (err) => {
        if (err) {
          next(err);
          return;
        }
        res.status(200).send('Message sent');
      });
    });

    로컬에서 샘플 실행

    로컬에서 실행할 때 Google 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 ":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에서 애플리케이션에 액세스할 수 있습니다. 양식을 사용해 메시지를 제출할 수 있지만 애플리케이션에서 알림을 수신할 인스턴스가 무엇인지는 정확히 알 수 없습니다. 여러 개의 메시지를 전송하고 페이지를 새로 고쳐 수신된 메시지를 확인해도 됩니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Node.js 문서용 App Engine 가변형 환경