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

API GraphQL chez Allociné

API GraphQL chez Allociné

Avatar for Jimmy E

Jimmy E

May 18, 2018
Tweet

Other Decks in Programming

Transcript

  1. L’API GraphQL d’Allociné Jimmy Escrich – Allociné (Webedia) @escrichjimmy |

    @Ciloe Arnaud Lafon – Code Rhapsodie @arnaudlafon | @alafon Ceci n’est pas un talk sur GraphQL
  2. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL Et les clients dans tout ça What else ?
  3. • • • • • • • Il était une

    fois en 2016… Une API viellissante en .NET et MSSQL Une refonte sous Symfony de www Une refonte en cours de la db avec PG Des copains qui jouent avec Graph Un truc qui s’appelle Facebook Une refonte de l’appli mobile à venir 20 devs ~ |agile | 3-4 chantiers en //
  4. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  5. • • • • GraphQL en quelques mots HHVM vers

    NodeJS Spécifications : typage fort, etc Taillé pour de l’asynchrone Résolution des fields à la demande et de manière indépendante les uns des autres http://facebook.github.io/graphql/October2016/
  6. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  7. • • • La R&D chez Overblog : Le commencement

    Création de la librairie GraphQLPhpGenerator Génère du code Webonyx (cache) Surcouche de configuration forte en php Pas de magie !
  8. • • • La R&D chez Overblog : Le commencement

    Modif implem NodeJS => diff => Webonyx Gros avantage de notre coté : Þ Pas de modification de la config PHP Þ Juste à faire évoluer le générateur Ajout de nouveaux composants (graphql- bundle) => surcouche en yaml
  9. • • • • La R&D chez Overblog : L'évolution

    ACL : visibilité & accès Obfuscation erreurs Webonyx en prod Compatibilité avec les promesses Portage du JS jusqu'à sa version stable
  10. • • • La R&D chez Overblog : Et après

    ? Un des contributeurs majeurs de webonyx/graphql-php Découplage de GraphiQL dans un bundle séparé, utilisé par Webonyx Sortir de la dépendance à Symfony
  11. • • La R&D chez Overblog : Et après ?

    Analyser de complexité Proposer un graph client PHP Génération des queries en cache Asynchronisation par promesses Un « query builder » de vos requêtes #
  12. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  13. • • Le projet de refonte de l’API - 1

    On your marks, get set, … pas go Webonyx vs Youshido • Portage vs « from scratch » • ~ 2 mois de benchmark • 2 micro-kernels Symfony • Plusieurs « backends » pour l’exécution • On n’utilise pas le bundle d’Overblog • On mesure ! (grafana, telegraf, influxdb, …)
  14. • • • • • Le projet de refonte de

    l’API - 2 Perfs : ~ Framework : Youshido plutôt sexy Communauté : Webonyx ++ Facilité d’implémentation : ~ Relay pas « natif »
  15. Le projet de refonte de l’API - 3 • Bundle

    d’Overblog à faire évoluer pour la pagination • Système de promesses à creuser pour résoudre les problématiques de charge (on laisse de coté les forks pcntl & co pour le moment) • Cache Redis à améliorer
  16. • Le projet de refonte de l’API - 4 Au

    final GraphQL se prête bien à : - nos entités ciné & co - un projet en perpétuelle évolution - des changements de backend - des refactos régulières - des stories qui arrivent au compte goutte
  17. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  18. • • • • • • • La stack de

    dev Docker / Compose (Apache|Nginx) + php-fpm Pas besoin de Doctrine (yayy) PDO pour le moment Redis, Elasticsearch Symfony 3.4.*|4.* CI : Phpunit, Jenkins, Github, GCP (registry docker)
  19. La stack de dev - profiler Film: ‘Deadpool 2’ Un

    cinéma donné Le titre du film Les 2 premiers acteurs avec leur role Une liste de séances
  20. La stack de dev - profiler 2 requêtes au backend

    Elasticsearch Pas de cache Retourne des ids
  21. La stack de dev - profiler 4 requêtes à dataloader

    Cache Redis sur chacune des requêtes
  22. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  23. • Des promesses et du cache – 1 Problématique 1

    : cache d’une entité Ex : 1 Film => SELECT FROM movie.movie WHERE Cache = Redis Facile !
  24. • Des promesses et du cache – 2 Problématique 2

    : les listes simples Ex : une liste de 10 films => SELECT * FROM movie.movie LIMIT 10; Et si nouvelle query avec OFFSET = 5 ?? => Cache again ??? => Cache ???
  25. • Des promesses et du cache – 3 Problématique 3

    : les (vraies) listes Ex : une liste de films avec des filtres et qui ont probablement des acteurs en communs SELECT * FROM movie.movie + JOIN sur casting + JOIN sur person + etc => Cache ???
  26. • • • • Solution : dataloader & promesses Implémentation

    en PHP chez Overblog 1 dataloader par entité, voire par besoin Dataloader fallback sur un backend de données et gère le cache Des promesses et du cache – 4
  27. • • • • • • Le(s) backend(s) retourne(nt) ids

    Dataloader fait des promesses On dépile : - check le cache pour chaque id - une requête pour les ids manquants - mise en cache pour chaque id Des promesses et du cache – 5
  28. Des promesses et du cache – 7 Load d’une clé

    donnée Une promesse peut-être déjà présente en cache Sinon on la créé On l’ajoute à une queue On peut choisir de batcher les promesses ou les exécuter directement
  29. Des promesses et du cache – 8 Plusieurs clés =>

    ? Plusieurs appels à load($key) Création de plusieurs promesses qui appellent load($key) dans un callback
  30. Des promesses et du cache – 9 Réimplémentation de la

    méthode load() Si pas de hit : on encapsule le load() de base dans un mécanisme de cache. Sinon, on retourne une promesse considérée comme « remplie ».
  31. Des promesses et du cache – 10 Dataloader générique pour

    toutes nos entités Graph Définition du callable qui permet d’avoir des clés de cache uniques même lorsque des clés sont un tableau de paramètres. Définition du callable responsable du chargement d’une liste d’ids via un callable.
  32. Des promesses et du cache – 14 Parser GraphQL (Webonyx

    + bridge OB) Resolver Elasticsearch (retourne ids ) Construction des promesses (Dataloader) Cache de promesse (Redis) Exécution des promesses renvoyées par les dataloaders Promesse m call_user_func(callable, $ids) Cache d’entité (Redis) Promesse n ( fulfilled ) callable $repo ->find($ids) JSON
  33. Des promesses et du cache – 15 Multi-queries & alias

    2 requêtes Elasticsearch Mais : - une seule stack de promesse - Dataloader + cache redis qui font le job ! !
  34. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  35. ACL

  36. L’API GraphQL d’Allociné L’histoire du projet GraphQL en quelques mots

    Les librairies PHP, bundles et R&D Le projet de refonte de l’API Notre stack de dev Des promesses et du cache Un peu de sécurité et d'ACL What else ?
  37. • • • • • What else ? Mutations (écritures)

    pomm-project/pomm-bundle * Broker de message pour certaines opérations (php-fpm obligatoire) Migration vers Sf4 API publique ? J http://www.pomm-project.org/
  38. • • • • • What else ? github.com/overblog/GraphQLBundle github.com/overblog/GraphiQLBundle

    github.com/overblog/dataloader-bundle github.com/overblog/GraphQLPhpGenerator github.com/overblog/dataloader-php
  39. L’API GraphQL d’Allociné Jimmy Escrich – Allociné (Webedia) @escrichjimmy |

    @Ciloe Arnaud Lafon – Code Rhapsodie @arnaudlafon | @alafon https://joind.in/talk/3e2cf