Como gravar e responder mensagens do Pub/Sub

O Cloud Pub/Sub transmite mensagens assíncronas confiáveis, de muitos para muitos, entre os 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 descreve como usar a Biblioteca de Cliente do Google Cloud para enviar e receber mensagens Cloud Pub/Sub em um aplicativo em Python (link em inglês).

Pré-requisitos

  • Siga as instruções em "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.

Como 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

Como criar um tópico e uma assinatura

Ao criar um tópico e uma assinatura, especifique o endpoint que receberá as solicitações do servidor do Pub/Sub:

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud 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 endpoint do push para verificar as solicitações.

Definir variáveis de ambiente

Edite o arquivo app.yaml para configurar as variáveis de ambiente para seu código do projeto, tópico e 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 as 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')

    # Consider initialzing the publisher client outside this function
    # for low latency publish.
    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

Como executar a amostra no local

Ao executar no local, use o SDK do Cloud para fornecer autenticação de uso das APIs do Google Cloud. Se o ambiente tiver sido configurado conforme descrito em Pré-requisitos, o comando gcloud init, que fornece essa autenticação, já terá sido executado.

Instale as dependências preferencialmente em um ambiente virtual.

Mac OS/Linux

  1. Crie um ambiente Python isolado em um diretório fora do projeto e ative-o:
    python3 -m venv 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

Use o PowerShell para executar os 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. Crie um ambiente Python isolado em um diretório fora do projeto e ative-o:
    python -m venv env
    env\Scripts\activate
  4. Navegue até o diretório do projeto e instale as dependências:
    cd YOUR_PROJECT
    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

Como simular notificações 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 endpoint da notificação local. A amostra inclui o arquivo sample_message.json.

Use o cliente curl ou httpie (links em inglês) para enviar um pedido 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.

Como 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 o arquivo app.yaml está localizado:

gcloud app deploy

Agora, acesse o aplicativo em https://[YOUR_PROJECT_ID].appspot.com. Use 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