API Sockets pour les anciens services groupés


Le trafic provenant des sockets est facturé en tant que bande passante sortante. Les entrées/sorties asynchrones (telles que Twisted en Python) ne sont pas acceptées. App Engine est le module standard de l'API Sockets pour Python (sockets sortants uniquement). Il vous suffit simplement d'importer la bibliothèque de sockets standard à l'aide de l'instruction suivante :

import socket

Les bibliothèques qui importent des modules socket, tels que poplib ou nntplib, et qui n'enfreignent pas les limites et les restrictions énumérées ci-dessous, devraient fonctionner sans modification.

Bien que l'environnement d'exécution Python 2 soit compatible avec les sockets, vous devez connaître certaines limitations et certains comportements lorsque vous utilisez des sockets.

Vous pouvez choisir un descripteur de socket et le transmettre entre les instances App Engine, par exemple dans les données utiles d'une tâche. Dans ce scénario, vous pouvez ouvrir un socket sur une instance frontend, puis le transmettre à une instance principale sur laquelle vous l'utiliserez.

Dans les SDK de version antérieure à 1.8.1, il n'était pas possible d'appeler les options get/set avec les sockets. (Cela générait des exceptions "Not implemented".) Cependant, l'API Sockets vous permet désormais de le faire.

Pour les options compatibles, les appels à getsockopt renvoient une valeur fictive et les appels à setsockopt sont ignorés sans notification. Les erreurs continuent d'être générées pour les options non compatibles. Les options acceptées sont les suivantes :

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

Limites et restrictions

Dans App Engine, la compatibilité avec les sockets présente les limitations suivantes :

  • Vous ne pouvez pas créer de socket d'écoute et vous ne pouvez créer que des sockets sortants.
  • Le protocole FTP n'est pas compatible.
  • Par défaut, httplib est configuré pour utiliser l'API UrlFetch. Si vous devez utiliser socket pour contourner les limites d'UrlFetch, vous pouvez le faire en modifiant cette valeur par défaut pour que httplib utilise des sockets à la place. Pour en savoir plus, reportez-vous à la section Forcer httplib à utiliser des sockets.
  • Seuls TCP ou UDP peuvent être utilisés. Les protocoles arbitraires ne sont pas autorisés.
  • Vous ne pouvez pas établir de liaisons à des adresses IP ou des ports spécifiques.
  • Le port 25 (SMTP) est bloqué. Vous pouvez utiliser le protocole SMTP authentifié sur le port de soumission 587.
  • Les plages IP privées, de diffusion, de multidiffusion et Google, à l'exception de celles énumérées ci-dessous, sont bloquées :

    • DNS public de Google : 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 (port 53)
    • Gmail SMTPS : smtp.gmail.com (ports 465 et 587)
    • Gmail POP3S : pop.gmail.com (port 995)
    • Gmail IMAPS : imap.gmail.com (port 993)
  • Les descripteurs de socket sont associés à l'application App Engine qui les a créés et ne sont pas transférables (ils ne peuvent pas être utilisés par d'autres applications).

  • Les sockets peuvent être récupérés après 10 minutes d'inactivité. Toute opération de socket maintient le socket en vie pendant 10 minutes supplémentaires.

  • La fonction socket.gethostbyaddr() n'est actuellement pas mise en œuvre en Python. Vous pouvez toujours utiliser la bibliothèque Python SMTP standard (smtplib) pour ouvrir une connexion :

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

Utiliser des sockets avec le serveur de développement

Vous pouvez exécuter et tester du code à l'aide de sockets sur le serveur de développement, sans utiliser de paramètres de ligne de commande spéciaux.

Utiliser des sockets avec OpenSSL

App Engine accepte la bibliothèque OpenSSL Python native pour l'environnement d'exécution Python 2.7. Vous devez configurer le fichier app.yaml pour charger la bibliothèque SSL, comme décrit dans la page Utilisation de SSL Python.

Désactiver la gestion de toutes les requêtes sortantes par UrlFetch

Si vous importez le module httplib, il utilisera par défaut l'API UrlFetch. Pour modifier ce paramètre afin que httplib utilise plutôt des sockets, ajoutez la variable d'environnement suivante à votre fichier app.yaml :

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Vous pouvez remplacer anyvalue par n'importe quelle valeur, y compris une chaîne vide.

Exemple d'utilisation de sockets sur App Engine

Pour un exemple d'utilisation de sockets, consultez l'application de démonstration de socket sur le GitHub de Google Cloud Platform.