Como gravar e responder a mensagens do Pub/Sub

O Google Cloud Pub/Sub fornece mensagens assíncronas confiáveis de muitos para muitos entre aplicativos. Os aplicativos do editor podem enviar mensagens para um tópico, e outros aplicativos podem se inscrever nele para receber as mensagens.

Este documento mostra como usar a biblioteca de cliente do Google Cloud para enviar e receber mensagens do Google Cloud Pub/Sub em um app executado no ambiente flexível.

Pré-requisitos

  • Siga as instruções em "Hello, World!" para Node.js no App Engine para configurar o ambiente e o projeto, além de compreender como aplicativos Node.js do App Engine são estruturados.
  • Anote e guarde o código do seu projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

    Clonar o aplicativo de amostra

    Copie os aplicativos de amostra para sua máquina local e navegue até o diretório do pubsub:

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

    Criar um tópico e inscrição

    Crie um tópico e inscrição. Isso inclui especificar o ponto de extremidade que receberá as solicitações do 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
    

    Substitua YOUR_TOKEN por um token aleatório secreto. Ele é usado pelo ponto de extremidade do push para verificar as solicitações.

    Editar o app.flexible.yaml

    Edite o app.flexible.yaml para configurar as variáveis de ambiente para o código de projeto, tópico e token de verificação:

    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

    Revisão de código

    No aplicativo de amostra, são usadas as Bibliotecas do Google Cloud Client.

    Para configurar variáveis de ambiente, no aplicativo de amostra são usados os valores definidos no arquivo app.flexible.yaml. Esses valores são usados pelo gerenciador da solicitação de push para confirmar que a solicitação veio do Pub/Sub e foi originada de uma fonte confiável:

    // 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);
    

    No aplicativo de amostra, é mantida uma lista global para armazenar as mensagens recebidas por esta instância:

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

    As mensagens enviadas são recebidas por este método e adicionadas à lista global 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();
    });

    Para publicar novas mensagens e exibir as recebidas, é feita uma interação entre este método e o app da Web do 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');
      });
    });

    Executar a amostra localmente

    Ao executar localmente, você pode usar o Google Cloud SDK para fornecer autenticação visando usar as APIs do Google Cloud. Supondo que o ambiente tenha sido configurado conforme descrito em Pré-requisitos, o comando gcloud init que fornece essa autenticação já foi executado.

    Em seguida, defina as variáveis de ambiente antes de iniciar o aplicativo:

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

    Simular notificações por push

    Pelo aplicativo, é possível enviar mensagens localmente, mas não é possível receber mensagens push localmente. É possível simular uma mensagem de push com uma solicitação HTTP para o ponto de extremidade da notificação local. A amostra inclui o arquivo sample_message.json.

    Use curl ou httpie para enviar uma solicitação HTTP POST:

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

    Ou

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

    Resposta:

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

    Após a conclusão da solicitação, atualize localhost:8080 e veja a mensagem na lista de mensagens recebidas.

    Executar no App Engine

    Para implantar o aplicativo de demonstração no App Engine usando a ferramenta de linha de comando gcloud, execute o seguinte comando no diretório em que o app.flexible.yaml estiver localizado:

    gcloud app deploy app.flexible.yaml
    

    Agora, acesse o aplicativo em https://[YOUR_PROJECT_ID].appspot.com. Você pode usar o formulário para enviar mensagens. No entanto, não há garantias sobre qual instância do seu aplicativo receberá a notificação. É possível enviar várias mensagens e atualizar a página para ver a mensagem recebida.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentos do ambiente flexível do App Engine para Node.js