Crie um sistema Pub/Sub de um para muitos

Neste tutorial, você verá como configurar um conjunto de aplicativos que se comunicam enviando mensagens pelo Pub/Sub em vez de RPCs síncronos. Com a separação dos aplicativos, as mensagens:

  • tornam os aplicativos mais robustos;
  • podem simplificar o desenvolvimento.

Por exemplo, o autor da chamada (editor) não precisa que o receptor (assinante) esteja ativo e disponível. Ele simplesmente envia uma mensagem ao Pub/Sub. O editor também não precisa saber quais e quantos aplicativos de assinante precisam receber a mensagem. Como resultado, o serviço pode ser confiável para entregar a mensagem a um ou mais aplicativos do assinante sempre que estiverem disponíveis.

Visão geral do sistema

Neste tutorial, você inicia um aplicativo de editor que envia uma mensagem "Hello, World!" para dois assinantes usando a comunicação um para muitos, conforme ilustrado no diagrama a seguir:

Diagrama do tópico, assinaturas anexadas e os aplicativos de editor e de assinante que enviam e recebem mensagens do Cloud Pub/Sub

Os dois aplicativos de assinante usam o mesmo código, mas são iniciados em momentos diferentes. Esse processo demonstra como o Pub/Sub permite a comunicação assíncrona. Para criar esse sistema, conclua as seguintes etapas:

  1. Crie uma conta de serviço do IAM que os aplicativos usem para autenticação.
  2. Configure as permissões do IAM.
  3. Crie um tópico do Pub/Sub e uma assinatura.
  4. Inicie três aplicativos independentes: um editor e dois assinantes.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a CLI do Google Cloud.
  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Ative a API Pub/Sub:

    gcloud services enable pubsub.googleapis.com
  7. Crie as credenciais de autenticação para sua Conta do Google:

    gcloud auth application-default login
  8. Atribua os papéis à sua Conta do Google. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Substitua PROJECT_ID pela ID do seu projeto.
    • Substitua EMAIL_ADDRESS pelo seu endereço de e-mail.
    • Substitua ROLE por cada papel individual.
  9. Instale a CLI do Google Cloud.
  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  12. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  13. Ative a API Pub/Sub:

    gcloud services enable pubsub.googleapis.com
  14. Crie as credenciais de autenticação para sua Conta do Google:

    gcloud auth application-default login
  15. Atribua os papéis à sua Conta do Google. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Substitua PROJECT_ID pela ID do seu projeto.
    • Substitua EMAIL_ADDRESS pelo seu endereço de e-mail.
    • Substitua ROLE por cada papel individual.

Instalar o Python

Neste tutorial, usamos as bibliotecas de cliente do Pub/Sub, que exigem o Python 3.7 ou versão mais recente. Siga as instruções para instalar o Python.

Configurar seu projeto do Pub/Sub

Para gerenciar o fluxo de mensagens entre a publicação e a assinatura de aplicativos, crie um tópico e duas assinaturas diferentes.

Criar um tópico do Pub/Sub.

Crie um tópico com o ID hello_topic:

gcloud pubsub topics create hello_topic

Criar assinaturas do Pub/Sub

Crie duas assinaturas e anexe-as ao tópico.

Essas assinaturas são uma assinatura StreamingPull, que é um tipo de assinatura pull.

Assinatura 1

Crie uma assinatura com o ID sub_one e anexe-a ao hello_topic.

gcloud pubsub subscriptions create sub_one --topic=hello_topic

Assinatura 2

Crie uma assinatura com o ID sub_two e anexe-a ao hello_topic.

gcloud pubsub subscriptions create sub_two --topic=hello_topic

Criar o sistema de um para muitos

Fazer o download do código de editor e de assinante

  1. Faça o download dos arquivos Python do Pub/Sub necessários para este tutorial.

     git clone https://github.com/googleapis/python-pubsub.git
    
  2. Feche todos os terminais abertos antes de continuar.

Configurar três terminais

  1. Inicie um terminal para cada aplicativo do tutorial (um editor e dois assinantes). Por conveniência, este tutorial chama estes terminais:

    • terminal de editor: publisher;
    • terminal de assinante 1: sub_one;
    • terminal de assinante 2: sub_two.
  2. No terminal publisher, crie e ative um ambiente virtual Python chamado pyenv-qs.

    Bash

    python -m venv pyenv-qs
    source pyenv-qs/bin/activate
    

    PowerShell

    py -m venv pyenv-qs
    .\pyenv-qs\Scripts\activate
    

    Nos terminais sub_one e sub_two, execute o seguinte comando:

    Bash

    source pyenv-qs/bin/activate
    

    PowerShell

    .\pyenv-qs\Scripts\activate
    

    Depois de executar o comando enable, o prompt de comando incluirá o valor (pyenv-qs) $ a seguir.

  3. No terminal publisher, instale a biblioteca de cliente Python do Pub/Sub usando pip:

    python -m pip install --upgrade google-cloud-pubsub
  4. Nos três terminais, configure uma variável de ambiente com o ID do projeto atual. Este comando da gcloud determina o ID do projeto selecionado e o define como uma variável:

    Bash

    export PROJECT=`gcloud config get-value project`
    

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
    
  5. Nos três terminais, mude para o caminho do projeto que contém o exemplo de código.

    cd python-pubsub/samples/snippets/quickstart/
    

