Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Asynchrone avec Symfony Messenger et Mercure

Asynchrone avec Symfony Messenger et Mercure

Grégoire Pineau

July 03, 2020
Tweet

More Decks by Grégoire Pineau

Other Decks in Programming

Transcript

  1. Asynchrone avec Messenger et Mercure AFUP Day Tours 2020 -

    Grégoire Pineau - @lyrixx Dev @JoliCode CoreTeam @Symfony
  2. Un chargement synchrone Problème : mode synchrone • L’utilisateur doit

    attendre que la requête soit traitée • S’il change de page, l’import sera en échec • Le nombre de workers PHP (FastCGI ou mod_php) est une ressource limitée ⛈ Solution : mode asynchrone • Le traitement sera relégué en arrière plan • Par un autre processus : plus de problème avec FastCGI ou mod_php • Éventuellement sur une autre machine
  3. Faire de l’asynchrone • Meilleur temps de réponse • Facilite

    la scalabilité • Gestion des erreurs simplifiée • DX / Ops plus compliqué • Les actions ne sont plus “temps réel” • UX dégradée
  4. Messenger ? • Message Bus ◦ Command Bus ◦ Event

    Bus ◦ Query Bus ◦ Oui Bus (Merci Damien )
  5. Messenger On dispatch un message dans le bus Le bus

    route le message vers un handler Messenger agit comme un “man in the middle”
  6. Centraliser tous les messages via un bus, quelles conséquences ?

    • Logger chaque message • Valider les messages • Wrapper chaque handler dans une transaction SQL • Stocker le message quelque part… et ensuite exécuter une commande pour lire et traiter le message
  7. ET VOILÀ ! Merci En fait non, il y a

    encore un tout petit peu de boulot
  8. Des daemons pour les workers en production • SystemD -

    ou le superviseur de votre OS • Supervisord • Gérer par votre PaaS (Symfony Cloud, Heroku, Clever Cloud, …) Pensez à redémarrer les workers à chaque déploiement Exécuter autant de worker que nécessaire (scaling) Ne pas ajouter plus de worker sur une machine si elle est déjà CPU bounded
  9. Il existe de faux transports • sync:// Gère les messages

    de manière synchrone (dev) • in-memory:// Ne dispatch pas les messages aux handlers (test)
  10. Quelques remarques • Gestion des fichiers : local, NFS, distant,

    ou via la queue ? • Un message peut-il publier à son tour un message ? • Il faut monitorer la taille des queues, surtout celle “failed” ◦ Et pourquoi pas faire un écran dans l’admin du site
  11. Et plus encore • Intégration avec PHP Enqueue ◦ Kafka

    ◦ Amazon SQS ◦ Google Pub/Sub • Serialization de message • Middlewares et Event • Envelopes & Stamps • ApiPlatform Integration
  12. Une expérience utilisateur dégradée Comme l’import de données est asynchrone,

    l’utilisateur n’a aucun feedback : • Est-ce que l’import est en cours ? • Est-ce que l’import est fini ? • Est-ce que l’import s’est bien terminé ? Il faut donner un feedback à l’utilisateur en temps réel
  13. Les bénéfices des websockets • Communication Full Duplex • Bas

    niveau : contrôle total Les websockets VS SSE ? Les inconvénients des websockets • Bas niveau, donc à implémenter : ◦ Authentification ◦ Reconnexion ◦ Historique des messages “perdus” • Déprécié par HTTP 2 et 3 • Dur à sécuriser
  14. Mercure : Un nouveau protocole • Une spécification sur IEFT

    (encore en draft) • Full Duplex ◦ Publish : HTTP POST ◦ Subscribe : SSE • Nativement: reconnexion, récupération des messages “perdus”, historique • Auto découvrable : fait pour REST & GraphQL • Sécurisé avec JWT • Conçus pour les scripts avec une courte durée de vie: PHP, FastCGI, Serverless • Support du chiffrage End2End
  15. La sécurité • Mercure utilise JWT (JSON Web Token) •

    Le publisher doit être authentifié • Un subscriber ◦ Peut être anonyme (si la configuration l'autorise) ◦ Doit être authentifié pour recevoir du contenu privé • Un update peut cibler une ou plusieurs target • Deux transports : cookie ou Authorization header
  16. Le serveur (hub) • Il existe une implémentation de référence

    (en Go) ◦ Rapide ◦ Fonctionne partout (binaire statique et docker) ◦ HTTP 2 et HTTPs (via let’s encrypt) ◦ Support de CORS + CSRF ◦ Cloud native (12Factor app) ◦ Open Source (AGPL) • Il existe au moins une autre implémentation ◦ En JavaScript https://github.com/Ilshidur/node-mercure
  17. Conclusion • Messenger ◦ Simple à mettre en place (en

    dev et en prod) ◦ Son utilisation est facile ◦ Le composant est flexible ◦ Permet de décharger le front au profit de worker ◦ Le composant est stable • Mercure ◦ Simple à mettre en place (en dev et en prod) ◦ Il existe une version managée ◦ Donne du feedback à l’utilisateur ◦ Améliore la DX
  18. Vous avez aimé la démo ? Retrouver le code sur

    github : https://github.com/lyrixx/async-messenger-mercure