API Sockets para serviços agrupados legados


O tráfego dos soquetes é faturado como largura de banda de saída. Async IO (como Twisted no Python) não é compatível. O App Engine aceita a API do módulo de soquete do Python padrão apenas para soquetes de saída. Basta importar a biblioteca de soquetes padrão usando a seguinte instrução:

import socket

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

Embora o ambiente de execução do Python 2 seja compatível com soquetes, há algumas limitações e comportamentos que você precisa conhecer ao usar soquetes.

Separe um descritor de soquete e o passe entre instâncias do App Engine, como parte de um payload Task. Neste cenário, abra um soquete em uma instância de front-end, passe-o para uma instância de back-end e o use aí.

Em versões do SDK anteriores a 1.8.1, você não podia chamar opções get/set em relação a soquetes. Isso gerou exceções "Não implementado". No entanto, a API Sockets já permite isso.

Para as opções compatíveis, as chamadas para getsockopt retornarão um valor de simulação. As chamadas para setsockopt serão silenciosamente ignoradas. Os erros continuarão sendo gerados para opções não compatíveis. As opções compatíveis são estas:

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

Limitações e restrições

A compatibilidade de soquetes com o App Engine tem as seguintes limitações:

  • Não é possível criar um soquete de escuta. Você só pode criar soquetes de saída.
  • O FTP não é compatível.
  • Por padrão, httplib é configurado para usar a API urlfetch. Se você precisar usar socket para contornar os limites de busca de URL, altere esse padrão para que httplib use soquetes. Para mais informações, consulte Como fazer com que httplib use soquetes.
  • Só é possível usar TCP ou UDP. Não são permitidos protocolos arbitrários.
  • Não é possível se vincular a portas ou endereços IP específicos.
  • A porta 25 (SMTP) está bloqueada. Ainda é possível usar SMTP autenticado na porta de envio 587.
  • Os intervalos de IP particulares, de transmissão, multicast e do Google são bloqueados, exceto os listados abaixo:

    • DNS público do 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
    • POP3S do Gmail: pop.gmail.com porta 995
    • IMAPS do Gmail: imap.gmail.com porta 993
  • Os descritores de soquete estão associados ao app do App Engine que os criou e não são transferíveis, ou seja, não podem ser usados por outros aplicativos.

  • Os soquetes poderão ser recuperados depois de dez minutos de inatividade. Qualquer operação de soquete mantém o soquete ativo por mais dez minutos.

  • Atualmente, socket.gethostbyaddr() não é implementado no Python. Ainda é possível usar a biblioteca padrão SMTP do Python (smtplib) para abrir uma conexão:

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

Como usar soquetes com o servidor de desenvolvimento

É possível executar e testar código usando soquetes no servidor de desenvolvimento, sem empregar parâmetros de linha de comando especiais.

Como usar soquetes com OpenSSL

O App Engine aceita o OpenSSL nativo do Python no tempo de execução do Python 2.7. Configure o arquivo app.yaml para carregar a biblioteca SSL, conforme descrito no Suporte do OpenSSL.

Como desativar a busca de URL para lidar com todas as solicitações de saída

Se você importar httplib, por padrão, ele usará a API urlfetch. Se quiser alterar isso para que httplib use soquetes, adicione a seguinte variável de ambiente ao arquivo app.yaml:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

É possível substituir anyvalue por qualquer valor, incluindo uma string vazia.

Amostra do App Engine que usa soquetes

Para uma amostra que usa soquetes, consulte o app de demonstração do soquete (em inglês) no GitHub do Google Cloud Platform.