Migrar filas de obtenção para o Pub/Sub (Python)

Esta página explica como migrar o código da fila de obtenção das filas de tarefas para o Pub/Sub. O Pub/Sub é agora a forma preferencial de realizar o trabalho da fila de obtenção no App Engine.

Se a sua app usar filas de obtenção e filas de envio, use este guia para migrar as filas de obtenção para o Pub/Sub antes de migrar as filas de envio para o novo serviço de filas de envio Cloud Tasks. Não é recomendável migrar as filas de obtenção depois de migrar as filas de envio para o Cloud Tasks porque a utilização obrigatória do ficheiro queue.yaml tem probabilidade de causar um comportamento inesperado com o Cloud Tasks.

Funcionalidades atualmente não disponíveis no Pub/Sub

As seguintes funcionalidades de filas de tarefas não estão atualmente disponíveis no Pub/Sub:

  • Agrupamento por etiqueta
  • Eliminação de duplicados automática

Preços e quotas

A migração das filas de obtenção para o Pub/Sub pode afetar os preços e as quotas da sua app.

Preços

O Pub/Sub tem os seus próprios preços. Tal como com as filas de tarefas, o envio de pedidos para a sua app do App Engine com o Pub/Sub pode fazer com que a sua app incorra em custos.

Quotas

As quotas do Pub/Sub são diferentes das quotas das filas de tarefas. Tal como acontece com as filas de tarefas, o envio de pedidos para a sua app do App Engine a partir do Pub/Sub pode afetar as quotas de pedidos do App Engine.

Antes da migração

Se ainda não o fez, configure o seu ambiente de desenvolvimento Python para usar uma versão do Python compatível com o Google Cloude instale ferramentas de teste para criar ambientes Python isolados.

As secções seguintes abordam os passos de configuração antes de migrar as filas de obtenção para o Pub/Sub.

Ativar a API Pub/Sub

Para ativar a API Pub/Sub, clique em Ativar na API Pub/Sub na biblioteca de APIs. Se vir um botão Gerir em vez de um botão Ativar, significa que ativou anteriormente a API Pub/Sub para o seu projeto e não precisa de o fazer novamente.

Autenticar a sua app na Pub/Sub API

Tem de autenticar a sua app na API Pub/Sub. Esta secção aborda a autenticação para dois exemplos de utilização diferentes.

Para desenvolver ou testar a sua app localmente, recomendamos que use uma conta de serviço. Para ver instruções sobre como configurar uma conta de serviço e associá-la à sua app, leia o artigo Obter e fornecer credenciais da conta de serviço manualmente.

Para implementar a sua app no App Engine, não precisa de fornecer nenhuma nova autenticação. As Credenciais padrão da aplicação (ADC) deduzem os detalhes de autenticação para apps do App Engine.

Transferir a CLI do Google Cloud

Transfira e instale a CLI do Google Cloud para usar a CLI gcloud com a API Pub/Sub se não a tiver instalado anteriormente. Execute o seguinte comando a partir do terminal se já tiver a CLI do Google Cloud instalada.

gcloud components update

Importar as bibliotecas de cliente da nuvem

Siga os passos abaixo para usar a biblioteca cliente Python do Pub/Sub com a sua app do App Engine existente:

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

    Python 2

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

    Segue-se um exemplo de um ficheiro app.yaml:

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

    Python 3

    Para apps Python 3, especifique o elemento runtime no ficheiro app.yaml com uma versão do Python 3 suportada. Por exemplo:

    runtime: python310 # or another support version
    

    O tempo de execução do Python 3 instala bibliotecas automaticamente, pelo que não tem de especificar bibliotecas incorporadas do tempo de execução do Python 2 anterior. Se a sua app Python 3 estiver a usar outros serviços incluídos legados durante a migração, pode continuar a especificar as bibliotecas incorporadas necessárias. Caso contrário, pode eliminar as linhas desnecessárias no ficheiro app.yaml.

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

    Python 2

    Adicione as bibliotecas de cliente da nuvem para o Pub/Sub à sua lista de dependências no ficheiro requirements.txt.

    google-cloud-pubsub
    

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

    Python 3

    Adicione as bibliotecas de cliente da nuvem para o Pub/Sub à sua lista de dependências no ficheiro requirements.txt.

    google-cloud-pubsub
    

    O App Engine instala automaticamente estas dependências durante a implementação da app no runtime do Python 3. Por isso, elimine a pasta lib, se existir.

  3. Para apps Python 2, se a sua app estiver a usar bibliotecas incorporadas ou copiadas, tem de especificar esses caminhos no ficheiro appengine_config.py, localizado na mesma pasta que o ficheiro 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 ficheiro appengine_config.py acima pressupõe que o diretório de trabalho atual é onde se encontra a pasta lib. Em alguns casos, como os testes unitários, o diretório de trabalho atual pode ser diferente. Para evitar erros, pode transmitir explicitamente o caminho completo para a pasta lib através do seguinte:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
  4. Importe a biblioteca cliente Python do Pub/Sub em todos os ficheiros que usam filas de obtenção da API Task Queues:

    from google.cloud import pubsub

