Como gravar e responder mensagens do Pub/Sub

O Cloud Pub/Sub transmite 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 se inscrever nele para receber as mensagens.

Este documento descreve como usar a Biblioteca de Cliente do Google Cloud para enviar e receber mensagens Cloud Pub/Sub em um aplicativo em Go.

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 a estrutura de aplicativos em Go no App Engine.
  • 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:

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

Como definir variáveis de ambiente

Edite o arquivo app.yaml para definir as variáveis de ambiente para o tópico e o token de verificação:

env_variables:
  PUBSUB_TOPIC: your-topic
  # 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

No aplicativo de amostra, é usada a Biblioteca de cliente do Google Cloud Pub/Sub.

O aplicativo de amostra usa as variáveis de ambiente que você define no arquivo app.yaml (PUBSUB_TOPIC e PUBSUB_VERIFICATION_TOKEN) para configuração.

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

messages   []string

A função pushHandler recebe mensagens enviadas, verifica o token e adiciona a mensagem à fração messages:


func pushHandler(w http.ResponseWriter, r *http.Request) {
	// Verify the token.
	if r.URL.Query().Get("token") != token {
		http.Error(w, "Bad token", http.StatusBadRequest)
	}
	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.")
}

Como executar a amostra no local

Ao executar no local, 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.

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

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

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 o cliente curl ou httpie (em inglês) para enviar um pedido 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
Date: Tue, 13 Nov 2018 16:04:18 GMT
Content-Length: 0

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