Como gravar e responder a mensagens do Pub/Sub

O 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.

Neste documento, descrevemos como usar a Biblioteca de cliente do Google Cloud para enviar e receber mensagens do Cloud Pub/Sub em um aplicativo em execução 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 do App Engine em Node.js são estruturados.
  • Anote e guarde o código do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

Como 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

Como criar um tópico e uma assinatura

Crie um tópico e uma assinatura. Isso inclui especificar o endpoint que receberá as solicitações do servidor do 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

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

Definir variáveis de ambiente

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 = [];

Este método recebe mensagens enviadas e as adiciona à 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, 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);
  }
});

Como executar o exemplo no local

Ao executar localmente, é possível usar o SDK do Cloud para fornecer autenticação de uso das APIs Google Cloud. Se o ambiente tiver sido configurado conforme descrito em Pré-requisitos, o comando gcloud init, que fornece essa autenticação, já terá sido executado.

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

Como simular notificações 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 (em inglês) para enviar uma solicitação HTTP POST:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost: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.

Como 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