PyConFr 2014

Lyon, October 25-28

PyConFR 2014

dimanche 12:00:00–12:30:00

Brood, une application web par des gens qui n'y connaissent pas grand chose

David Cournapeau

Audience level:
Intermediate

Description

Enthought gère une distribution python appelée Canopy/ex-EPD. Nous raconterons l'histoire de nos efforts pour remplacer les scripts/hacks pour la distribution de ces paquets par une application web, ce qui a marché, et ce qui n'a pas marché. Nous parlerons de nos efforts (avortés) pour utiliser asyncio, de nos problèmes avec eventlet, et aussi de qui a marché (nginx, SQLAlchemy, locust).

Abstract

La présentation sera organisée comme suivant

Introduction

Brève description du projet, simple démonstration.

Description de l'architecture asynchrone

L'architecture initiale de l'application a jusqu'à récemment été basée sur un processus "backend" utilisant asyncio + SQLAlchemy, avec des "workers" "front end" basés sur flask. Les processus "backend" et "frontend" communiquent au travers de 0mq + un protocole spécifique RPC.

Cette architecture était justifiée sur la base des problèmes spécifiques à l'application (génération de gros payload json, contraintes de vérification de gros fichiers en background, nombre/taille de fichier atteignant plusieurs dizaines de Go, etc...), et pour forcer une stricte séparation entre les parties sans état ("stateless") et avec état ("stateful").

Nous détaillerons aussi comment nous avons pu utiliser nginx pour non seulement servir de gros fichiers, mais aussi de manière moins classique accepter, et calculer les checksums à la volée de manière à ce qu'aucun processus python n'ait besoin de lire le fichier en mémoire.

Architecture courante

Des tests ont montre que l'architecture initiale n'était pas aussi robuste qu'espéré. En particulier, le processus "backend" causait des erreurs de type "segfault" régulières qui se sont révélées difficiles à réparer.

L'architecture a été simplifiée pour utiliser celery pour gérer les "jobs" en tâche de fond, et n'utiliser que des processus flask derrière nginx+gunicorn. L'architecture générale séparant les parties stateful/stateless a été conservée, mais sans une separation stricte entre processus.

Conclusion

Nous conclurons la presentation avec quelques chiffres de performance.

Sponsors