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 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 para o 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 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 o sistema, siga estas 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 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. 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.

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

  7. Enable the Pub/Sub API:

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

    gcloud auth application-default login

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

  9. 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.
  10. Install the Google Cloud CLI.

  11. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  12. To initialize the gcloud CLI, run the following command:

    gcloud init
  13. 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.

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

  15. Enable the Pub/Sub API:

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

    gcloud auth application-default login

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

  17. 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.
  18. Instalar o Python

    Este tutorial usa as bibliotecas de cliente do Pub/Sub, que exigem o 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 aplicativos de publicação e assinatura, você cria 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 assinatura de 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 um para muitos

    Baixar o 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). Para facilitar, este tutorial chama esses terminais de:

      • terminal de editor: publisher;
      • terminal de assinante 1: sub_one;
      • terminal de assinante 2: sub_two.
    2. No terminal do publisher, 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 de executar o comando de ativação, o prompt de comando vai incluir o seguinte valor (pyenv-qs) $.

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

      python -m pip install --upgrade google-cloud-pubsub
    4. Em todos os 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. Em todos os 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 Publisher 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 de 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 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 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. Neste tutorial, por exemplo, não seria possível executar sub.py novamente para receber a mensagem "Hello, World!" outra vez. O recurso de reprodução permite configurar assinaturas para que você possa receber mensagens depois que elas forem confirmadas.

    • Comece a usar as bibliotecas de cliente em outros idiomas.