Criar um sistema Pub/Sub de um para muitos

Neste tutorial, mostramos como configurar um conjunto de aplicativos que se comunicam enviando mensagens pelo Pub/Sub em vez de RPCs síncronos. Ao desacoplar os 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. O editor envia uma mensagem ao Pub/Sub. O editor não precisa saber quais e quantos aplicativos de assinante precisam receber a mensagem. Como resultado, é possível confiar no serviço para entregar a mensagem a um ou mais aplicativos do assinante sempre que eles 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 de 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 etapas a seguir:

  1. Crie uma conta de serviço do IAM que os aplicativos usem para autenticação.
  2. Configure as permissões do IAM.
  3. Criar um tópico e uma assinatura do Pub/Sub.
  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 posterior. Conclua 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 do tipo StreamingPull, que é um tipo de pull.

Assinatura 1

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

gcloud pubsub subscriptions create sub_one --topic=hello_topic

Assinatura 2

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

gcloud pubsub subscriptions create sub_two --topic=hello_topic

Criar um sistema de um para muitos

Fazer o download do código do editor e do 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 que você executar o comando "activate", 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 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
  Editor 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 do exemplo de código do ambiente local.
  3. Exclua o tópico.

    gcloud pubsub topics delete hello_topic
    
  4. Exclua as assinaturas.

    gcloud pubsub subscriptions delete sub_one
    
    gcloud pubsub subscriptions delete sub_two
    
  5. Encerre o projeto do 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.

  • Usando assinaturas de Push, receba 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. Neste tutorial, por exemplo, não é possível executar sub.py novamente para receber a mensagem "Hello, World!". 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.