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.

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 Ruby do App Engine são estruturados.
  • Anote e salve o código do projeto porque 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/ruby-docs-samples
    cd ruby-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.yaml

    Edite o app.yaml para definir as variáveis de ambiente do código do projeto, do tópico e do 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

    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.

    Instale as dependências:

    bundle install
    

    Defina as variáveis do 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
    

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

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

    gcloud app deploy
    

    Agora você pode acessar 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…

Ambiente flexível do App Engine para documentos do Ruby