Le backend d'une application web python

Comment avoir suffisamment à faire pour laisser le JS aux autres.

Balthazar Rouberol

Apéritif reptilien de Lugdunum, avril 2015

❦ But de la présentation ❦

❦ Préambule ❦

❦ Une application web Python en production ❦

http://www.fullstackpython.com/theme/img/full-stack-python-map.png

...

❦ Qu'est ce qu'il me faut au minimum? ❦

❦ Serveur web ❦

❦ Serveur WSGI ❦

Web Server Gateway Interface: interface standard entre un serveur web et une app WSGI

Flexibilité / portablité

Scaling: C'est le rôle du serveur WSGI (entre autres) que de gérer des milliers de requêtes, pas du framework!
Un serveur WSGI peut servir des requêtes de plusieurs applications WSGI (identiques ou différentes).

https://www.python.org/dev/peps/pep-3333/

❦ Application Python/WSGI ❦

Le choix du framework est une question de goût, sans influence sur la performance.

Les benchmarks "Hello world" sont sans intérêt.

❦ Bonne pratique: virtualenv en production? ❦

Un avis modéré sur les internets :

will you run multiple instances of your project on the same machine? -> yes
otherwise -> yes

Virtualenv est bien intégré par les serveurs WSGI. Mon avis: oui.

Un peu de lecture

❦ Base de données relationnelle ❦

Entrepôt pour des données liées les unes aux autres, permettant de les stocker et d'en récupérer des vues, via un language de requête (SQL).

Si vous n'avez pas de problème de scaling, prenez celle que vous voulez.

Les performances viennent avant tout d'un bon schéma et de bons index, pas directement de votre SGBD.

❦ Cache ❦

Entrepôt pour des données éphémères, mais complexes/lourdes à calculer:

There are only two hard things in Computer Science: cache invalidation and naming things.

-- Phil Karlton

❦ Redis vs Memcached ❦

https://stackoverflow.com/questions/10558465/memcached-vs-redis

Redis.

❦ Tâches de fond ❦

Système distribué permettant d'envoyer des tâches asynchrones à des workers, en temps réel ou en différé.

❦ Tâches de fond: les frameworks ❦

Q: What deserves to be a background job?
A: Anything that's not fast enough to be done synchronously in a safe and repeateable fashion.

Celery vs RQ ≃ Django vs Flask

Mesdames et messieurs, pour plus d'informations (et sans aucune gène):
http://brl.ovh/slides/celery-intro

❦ Bonnes pratiques: intégrer des tâches de fond dans l'app WSGI ❦

Une seule et même codebase.

|-- app1
|   |-- models.py
|   |-- tasks.py
|   `-- views.py
`-- app2
    |-- models.py
    |-- tasks.py
    `-- views.py

⊕ Plus facile à déployer
⊕ L'application WSGI frontend peut aussi lancer des tâches de fond
⊖ Les fichiers statiques (css, js, etc) sont inutilement déployés sur les workers

Un peu de lecture

❦ File de message (Message queue) ❦

Les deux s'intègrent parfaitement avec Celery: http://celery.readthedocs.org/en/latest/getting-started/brokers

Redis Queue impose redis. Vous l'aviez probablement deviné, futés comme vous êtes.

❦ Moteur de recherche ❦

Permet de faire des recherches complexes, facettées, textuelles rapidement.

Je n'en dis pas plus, j'ai très peu d'expérience dans le domaine, désolé.

Un peu de lecture

❦ Base de données NoSQL ❦

Permet de stocker des millions/milliards de documents "autosuffisants".

Montée en charge horizontale via du sharding (ajouter des serveurs) → Webscaling ™

❦ Quelques conseils et retours sur le NoSQL ❦

Un peu de lecture

❦ Cache web ❦

Cache des pages HTML pour éviter qu'une requête n'atteigne votre serveur web.

Exemple: page d'accueil d'un site de presse grand public pour un utilisateur anonyme.

❦ Superviseur ❦

Daemonise, monitore et contrôle un ensemble de processus: relance le processus en cas de crash, redirige les logs stdout/stderr, etc

supervisor> status
beat                             RUNNING    pid 1501, uptime 8 days, 23:57:29
celery_worker                    RUNNING    pid 32060, uptime 9 days, 4:57:17
flower                           RUNNING    pid 32406, uptime 9 days, 4:38:36
supervisor> stop flower
flower: stopped

Un peu de lecture:
- Nodervisor: interface web affichant le status de programmes supervisés par supervisor, sur des machines distribuées: Permet d'avoir une vue sur tous vos processus supervisés!
- Plugins supervisor: contrôle de la mémoire de chaque processus, alerte mail/SMS en cas de crash, etc

❦ Interface de supervision centralisée: Nodervisor ❦

❦ Log des erreurs / exceptions ❦

Système centralisant les rapports d'erreur / d'exceptions de vos applications, permettant de rejouer les requêtes, de stocker le contexte, etc.

❦ Index PyPI privé ❦

Permet d'héberger des packages python privés au sein de votre entreprise, tout en répliquant PyPI localement.

$ export PIP_INDEX_URL=http://myprivatepypi.example.com
$ pip install someprivatepackage  # tape dans votre index privé
$ pip install requests   # tape dans PyPI

❦ Autres sujets (non abordés, faute de temps et d'expérience) ❦

❦ Conclusions ❦

Il peut y avoir beaucoup d'outils à mettre en place. Essayez de pas céder à l'effet de mode et mutualisez les outils déjà installés, si possible.

Exemples:

Pourquoi?

❦ Conclusions ❦

Balthazar Rouberol

Apéritif reptilien de Lugdunum, avril 2015