Como gravar e responder a mensagens do Pub/Sub

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

Pré-requisitos

  • Siga as instruções em "Hello, World!" para Ruby no App Engine para configurar o ambiente e o projeto, além de compreender como os aplicativos em Ruby do App Engine são estruturados.
  • Anote e salve o ID 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/ruby-docs-samples
cd ruby-docs-samples/appengine/pubsub

Como criar um tópico e uma assinatura

Ao criar um tópico e uma assinatura, especifique 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 arquivo app.yaml para configurar as variáveis de ambiente do seu ID do 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-token>

Revisão de código

O aplicativo de amostra usa as bibliotecas de cliente do Google Cloud.

O aplicativo de amostra utiliza os valores definidos no arquivo app.yaml para configurar as variáveis do ambiente. O gerenciador da solicitação de push usa esses valores para confirmar que a solicitação veio do Pub/Sub e foi originada em uma fonte confiável:

topic  = pubsub.topic ENV["PUBSUB_TOPIC"]
PUBSUB_VERIFICATION_TOKEN = ENV["PUBSUB_VERIFICATION_TOKEN"]

O aplicativo de amostra mantém uma lista global para armazenar as mensagens recebidas por esta instância:

# List of all messages received by this instance
messages = []

Este método recebe mensagens enviadas e as adiciona à lista global messages:

post "/pubsub/push" do
  halt 400 if params[:token] != PUBSUB_VERIFICATION_TOKEN

  message = JSON.parse request.body.read
  payload = Base64.decode64 message["message"]["data"]

  messages.push payload
end

Este método interage com o app da Web do App Engine para publicar novas mensagens e exibir as recebidas:

get "/" do
  @messages = messages

  slim :index
end

post "/publish" do
  topic.publish params[:payload]

  redirect "/", 303
end

Como executar a amostra no local

Com o SDK do Cloud em execução no local, é possível fornecer autenticação para usar as APIs do 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.

Instale as dependências:

bundle install

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]
bundle exec ruby app.rb -p 8080

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 endpoint da notificação local. A amostra inclui o arquivo sample_message.json.

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

curl -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
Content-Type: text/html;charset=utf-8
Content-Length: 13
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)
Date: Wed, 20 Apr 2016 20:56:23 GMT
Connection: Keep-Alive

Hello, World!

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 arquivo app.yaml está localizado:

gcloud app deploy

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.