accès concurrents et scalabilité
DESCRIPTION
L'accès concurrentiel est un problème majeur et récurrent dans toute application web un tant soit peu sollicitée. De sévères problèmes de corruption de caches et de locking se produisent quand la concurrence d’accès n’a pas été prise en compte dans le processus de développement et l’analyse initiales de l’application.Les conséquences business peuvent être fatales et donner une image catastrophique d’une plateforme: pages vides, données obsolètes présentées, images corrompues, autant d’échecs, cuisants pour les techniciens, et coûteux pour l’entreprise. Confrontés à ces problématiques au cours de 10 dernières années sur des plateformes critiques de publication de contenu, servant plusieurs dizaines de millions de pages par mois, nous voudrions partager les bonnes pratiques d’architecture logicielle que nous avons accumulées: résorption des lock & deadlock de bases de données, des transactions volumineuses, optimisation de l’entrée/sortie disque.La diffusion de plus en plus large de PHP, et la professionnalisation de son usage le placent dans des contextes où sont rapidement atteintes les limites du langage quant à la gestion de la concurrence. Nous partagerons le résultat de notre recherche & développement, touchant aussi bien les outils utilisables dans ce contexte (Varnish, Memcached, Redis...) que les algorithmes et architectures adaptées.TRANSCRIPT
Accès%concurrents%et%scalabilitéJérôme'Vieilledent
mercredi 6 juin 12
Market-driven Innovation
From simple presentation and content management
to digital businessFocus of organization’s core-
business and simplify complexity:
cloud-enablement
mercredi 6 juin 12
eZ Community eZ R&D
CommunityeZ R&DPartner conferencesProduct Innovation BoardeZ Market
The 5 pillars of Innovation @ eZ
mercredi 6 juin 12
4
Quoi ? Des accès concurrents en PHP ???
mercredi 6 juin 12
Quoi ? Des accès concurrents en PHP ???
PHP est synchrone
Chaque processus est isolé
HTTP est (à peu près) stateless et PHP respecte ce principe
5
mercredi 6 juin 12
Quoi ? Des accès concurrents en PHP ???
Sauf que les visiteurs ne sont pas synchrones... Et les contributeurs non plus...
Flux PHP => OK
Interaction avec le monde extérieur => c’est une autre histoireLe cache est généralement écrit sur un disqueIdem pour fichiers publiés par les contributeursTransactions BDD
6
mercredi 6 juin 12
7
Accès concurrents : Cas classique
mercredi 6 juin 12
Le cas idéal
8
WebApp
mercredi 6 juin 12
Le cas idéal
8
WebAppContent'cache
mercredi 6 juin 12
Le cas idéal
8
WebAppContent'cache
mercredi 6 juin 12
Cache en cours de génération
9
WebApp
mercredi 6 juin 12
Cache en cours de génération
9
WebAppContent'cache'(genera9ng)
mercredi 6 juin 12
Conséquences potentielles
Lock wait timeout
Blocs de cache vides
Deadlocks
Pages chargeant indéfiniment
Écritures concurrentes
Cache corrompu
10
mercredi 6 juin 12
Conséquences potentielles
11
mercredi 6 juin 12
Solutions immédiates
Pré-génération du cacheQue sert-on pendant la génération ?
CDN (Akamai, Level3)€€€ $$$ £££
Reverse-proxy (Varnish)Site plus statique (à première vue)
12
mercredi 6 juin 12
13
Stale Cache
mercredi 6 juin 12
14
mercredi 6 juin 12
14
mercredi 6 juin 12
14
mercredi 6 juin 12
15
Scalabilité : Introduction au cluster
mercredi 6 juin 12
Pré-requis
16
Scalabilité%horizontale
mercredi 6 juin 12
Pré-requis
16
Scalabilité%horizontale
Cache(content,'config,'transla9on...)
Binaries
mercredi 6 juin 12
Pré-requis
16
Scalabilité%horizontale
Cache(content,'config,'transla9on...)
Binaries
mercredi 6 juin 12
Synchronisation : Quel(s) outil(s) ?
NFSPas très copain avec PHPPas fiable sur les metadata
SAN€€€ $$$ £££
RsyncLentSynchro indépendante de l’application (pas de contrôle)On part du principe que les ressources sont toujours disponibles
DRBDVoir Rsync
17
mercredi 6 juin 12
Synchronisation : Quel(s) outil(s) ?
17
PHP%Cluster
mercredi 6 juin 12
Cluster PHP
Librairie PHP «cluster aware»Se substitue aux fonctions PHP natives
$fh = eZClusterFileHandler::instance( ‘cache_file’ );$cache = $fh->fetchContents();
Stream wrapper : http://php.net/streamwrapper $cache = file_get_contents( ‘ezcache://<some_cache_id>’ );
Logique et Backend FS dédiésStockage fichiers physiques sur NFS + stats dans BDD (DFS)Stockage de blobs en BDD (Redis)
Fichiers binaires servis via un front-controller spécifiqueDroit au butÉviter les facilités de convenance (ORM...)Utiliser X-SENDFILE si possible
18
mercredi 6 juin 12
19
«Varnish, ça a quand même vachement plus la patate»
mercredi 6 juin 12
Varnish : Avantages
Cache statique, basé sur URI
«Bulle de protection» autour des serveurs frontaux
Possible de cacher des fragments via ESI
20
mercredi 6 juin 12
Varnish : Inconvénients
Externe à l’application
Basé sur des TTL en secondes (Cache-Control)
Tout ne peut pas être caché (POST, certaines requêtes AJAX...)
Gestion des ESI peut être un (gros) poil complexe
21
mercredi 6 juin 12
22
Le meilleur des deux mondes
mercredi 6 juin 12
Varnish : Le meilleur des 2 mondes
Utiliser Varnish (ou autre CDN) pour les médias
Utiliser l’API cluster pour purger/remplir le cache HTTP
23
mercredi 6 juin 12
24
Conclusion
mercredi 6 juin 12
Conclusion
PHP est synchrone, pas vos visiteurs, ni vos contributeurs
Toujours réfléchir si l’implémentation est «concurrency-safe»
Eviter l’effet «boîte noire» d’outils externes
25
mercredi 6 juin 12
26
Fin
Twitter : @jvieilledenthttps://joind.in/6461
mercredi 6 juin 12