Iniciar os aplicativos e observar o fluxo de mensagens

Iniciar o aplicativo de assinante 1

No terminal sub_one, inicie o assinante 1:

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

Depois de iniciado, o aplicativo abre uma conexão de streaming bidirecional com o servidor. O Pub/Sub entrega mensagens no stream.

O aplicativo de assinante 1 começa a detectar as mensagens na assinatura sub_one.

Iniciar o aplicativo de editor

No terminal publisher, inicie o aplicativo de editor:

Bash

python pub.py $PROJECT hello_topic

PowerShell

py pub.py $env:PROJECT hello_topic

Depois que o aplicativo do editor é iniciado, o sistema Pub/Sub faz o seguinte:

  • O aplicativo de editor envia uma mensagem "Hello, World!" para o Pub/Sub sem saber se há assinaturas existentes. O servidor também atribui um ID da mensagem.

  • O aplicativo de assinante 1 recebe a mensagem "Hello World", imprime-o e envia uma confirmação para o Pub/Sub.

  • O aplicativo de editor imprime a confirmação. A confirmação informa ao Pub/Sub que a mensagem foi processada com sucesso e não precisa ser reenviada para este ou qualquer outro assinante sub_one.

O Pub/Sub remove a mensagem do sub_one.

O aplicativo
  publica a mensagem e atribui um ID de mensagem. O aplicativo de Assinante 1 recebe a mensagem "Hello World" e envia uma confirmação

Iniciar o aplicativo de assinante 2

No terminal sub_two, inicie o assinante 2:

Bash

python sub.py $PROJECT sub_two

PowerShell

py sub.py $env:PROJECT sub_two

Este assinante recebe as mensagens entregues para a assinatura sub_two. O assinante 2 reutiliza o script sub.py. A diferença é que o assinante 2 não é iniciado antes de o editor enviar a mensagem para o tópico e as assinaturas. Se o editor estivesse chamando o assinante 2 diretamente, o aplicativo de editor teria que aguardar até que o assinante 2 aparecesse. Caso contrário, ele expiraria. O Pub/Sub gerencia esse processo efetivamente salvando a mensagem para o assinante 2.

O assinante 2 começa a realizar a detecção e recebe a mensagem que estava esperando por ele no sub_two

Agora você já consegue desenvolver com o Pub/Sub!

Como foi?

Outros recursos e links estão disponíveis na página de suporte do Pub/Sub.

Limpar

  1. Interrompa todos os aplicativos em execução.
  2. Exclua o diretório de código de exemplo do seu ambiente local.
  3. Exclua o tópico.

    gcloud pubsub topics delete hello_topic
    
  4. Excluir as assinaturas.

    gcloud pubsub subscriptions delete sub_one
    
    gcloud pubsub subscriptions delete sub_two
    
  5. Encerre o projeto de tutorial na seção IAM e administrador do console do Google Cloud.

  6. Opcional: revogue as credenciais de autenticação que você criou e exclua o arquivo de credenciais local:

    gcloud auth application-default revoke
  7. Opcional: revogar credenciais da CLI gcloud.

    gcloud auth revoke

A seguir

Aqui estão algumas coisas para tentar:

  • Examine os códigos pub.py e sub.py do tutorial e procure outras amostras do Pub/Sub no GitHub. Como exercício, crie uma versão de pub.py que publique o horário local a cada segundo.

  • Aprenda a enviar mensagens em lote.

  • Use as assinaturas de Push para receber mensagens que acionam endpoints do App Engine ou Cloud Functions.

  • Recupere mensagens confirmadas anteriormente usando o recurso de reprodução. Por padrão, o Pub/Sub remove das assinaturas as mensagens confirmadas. Por exemplo, neste tutorial, não é possível executar novamente o sub.py para receber a mensagem "Hello, World!" outra vez. O recurso de repetição permite configurar assinaturas para que você possa receber mensagens depois que elas forem confirmadas.

  • Comece a usar bibliotecas de cliente em outras linguagens.