Criar um sistema Pub/Sub 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. Por isso, o serviço entrega a mensagem a um ou mais aplicativos de assinante sempre que eles estiverem disponíveis.

Visão geral do sistema

Neste tutorial, você inicia um aplicativo de editor que envia com a 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, siga estas etapas:

  1. Crie uma conta de serviço do IAM que os aplicativos usam 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Pub/Sub API:

    gcloud services enable pubsub.googleapis.com
  7. Create local authentication credentials for your user account:

    gcloud auth application-default login
  8. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  9. Install the Google Cloud CLI.
  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Pub/Sub API:

    gcloud services enable pubsub.googleapis.com
  14. Create local authentication credentials for your user account:

    gcloud auth application-default login
  15. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Instalar o Python

Este tutorial usa as bibliotecas de cliente do Pub/Sub, que exigem Python 3.7 ou 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, criar 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 as anexe ao tópico.

Essas assinaturas são StreamingPull, que é um tipo de assinatura 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 ao hello_topic.

gcloud pubsub subscriptions create sub_two --topic=hello_topic

Criar o sistema 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árias 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 do editor, crie e ative um ambiente virtual do 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 seguinte: o valor (pyenv-qs) $.

  3. No terminal do editor, 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 de editor publica a mensagem e atribui uma identificação 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.

Limpeza

  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. Excluir 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. Optional: Revoke the authentication credentials that you created, and delete the local credential file.

    gcloud auth application-default revoke
  7. Optional: Revoke credentials from the gcloud CLI.

    gcloud auth revoke

A seguir

Aqui estão algumas coisas para tentar:

  • Examine os códigos pub.py e sub.py do tutorial e navegue por outros Exemplos 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. Neste tutorial, por exemplo, não seria possível Execute sub.py novamente para receber a mensagem "Hello, World!" mensagem novamente. O recurso de reprodução permite configurar assinaturas para que você possa receber mensagens depois que elas forem confirmadas.

  • Comece a usar bibliotecas de cliente em outras linguagens.