API Sockets para serviços agrupados antigos


O tráfego de sockets é faturado como largura de banda de saída. A E/S assíncrona (como Twisted em Python) não é suportada. O App Engine suporta a API do módulo de soquetes Python padrão apenas para soquetes de saída. Basta importar a biblioteca de sockets padrão através da seguinte declaração:

import socket

As bibliotecas que importam socket, como poplib ou nntplib, e que não violam as limitações e restrições indicadas abaixo, devem funcionar sem modificações.

Embora o tempo de execução do Python 2 suporte sockets, existem determinadas limitações e comportamentos dos quais tem de estar ciente quando usa sockets.

Pode usar o módulo pickle num descritor de socket e transmiti-lo entre instâncias do App Engine, como parte de uma carga útil de tarefas. Neste cenário, pode abrir um soquete numa instância de front-end e, em seguida, passá-lo para uma instância de back-end e usá-lo aí.

Nas versões do SDK anteriores à 1.8.1, não era possível chamar opções de obtenção/definição em relação a sockets. (Ao fazê-lo, foram geradas exceções "Not Implemented".) No entanto, a API Sockets permite agora esta ação.

Para as opções suportadas, as chamadas para getsockopt devolvem um valor simulado e as chamadas para setsockopt são ignoradas silenciosamente. Os erros vão continuar a ser apresentados para opções não suportadas. As opções suportadas são:

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

Limitações e restrições

O suporte de sockets no App Engine tem as seguintes limitações:

  • Não pode criar um socket de escuta; só pode criar sockets de saída.
  • O FTP não é suportado.
  • Por predefinição, o httplib está configurado para usar a API urlfetch. Se precisar de usar o socket para contornar os limites do urlfetch, pode fazê-lo alterando esta predefinição para que o httplib use sockets. Para mais informações, consulte o artigo Fazer com que o httplib use tomadas.
  • Só pode usar TCP ou UDP. Não são permitidos protocolos arbitrários.
  • Não pode associar a endereços IP ou portas específicos.
  • A porta 25 (SMTP) está bloqueada. No entanto, pode continuar a usar o SMTP autenticado na porta de envio 587.
  • Os intervalos de IP privados, de transmissão, de multicast e da Google estão bloqueados, exceto os indicados abaixo:

    • DNS público da Google: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 porta 53
    • SMTPS do Gmail: smtp.gmail.com portas 465 e 587
    • Gmail POP3S: pop.gmail.com porta 995
    • IMAPS do Gmail: imap.gmail.com porta 993
  • Os descritores de sockets estão associados à app do App Engine que os criou e não são transferíveis (não podem ser usados por outras apps).

  • As portas podem ser recuperadas após 10 minutos de inatividade. Qualquer operação de porta mantém a porta ativa durante mais 10 minutos.

  • Atualmente, o socket.gethostbyaddr() não está implementado em Python. Pode continuar a usar a biblioteca padrão SMTP do Python (smtplib) para abrir uma ligação:

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

Usar sockets com o servidor de desenvolvimento

Pode executar e testar código com sockets no servidor de desenvolvimento sem usar parâmetros especiais da linha de comandos.

Usar sockets com o OpenSSL

O App Engine suporta o Python OpenSSL nativo para o tempo de execução do Python 2.7. Tem de configurar o ficheiro app.yaml para carregar a biblioteca SSL, conforme descrito no artigo Suporte do OpenSSL.

Desativar a obtenção de URLs do processamento de todos os pedidos de saída

Se importar httplib, por predefinição, usa a API urlfetch. Para alterar esta situação para que o httplib use sockets, adicione a seguinte variável de ambiente ao seu ficheiro app.yaml:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Pode substituir anyvalue por qualquer valor, incluindo uma string vazia.

Exemplo do App Engine que usa sockets

Para ver um exemplo que usa sockets, consulte a app de demonstração de sockets no GitHub da Google Cloud Platform.