accès concurrents et scalabilité

Post on 18-Nov-2014

4.164 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

top related