Pub/Sub e filas de obtenção

Comparação de funcionalidades

O Pub/Sub envia trabalho para os trabalhadores através de uma relação publicador/subscritor. Uma subscrição de obtenção no Pub/Sub é como uma fila de obtenção nas filas de tarefas porque o subscritor obtém a mensagem do tópico. A tabela abaixo lista a funcionalidade principal das filas de obtenção nas filas de tarefas e a funcionalidade associada das subscrições de obtenção no Pub/Sub.

Funcionalidade de filas de tarefas Funcionalidade do Pub/Sub
Fila Tópico
Tarefa Mensagem
Worker Subscritor

Para saber mais acerca da arquitetura do Pub/Sub, leia o artigo Cloud Pub/Sub: A Google-Scale Messaging Service.

Comparação de fluxos de trabalho

Segue-se uma comparação de um fluxo de trabalho típico para uma fila de obtenção nas filas de tarefas e uma subscrição de obtenção no Pub/Sub.

Fluxo de trabalho das filas de tarefas Fluxo de trabalho do Pub/Sub
Cria a fila de obtenção Cria o tópico e subscreve o seu subscritor (ou seja, o trabalhador) no tópico
Cria e coloca a tarefa na fila Cria a mensagem e publica-a no tópico
O trabalhador arrenda a tarefa O subscritor extrai a mensagem do tópico
O trabalhador processa a tarefa O subscritor processa a mensagem
O trabalhador elimina a tarefa da fila O subscritor confirma a mensagem
O arrendamento expira O tópico elimina a mensagem quando todos os respetivos subscritores tiverem confirmado a receção da mensagem

Criar subscrições de obtenção no Pub/Sub

Pode usar uma subscrição de obtenção do Pub/Sub como uma fila de obtenção de filas de tarefas. As subscrições de um tópico não expiram e podem existir em simultâneo para vários trabalhadores. Isto significa que uma mensagem pode ser processada por mais do que um trabalhador, o que é um dos principais exemplos de utilização do Pub/Sub. Para recriar as filas de obtenção do Task Queues como subscrições de obtenção do Pub/Sub, crie um tópico para cada trabalhador e subscreva apenas o trabalhador associado ao tópico. Isto garante que cada mensagem é processada por exatamente um trabalhador, tal como nas filas de tarefas. Para saber como criar e gerir subscrições de obtenção, leia o artigo sobre a gestão de tópicos e subscrições.

Eliminar filas de obtenção

Depois de migrar as filas de obtenção do Task Queues para subscrições de obtenção do Pub/Sub, elimine-as do Task Queues através do ficheiro queue.yaml. Recomendamos que elimine cada fila de obtenção antes de migrar a seguinte. Isto impede que a sua app duplique o trabalho que recebe da nova subscrição de obtenção do Pub/Sub enquanto migra as outras filas de obtenção. Tenha em atenção que a eliminação das filas de obtenção do Task Queues uma a uma, em vez de numa única implementação, pode ter um efeito maior na sua quota de implementação do App Engine.

Depois de eliminar todas as filas de obtenção das filas de tarefas, pode omitir o ficheiro queue.yaml em implementações futuras da sua app.

Se a sua app usar apenas filas de obtenção, remova todas as referências à API Task Queues no seu código. Se a sua app usar filas de obtenção e filas de envio, pode remover as referências à API Task Queues que ocorrem em ficheiros que usam apenas filas de obtenção ou aguardar até ter migrado também as suas filas de envio e, em seguida, remover as referências à API Task Queues de todos os ficheiros.

O que se segue?