C'est bien connu, les frameworks full stack, c'est lourd et c'est lent, Symfony le premier. Et chez CCM Benchmark (2ème groupe internet français - 50M de VU), on fait tout pour éviter la lenteur ! Alors pourquoi ai-je décider de migrer nos dizaines d'applications vers Symfony ? Et surtout comment respecter les critères de performances que nous avions défini avec notre bon vieux framework maison ?
Voyons ensemble les raisons qui m'ont poussé à faire ce choix et surtout quels process et solutions nous avons pu mettre en oeuvre pour éviter des régressions de performance.
24. La vitesse de requête ne fait pas tout
Optimisez votre cache privé!
25. ESI / 304 à l’origine
Optimisez votre cache public !
26. Les ESI : un fonctionnement méconnu
<esi:include
src="http://example.com/footer"
onerror="continue" />
27. Les 304 : Une page toujours à jour
Visiteur Proxy
GET /produit
Backend
GET /produit
Page en cache ?
200 OK
Non
Oui
200 OK
GET /produit
If-Modified-Since: Sun, 03
Apr 2016 18:14:00 GMT
304 Not Modified
40. Création des scénarios
scenarios:
HP horoscope:
- /psychologie/horoscope/
HP zodiac:
- /psychologie/horoscope/zodiaque/
Prevision belier du jour:
- /psychologie/horoscope/zodiaque/belier-
jour/
41. Back to brackets
Peer Review Tests unitaires
Tests fonctionnels Test utilisateur
Tests de
performance
Il ne manquerait pas quelque chose ?
Les tests de performance ! Difficiles à automatiser (qu'est ce que je mesure et comment) ?
Reprenons cette présentation au début
Pourquoi on est aussi sévères
Pourquoi varnish / le cdn ne sont pas les seules bonnes réponses
10 To de RAM pour varnisher tous nos sites
De la même manière que pour un bug, plus la détection est tardive, plus le nombre de personne mobilisé augmente et plus l’impact business est important.
Effet cascade d'une requête qui prend trop de temps
Quel type d'outil ? Un framework full stack ou un micro framework ? Comment s'assurer qu'on a toujours de bonnes performances.
Etude pour choisir le nouveau framework
Et là, bingo, on confirme toutes les théories sur le fait que les framework full stack, c'est long et lourd.
Symfony s’en sort légèrement mieux que laravel en conso CPU. Par contre en mémoire il s’agit du plus gourmand.
Evidemment le plain PHP est bien plus rapide que l’ensemble des des frameworks testés et sert de groupe test.
Le fmraework
Doctrine est un bon outil, cependant il ne répond pas à nos contraintes comment faire dès lors ?
Pour un project long terme, Active Record n’est pas un bon choix. D’ailleurs c’est considéré comme un anti pattern Séparation des responsabilités!
Pour un project long terme, Active Record n’est pas un bon choix. D’ailleurs c’est considéré comme un anti pattern Séparation des responsabilités!
On ne développe pas des librairies mais des implémentations. Nous avons actuellement Postgresql & MariaDb on souhaite pouvoir utiliser les syntaxes spécifiques de ces outils lorsque c’est nécessaire.
On ne développe pas des librairies mais des implémentations. Nous avons actuellement Postgresql & MariaDb on souhaite pouvoir utiliser les syntaxes spécifiques de ces outils lorsque c’est nécessaire.
Un outil Open-Source qui répond à nos contraintes
Le TingBundle pour l’intégrer à Symfony
Le TingUserBundle pour exploiter FosUserBundle
Pour optimiser son cache de requête le cache infini est la meilleure solution
Je supprime les données du cache à chaque fois qu’elles sont modifiées à la source.
Pseudo standard soumis en 2001 au W3C qui ne l’a pas approuvé
Très simple dans l’absolu: on intègre un code XML
Fonctionnement intégré nativement à Symfony génération automatique des URL de fragment: il suffit simplement d’activer le support des ESI sur son reverse proxy
Pas utilisable actuellement sur varnish.
Intéressant notamment sur akamai car réseau entièrement dédié avec des routes optimisées en permanence
Alternatives pour varnish:
hit for pass: si une page doit nécessairement être en cache: force une requête en bypassant le cache
Ban: on expurge simplement le cache et la prochaine requête aura une version fraiche
Principe de base, on ne devrait jamais avoir un fichier de cache qui se compile en prod. Il faut toujours s’assurer que l’ensemble des fichiers nécessaire soit créé avant.
Et si besoin le surveiller L’implémentation de twig avait un problème: les fichiers compilés lors du cache-clear n’étaient pas forcément exploités et étaient régénérés avec une clé différente (résolution de chemins différente). On a corrigé ça et c’est dispo depuis Twig 1.18.0
On ne peut pas se permettre de laisser le premier internaute se prendre le temps de génération dans la vue et si c’est google on le paye le prix fort.
Quand on voit ça on se dit que tout va bien le cache:clear est en réalité effectué avec l’option –no-warmup
Cache-warmup à false par défaut symfony effectue un cache:clear –no-warmup.
Assets-Install: hard le système n’a pas besoin de lire le lien symbolique pour trouver les assets gain direct sur les disques
3 étapes Simples :
1 – Je constate qu’il y a un problème (158ms au total, 77ms d’IO)
2 – Je repère la fonction problématique
3 – Je repère son contexte d’exécution
Après le BDD, les TDD, le BBDD
J'appelle cette méthode le BBDD: Broken By Design Development
Avoir un backend qui répond rapidement est une bonne chose, mais ça ne sert à rien si votre front-end tue vos performances.
Attention à ne charger que les bons assets, s’assurer de les compiler en un seul appel et d’avoir le maximum d’appels asynchrones.
Petit rappel basique assets sur serveur cookie less, éventuellement un CDN