Como migrar filas pull para o Pub/Sub (Python)

Nesta página, explicamos como migrar o código da fila pull de Task Queues para o Pub/Sub. O Pub/Sub agora é a maneira preferencial de executar o trabalho da fila pull no App Engine.

Se o aplicativo usa filas pull e filas push, use este guia para migrar filas pull para o Pub/Sub antes de migrar suas filas push para o novo serviço de filas push Cloud Tasks. A migração de filas pull após a migração de filas push para o Cloud Tasks não é recomendada porque o uso obrigatório do arquivo queue.yaml provavelmente causa um comportamento inesperado com o Cloud Tasks.

Recursos não disponíveis no Pub/Sub

Os seguintes recursos do Task Queues não estão disponíveis atualmente no Pub/Sub:

  • Lote por tag
  • Desduplicação automática

Preços e cotas

Migrar suas filas pull para Pub/Sub pode afetar o preço e as cotas do seu aplicativo.

Preços

Pub/Sub tem seu próprio preço. Assim como no Task Queues, o envio de solicitações para o aplicativo do App Engine com o Pub/Sub pode gerar custos.

Cotas

As cotas do Pub/Sub são diferentes das cotas do Task Queues. Assim como no Task Queues, o envio de solicitações para o aplicativo App Engine a partir do Pub/Sub pode afetar as cotas de solicitação do App Engine.

Antes de migrar

Se você ainda não tiver feito isso, configure o ambiente de desenvolvimento do Python para usar uma versão do Python compatível com o Google Cloud e instale ferramentas de teste para criar Python isolado.

As seções a seguir discutem as etapas de configuração que antecedem a migração de filas pull para o Pub/Sub.

Como ativar a API Pub/Sub

Para ativar a API Pub/Sub, clique em Ativar na API Pub/Sub na Biblioteca de APIs. Se você vir um botão Gerenciar em vez de um botão Ativar, isso significará que a API Pub/Sub já está ativada para seu projeto.

Como autenticar seu aplicativo na API Pub/Sub

É necessário autenticar seu aplicativo para a API Pub/Sub. Nesta seção, discutimos a autenticação para dois casos de uso diferentes.

Para desenvolver ou testar seu aplicativo localmente, recomendamos usar uma conta de serviço. Consulte as instruções sobre como configurar uma conta de serviço e conectá-la ao aplicativo em Como receber e fornecer credenciais de conta de serviço manualmente.

Para implantar o aplicativo no App Engine, você não precisa fornecer nenhuma nova autenticação. As Application Default Credentials (ADC, na sigla em inglês) inferem detalhes de autenticação de aplicativos do App Engine.

Como fazer o download da Google Cloud CLI

Faça o download e instale a Google Cloud CLI para usar a CLI gcloud com a API Pub/Sub, se ainda não tiver sido instalada. Se já tiver a Google Cloud CLI instalada, execute o seguinte comando no terminal:

gcloud components update

Como importar as bibliotecas de cliente do Cloud

Siga as etapas abaixo para usar a biblioteca de cliente Python do Pub/Sub com seu aplicativo atual do App Engine:

  1. Atualize o arquivo app.yaml. Siga as instruções para sua versão do Python:

    Python 2

    Para aplicativos Python 2, adicione as versões mais recentes da biblioteca grpcio.

    A seguir, um exemplo de arquivo app.yaml:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    

    Python 3

    Para aplicativos Python 3, especifique o elemento runtime no arquivo app.yaml com uma versão compatível do Python 3. Por exemplo:

    runtime: python310 # or another support version
    

    O ambiente de execução do Python 3 instala bibliotecas automaticamente. Portanto, não é necessário especificar bibliotecas integradas do ambiente de execução anterior do Python 2. Se o aplicativo Python 3 estiver usando outros serviços legados em pacote durante a migração, será possível especificar as bibliotecas integradas necessárias. Caso contrário, exclua as linhas desnecessárias do arquivo app.yaml.

  2. Atualize o arquivo requirements.txt. Siga as instruções para sua versão do Python:

    Python 2

    Adicione as bibliotecas de cliente do Cloud para Pub/Sub à lista de dependências no arquivo requirements.txt.

    google-cloud-pubsub
    

    Em seguida, execute pip install -t lib -r requirements.txt para atualizar a lista de bibliotecas disponíveis para seu app.

    Python 3

    Adicione as bibliotecas de cliente do Cloud para Pub/Sub à lista de dependências no arquivo requirements.txt.

    google-cloud-pubsub
    

    O App Engine instala automaticamente essas dependências durante a implantação do app no ambiente de execução do Python 3. Portanto, exclua a pasta lib, se houver uma.

  3. No caso de um aplicativo Python 2, se ele estiver usando bibliotecas integradas ou copiadas, especifique esses caminhos no arquivo appengine_config.py, localizado na mesma pasta do arquivo app.yaml:

    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set PATH to your libraries folder.
    PATH = 'lib'
    # Add libraries installed in the PATH folder.
    vendor.add(PATH)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(PATH)
    

    O arquivo appengine_config.py acima pressupõe que o diretório de trabalho atual seja o local da pasta lib. Em alguns casos, como testes de unidade, o diretório de trabalho atual pode ser diferente. Para evitar erros, transmita explicitamente o caminho completo para a pasta lib usando:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
  4. Importe a biblioteca de cliente Python do Pub/Sub em qualquer arquivo que use filas pull da API Task Queues:

    from google.cloud import pubsub

