Como gravar e responder a mensagens do Pub/Sub

O Google Cloud Pub/Sub fornece mensagens assíncronas confiáveis de muitos para muitos entre aplicativos. Os aplicativos do editor podem enviar mensagens para um tópico, e outros aplicativos podem se inscrever nele para receber as mensagens.

Este documento mostra como usar a biblioteca de cliente do Google Cloud para enviar e receber mensagens do Google Cloud Pub/Sub em um app executado no ambiente flexível.

Pré-requisitos

  • Acesse "Hello, World!" para Python no App Engine para configurar o ambiente e o projeto, além de compreender como aplicativos Python do App Engine são estruturados.
  • Anote e salve o código do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

    Clonar o aplicativo de amostra

    Copie os aplicativos de amostra para sua máquina local e navegue até o diretório do pubsub:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/appengine/flexible/pubsub
    

    Criar um tópico e inscrição

    Crie um tópico e inscrição. Isso inclui especificar o ponto de extremidade que receberá as solicitações do Pub/Sub:

    gcloud beta pubsub topics create YOUR_TOPIC_NAME
    gcloud beta pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME \
        --push-endpoint \
        https://YOUR_PROJECT_ID.appspot.com/pubsub/push?token=YOUR_TOKEN \
        --ack-deadline 10
    

    Substitua YOUR_TOKEN por um token aleatório secreto. Ele é usado pelo ponto de extremidade do push para verificar as solicitações.

    Editar o app.yaml

    Edite o app.yaml para definir as variáveis de ambiente do código do projeto, do tópico e do token de verificação:

    env_variables:
        PUBSUB_TOPIC: your-topic
        # This token is used to verify that requests originate from your
        # application. It can be any sufficiently random string.
        PUBSUB_VERIFICATION_TOKEN: 1234abc

    Análise do código

    O aplicativo de amostra usa as bibliotecas de cliente do Google Cloud.

    O aplicativo de amostra utiliza os valores definidos no arquivo app.yaml para configurar as variáveis do ambiente. O gerenciador da solicitação de push usa esses valores para confirmar que a solicitação veio do Pub/Sub e foi originada de uma fonte confiável:

    app.config['PUBSUB_VERIFICATION_TOKEN'] = \
        os.environ['PUBSUB_VERIFICATION_TOKEN']
    app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']
    

    O aplicativo de amostra mantém uma lista global para armazenar as mensagens recebidas por essa instância:

    MESSAGES = []
    

    O método pubsub_push() recebe mensagens enviadas e os adiciona à lista global MESSAGES:

    @app.route('/pubsub/push', methods=['POST'])
    def pubsub_push():
        if (request.args.get('token', '') !=
                current_app.config['PUBSUB_VERIFICATION_TOKEN']):
            return 'Invalid request', 400
    
        envelope = json.loads(request.data.decode('utf-8'))
        payload = base64.b64decode(envelope['message']['data'])
    
        MESSAGES.append(payload)
    
        # Returning any 2xx status indicates successful receipt of the message.
        return 'OK', 200

    O método index() interage com o aplicativo da Web do App Engine para publicar novas mensagens e exibir mensagens recebidas:

    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            return render_template('index.html', messages=MESSAGES)
    
        data = request.form.get('payload', 'Example payload').encode('utf-8')
    
        publisher = pubsub_v1.PublisherClient()
        topic_path = publisher.topic_path(
            current_app.config['PROJECT'],
            current_app.config['PUBSUB_TOPIC'])
    
        publisher.publish(topic_path, data=data)
    
        return 'OK', 200

    Executar a amostra localmente

    Com o Google Cloud SDK em execução no local, você pode fornecer autenticação para o uso das APIs do Google Cloud. Se tiver configurado o ambiente conforme descrito nos Pré-requisitos, você já terá executado o comando gcloud init, que fornece essa autenticação.

    Instale dependências, preferencialmente com um virtualenv.

    Mac OS/Linux

    1. Crie um ambiente Python isolado em um diretório externo ao projeto e ative-o:
      virtualenv env
      source env/bin/activate
    2. Navegue até o diretório do projeto e instale as dependências:
      cd YOUR_PROJECT
      pip install  -r requirements.txt

    Windows

    Se você instalou o Cloud SDK, já deve ter o Python 2.7 instalado, normalmente em C:\python27_x64\ (para sistemas de 64 bits). Use o Powershell para executar seus pacotes Python.

    1. Localize a instalação do Powershell.
    2. Clique com o botão direito do mouse no atalho do Powershell e inicie-o como administrador.
    3. Tente executar o comando python. Se ele não for encontrado, adicione a pasta Python ao PATH do ambiente.
      $env:Path += ";C:\python27_x64\"
    4. Crie um ambiente Python isolado em um diretório externo ao projeto e ative-o:
      python -m virtualenv env
      env\Scripts\activate
    5. Navegue até o diretório do projeto e instale as dependências:
      cd YOUR_PROJECT
      python -m pip install -r requirements.txt

    Defina as variáveis de ambiente antes de iniciar o aplicativo:

    export GOOGLE_CLOUD_PROJECT=[your-project-id]
    export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
    export PUBSUB_TOPIC=[your-topic]
    python main.py
    

    Simular notificações por push

    Pelo aplicativo, é possível enviar mensagens localmente, mas não é possível receber mensagens push localmente. É possível simular uma mensagem de push com uma solicitação HTTP para o ponto de extremidade da notificação local. A amostra inclui o arquivo sample_message.json.

    Use curl ou httpie para enviar uma solicitação HTTP POST:

    curl -i -H "Content-Type: application/json" --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"
    

    Ou

    http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json
    

    Resposta:

    HTTP/1.0 200 OK
    Content-Length: 2
    Content-Type: text/html; charset=utf-8
    Date: Mon, 10 Aug 2015 17:52:03 GMT
    Server: Werkzeug/0.10.4 Python/2.7.10
    
    OK
    

    Após a conclusão da solicitação, atualize localhost:8080 e veja a mensagem na lista de mensagens recebidas.

    Executar no App Engine

    Para implantar o aplicativo de demonstração no App Engine usando a ferramenta de linha de comando gcloud, execute o seguinte comando no diretório em que app.yaml está localizado:

    gcloud app deploy
    

    Agora você pode acessar o aplicativo em https://[YOUR_PROJECT_ID].appspot.com. Você pode usar o formulário para enviar mensagens. No entanto, não há garantias sobre qual instância do seu aplicativo receberá a notificação. É possível enviar várias mensagens e atualizar a página para ver a mensagem recebida.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentos do ambiente flexível do App Engine para Python