Como gravar e responder mensagens do Pub/Sub

ID da região

O REGION_ID é um código abreviado que o Google atribui com base na região que você selecionou ao criar o aplicativo. O código não corresponde a um país ou estado, ainda que alguns IDs de região sejam semelhantes aos códigos de país e estado geralmente usados. A inclusão de REGION_ID.r em URLs do App Engine é opcional para aplicativos atuais. Em breve, será necessária para todos os aplicativos novos.

Para garantir uma transição tranquila, estamos atualizando o App Engine gradativamente para usar IDs de região. Se ainda não tivermos atualizado seu projeto do Google Cloud, você não verá um ID da região para o app. Como o ID é opcional para os apps atuais, não é necessário atualizar os URLs ou fazer outras alterações quando o ID da região está disponível para eles.

Saiba mais sobre IDs de região.

O Pub/Sub 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.

Neste documento, descrevemos como usar a biblioteca de cliente do Cloud para enviar e receber mensagens do Pub/Sub em um aplicativo Ruby.

Pré-requisitos

  • Siga as instruções em "Hello, World!" para o Ruby no Google App Engine para configurar seu ambiente e projeto e entender como os aplicativos em Ruby do Google App Engine são estruturados.
  • Anote e guarde o ID do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

    Como clonar o app de amostra

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

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
    cd ruby-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 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.REGION_ID.r.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.

    Como definir variáveis de ambiente

    Edite o arquivo app.yaml para definir as variáveis de ambiente para o 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 a Biblioteca de cliente do Cloud.

    O aplicativo de amostra usa os valores definidos no arquivo app.yaml para configurar variáveis de ambiente. O gerenciador da solicitação de push usa esses valores para confirmar que a solicitação veio do Pub/Sub e foi originada de 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 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
      @claims = claims
      @messages = messages
    
      slim :index
    end
    
    post "/publish" do
      topic.publish params[:payload]
    
      redirect "/", 303
    end

    Executar a amostra no local

    Ao executar localmente, use o SDK do Cloud para fornecer autenticação de uso das 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 notification endpoint de push local. A amostra inclui o sample_message.json do arquivo.

    É possível usar curl ou um cliente httpie para enviar uma solicitação POST HTTP:

    curl -i --data @sample_message.json "localhost:4567/pubsub/push?token=[your-token]"
    

    Ou

    http POST ":4567/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, é possível atualizar localhost:8080 e ver a mensagem na lista de mensagens recebidas.

    Como executar no App Engine

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

    gcloud app deploy app.yaml
    

    Agora, é possível acessar o aplicativo em https://PROJECT_ID.REGION_ID.r.appspot.com. Use o formulário para enviar mensagens, mas não há garantias de 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.