accès concurrents et scalabilité

34
Accès concurrents et scalabilité Jérôme Vieilledent mercredi 6 juin 12

Upload: jerome-vieilledent

Post on 18-Nov-2014

4.164 views

Category:

Technology


0 download

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

Page 1: Accès concurrents et scalabilité

Accès%concurrents%et%scalabilitéJérôme'Vieilledent

mercredi 6 juin 12

Page 2: Accès concurrents et scalabilité

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

Page 3: Accès concurrents et scalabilité

eZ Community eZ R&D

CommunityeZ R&DPartner conferencesProduct Innovation BoardeZ Market

The 5 pillars of Innovation @ eZ

mercredi 6 juin 12

Page 4: Accès concurrents et scalabilité

4

Quoi ? Des accès concurrents en PHP ???

mercredi 6 juin 12

Page 5: Accès concurrents et scalabilité

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

Page 6: Accès concurrents et scalabilité

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

Page 7: Accès concurrents et scalabilité

7

Accès concurrents : Cas classique

mercredi 6 juin 12

Page 8: Accès concurrents et scalabilité

Le cas idéal

8

WebApp

mercredi 6 juin 12

Page 9: Accès concurrents et scalabilité

Le cas idéal

8

WebAppContent'cache

mercredi 6 juin 12

Page 10: Accès concurrents et scalabilité

Le cas idéal

8

WebAppContent'cache

mercredi 6 juin 12

Page 11: Accès concurrents et scalabilité

Cache en cours de génération

9

WebApp

mercredi 6 juin 12

Page 12: Accès concurrents et scalabilité

Cache en cours de génération

9

WebAppContent'cache'(genera9ng)

mercredi 6 juin 12

Page 13: Accès concurrents et scalabilité

Conséquences potentielles

Lock wait timeout

Blocs de cache vides

Deadlocks

Pages chargeant indéfiniment

Écritures concurrentes

Cache corrompu

10

mercredi 6 juin 12

Page 14: Accès concurrents et scalabilité

Conséquences potentielles

11

mercredi 6 juin 12

Page 15: Accès concurrents et scalabilité

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

Page 16: Accès concurrents et scalabilité

13

Stale Cache

mercredi 6 juin 12

Page 17: Accès concurrents et scalabilité

14

mercredi 6 juin 12

Page 18: Accès concurrents et scalabilité

14

mercredi 6 juin 12

Page 19: Accès concurrents et scalabilité

14

mercredi 6 juin 12

Page 20: Accès concurrents et scalabilité

15

Scalabilité : Introduction au cluster

mercredi 6 juin 12

Page 21: Accès concurrents et scalabilité

Pré-requis

16

Scalabilité%horizontale

mercredi 6 juin 12

Page 22: Accès concurrents et scalabilité

Pré-requis

16

Scalabilité%horizontale

Cache(content,'config,'transla9on...)

Binaries

mercredi 6 juin 12

Page 23: Accès concurrents et scalabilité

Pré-requis

16

Scalabilité%horizontale

Cache(content,'config,'transla9on...)

Binaries

mercredi 6 juin 12

Page 24: Accès concurrents et scalabilité

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

Page 25: Accès concurrents et scalabilité

Synchronisation : Quel(s) outil(s) ?

17

PHP%Cluster

mercredi 6 juin 12

Page 26: Accès concurrents et scalabilité

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

Page 27: Accès concurrents et scalabilité

19

«Varnish, ça a quand même vachement plus la patate»

mercredi 6 juin 12

Page 28: Accès concurrents et scalabilité

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

Page 29: Accès concurrents et scalabilité

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

Page 30: Accès concurrents et scalabilité

22

Le meilleur des deux mondes

mercredi 6 juin 12

Page 31: Accès concurrents et scalabilité

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

Page 32: Accès concurrents et scalabilité

24

Conclusion

mercredi 6 juin 12

Page 33: Accès concurrents et scalabilité

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

Page 34: Accès concurrents et scalabilité

26

Fin

Twitter : @jvieilledenthttps://joind.in/6461

mercredi 6 juin 12