Como criar um sistema Pub/Sub um para muitos

Introdução

Neste tutorial, mostramos como configurar um conjunto simples 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. 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. Por isso, o serviço entrega a mensagem a um ou mais aplicativos de assinante sempre que eles estiverem disponíveis.

Requisitos:

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 abaixo:

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:

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

Configuração do tutorial

Configurar o projeto do Google Cloud e o tópico e as assinaturas do Pub/Sub

  1. Faça login no Console do Google Cloud.

    Acessar o Console do Google Cloud

    Se você é novo no Cloud, clique em Ativar e siga os comandos para configurar sua conta do Cloud.

  2. Selecione um projeto atual ou crie um novo. Um projeto padrão é criado na primeira vez em que você usa o Google Cloud.

    Na seção Início do Console do Cloud, anote o código do projeto. Você usa esse valor para definir seu projeto atual do Cloud Storage durante o processo de inicialização do SDK do Cloud. Esse código também é passado para o script do Python ao iniciar os aplicativos do editor e de assinante.

  3. Vá para a seção Pub/Sub do Console do Google Cloud.

    Acessar a seção Pub/Sub

    Siga o comando para ativar a API.

  4. Clique em Criar um tópico. Aplicativos de publicação enviam mensagens para tópicos. Use hello_topic como o Nome.

  5. Na página Detalhes do tópico, clique em Criar assinatura:

    1. O nome da assinatura precisa ser sub_one. Não altere nenhuma das configurações padrão. Você está criando uma assinatura StreamingPull, que é um tipo de assinatura de pull.

    2. Use o mesmo procedimento para criar outra assinatura anexada ao hello_topic, chamada sub_two.

      É possível clicar no nome do tópico na visualização Tópicos para ver as novas assinaturas. Também é possível alterar para a visualização Assinaturas.

Nesse ponto, o ambiente do Pub/Sub está pronto para gerenciar o fluxo de mensagens entre os aplicativos de publicação e assinatura.

Criar credenciais de conta de serviço

  1. Vá para a seção Contas de serviço do console.

    Acessar as contas de serviço do IAM

  2. Selecione seu projeto e clique em Criar conta de serviço.

  3. Insira um Nome de conta de serviço, como pubsub-tutorial.

  4. Clique em Criar

  5. Para o tutorial, a conta de serviço precisa de permissões de publicação e assinatura. Use a lista suspensa Selecione um papel para adicionar o papel Editor do Pub/Sub.

    Caixa de diálogo de permissões da conta de serviço, usando a string

  6. Clique em Adicionar outro papel e adicione Assinante do Pub/Sub.

    Caixa de diálogo de permissões da conta de serviço, com o editor e o assinante do Pub/Sub, clicando no botão

  7. Clique em Continuar. Você não precisa conceder acesso a essa conta de serviço aos usuários.

  8. Clique em Criar chave. A chave é usada pela biblioteca de cliente para acessar a API Pub/Sub.

  9. Selecione JSON e clique em Criar.

    A chave é enviada para a pasta Downloads. Para os fins deste tutorial, deixe-a lá.

  10. Renomeie o arquivo de chave como ~/Downloads/key.json.

Instale o Cloud SDK

  1. Siga as instruções para instalar e inicializar o SDK do Cloud.

    • Ao inicializar o SDK do Cloud, selecione a opção para inserir um código de projeto e informe o código do projeto que você criou ou escolheu na seção de configuração.

    • Volte a este tutorial depois de instalar e inicializar o SDK do Cloud. Não é necessário instalar outros componentes nem fazer o download das bibliotecas de cliente do Cloud.

    Depois de instalar o SDK do Cloud, use a ferramenta de linha de comando gcloud para executar operações do Pub/Sub no Compute Engine.

  2. Inicie um novo terminal antes de usar estes comandos gcloud:

    gcloud pubsub topics list
    gcloud pubsub subscriptions list
    

    Também é possível usar gcloud config set project PROJECT_ID para alterar o projeto em relação ao que você configurou durante a inicialização.

Instalar o Python e criar um ambiente virtual

Neste tutorial, fornecemos um exemplo de uso para que você não precise seguir o exemplo mostrado na seção de configuração do ambiente virtual. Volte a este tutorial depois de instalar o ambiente virtual.

Ver o código do editor e do assinante

  1. Crie uma pasta de projeto para conter os arquivos Python do Pub/Sub necessários para este tutorial. Em seguida, passe para ela e faça o download do código:

     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). Em cada um dos terminais, execute todas as operações listadas nesta seção. Por conveniência, nos referimos a esses terminais como:

    • terminal de editor: publisher;
    • terminal de assinante 1: sub_one;
    • terminal de assinante 2: sub_two.
  2. Crie um ambiente virtual do Python e o ative.

    No primeiro terminal, execute este comando para criar e ativar um ambiente virtual 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 outros dois terminais, execute o seguinte comando:

    Bash

    source pyenv-qs/bin/activate
    

    PowerShell

    .\pyenv-qs\Scripts\activate
    

    Depois de executar o comando activate, o prompt de comando deve incluir (pyenv-qs) $.

    Também é possível apontar seu ambiente virtual para uma versão diferente do Python.

  3. Instale a biblioteca de cliente Python do Pub/Sub usando pip:

    pip install --upgrade google-cloud-pubsub

    Associe a chave JSON à conta de serviço. Você atribuiu os principais papéis do Pub/Sub quando criou as credenciais da conta de serviço. As bibliotecas de cliente do Pub/Sub acessam a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS e recebem os papéis e as permissões associados à conta de serviço.

    Bash

    export GOOGLE_APPLICATION_CREDENTIALS=~/Downloads/key.json
    

    PowerShell

    $env:GOOGLE_APPLICATION_CREDENTIALS="$HOME\Downloads\key.json"
    
  4. Configure uma variável de ambiente usando seu código de projeto atual. Este comando da gcloud define seu código de projeto atual e o configura como uma variável:

    Bash

    export PROJECT=gcloud config get-value project
    

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
    

    Para verificar se o GCP atual foi registrado corretamente como essa variável, use este comando:

    Bash

    echo $PROJECT
    

    PowerShell

    $env:PROJECT
    
  5. Mude para a pasta do projeto e navegue até a pasta de amostra do tutorial:

    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

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 ~/pubsub-quickstart do ambiente local.

  3. Encerre o projeto do tutorial na seção IAM e administrador do Console do Google Cloud.

  4. Remova as credenciais da conta de serviço: rm ~/Downloads/key.json

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!" novamente. O recurso de reprodução permite configurar assinaturas para que você possa receber mensagens depois que elas forem confirmadas.