Filas do Pub/Sub e pull

Comparação do recurso

O Pub/Sub envia trabalho aos workers por meio de uma relação de editor/assinante. Uma assinatura pull no Pub/Sub é como uma fila pull em Task Queues porque o assinante extrai a mensagem do tópico. Na tabela abaixo, listamos o recurso principal para filas pull em Task Queues e o recurso associado para assinaturas de pull em Pub/Sub.

Recurso Task Queues Recurso do Pub/Sub
Fila Tópico
Tarefa Mensagem
Worker Inscrito

Para saber mais sobre a arquitetura do Pub/Sub, leia Cloud Pub/Sub: um serviço de mensagens em escala do Google.

Comparação do fluxo de trabalho

Veja abaixo uma comparação de um fluxo de trabalho típico para uma fila pull no Task Queues e uma assinatura pull em Pub/Sub.

Fluxo de trabalho do Task Queues Fluxo de trabalho do Pub/Sub
Você cria a fila pull Você cria o tópico e inscreve seu assinante (isto é, worker) no tópico
Você cria e enfileira a tarefa Você cria a mensagem e a pública no tópico
O worker aluga a tarefa O assinante extrai a mensagem do tópico
O worker processa a tarefa O assinante processa a mensagem
O worker exclui a tarefa da fila O assinante reconhece a mensagem
A locação expira O tópico exclui a mensagem quando todos os assinantes a reconhecem

Como criar assinaturas de pull no Pub/Sub

É possível usar uma assinatura de pull do Pub/Sub como uma fila pull do Task Queues. As assinaturas de um tópico não expiram e podem existir simultaneamente para vários workers. Isso significa que uma mensagem pode ser processada por mais de um worker, que é um dos principais casos de uso do Pub/Sub. Para recriar filas pull de Task Queues como assinaturas de pull do Pub/Sub, crie um tópico para cada worker e faça a assinatura apenas do worker associado no tópico. Isso garante que cada mensagem seja processada por exatamente um worker, como em Task Queues. Para mais informações sobre como criar e gerenciar assinaturas de pull, leia sobre como gerenciar tópicos e assinaturas.

Como excluir filas pull

Depois de migrar filas pull de Task Queues para assinaturas de pull do Pub/Sub, exclua-as do Task Queues usando o arquivo queue.yaml. Recomendamos excluir cada fila pull antes de migrar a próxima. Isso impede que seu aplicativo duplique o trabalho recebido da nova assinatura de pull Pub/Sub enquanto você migra suas outras filas pull. A exclusão de filas pull de Task Queues individualmente, em vez de em uma única implantação, pode ter um efeito maior sobre sua cota de implantação do App Engine.

Depois da exclusão de todas as suas filas pull de Task Queues, será possível omitir o arquivo queue.yaml de implantações futuras do seu aplicativo.

Se o aplicativo usar apenas filas pull, remova todas as referências à API Task Queues no seu código. Se seu aplicativo usar filas pull e push, será possível remover as referências à API Task Queues que ocorrem em arquivos que só usam filas pull ou aguardar até que também tenha migrado suas filas push e remova referências à API Task Queues de todos os arquivos.

A seguir