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 Go no App Engine para configurar o ambiente e o projeto, além de compreender como os aplicativos Go do App Engine são estruturados.
  • Anote e salve o código do 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:

    go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/pubsub
    cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/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 app.yaml

    Edite app.yaml para definir as variáveis de ambiente do código do projeto e do tópico:

    env_variables:
      PUBSUB_TOPIC: your-topic

    Análise do 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.

    os.Getenv("GOOGLE_CLOUD_PROJECT")
    os.Getenv("PUBSUB_TOPIC")
    

    As mensagens recebidas por essa instância são armazenadas em uma fatia:

    messages   []string
    

    A função pushHandler recebe mensagens enviadas e as adiciona à fatia messages:

    func pushHandler(w http.ResponseWriter, r *http.Request) {
    	msg := &pushRequest{}
    	if err := json.NewDecoder(r.Body).Decode(msg); err != nil {
    		http.Error(w, fmt.Sprintf("Could not decode body: %v", err), http.StatusBadRequest)
    		return
    	}
    
    	messagesMu.Lock()
    	defer messagesMu.Unlock()
    	// Limit to ten.
    	messages = append(messages, string(msg.Message.Data))
    	if len(messages) > maxMessages {
    		messages = messages[len(messages)-maxMessages:]
    	}
    }

    A função publishHandler publica novas mensagens no tópico.

    func publishHandler(w http.ResponseWriter, r *http.Request) {
    	ctx := context.Background()
    
    	msg := &pubsub.Message{
    		Data: []byte(r.FormValue("payload")),
    	}
    
    	if _, err := topic.Publish(ctx, msg).Get(ctx); err != nil {
    		http.Error(w, fmt.Sprintf("Could not publish message: %v", err), 500)
    		return
    	}
    
    	fmt.Fprint(w, "Message published.")
    }

    Executar a amostra localmente

    Ao fazer a execução localmente, use o Google Cloud SDK para fornecer autenticação e assim utilizar 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.

    Defina as variáveis de ambiente antes de iniciar o aplicativo:

    export GOOGLE_CLOUD_PROJECT=[your-project-id]
    export PUBSUB_TOPIC=[your-topic]
    go run pubsub.go
    

    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 Go