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

Symfony Lock & Semaphore

7602f2751868682b296171f58589c851?s=47 Grégoire Pineau
May 28, 2021
320

Symfony Lock & Semaphore

Les situations de compétition ("race condition" en Anglais) sont un problème récurrent en informatique. Elles existent à tous les niveaux, depuis le noyau linux, jusqu'a votre application en passant par la base de données.

Elles se caractérisent par un résultat différent selon l'ordre dans lequel agissent les acteurs du système. Une situation de compétition peut survenir dès que plusieurs acteurs tentent d'accéder au même moment à une ressource partagée (fichier, ligne dans une base de données, etc.) et qu'au moins l'un d'entre eux est susceptible de modifier son état.

Des solutions existent depuis très longtemps pour pallier ces problèmes. Symfony a introduit le composant Lock dans sa version 3.4, puis le composant Semaphore dans sa version 5.2.

Cette conférence a pour objectif de vous fournir les bons outils pour éviter toutes race condition, en utilisant le composant Lock ou Semaphore en fonction des situations rencontrées.

7602f2751868682b296171f58589c851?s=128

Grégoire Pineau

May 28, 2021
Tweet

Transcript

  1. LOCK ET SÉMAPHORE AFUP Day 2021 - Lille Grégoire Pineau

    - @lyrixx Dev @JoliCode - Core Team @symfony
  2. Situation de compétition Une situation de compétition (race condition en

    anglais), est une situation caractérisée par un résultat différent selon l'ordre dans lequel agissent les acteurs du système. - Wikipedia
  3. Situation de compétition

  4. Situation de compétition

  5. Situation de compétition

  6. Solutions ? Les locks ou sémaphores

  7. Plusieurs type de locks • au niveau de la base

    de données (*), ou de l’application • local ou distribué • bloquant ou non • avec ou sans expiration • partagé ou non (*) nous n’en parlerons pas aujourd’hui.
  8. symfony/lock Son utilisation

  9. Installation

  10. Utilisation

  11. Auto release (activé par défaut)

  12. Bloquant (désactivé par défaut)

  13. Expiration

  14. Lock partagé (Shared)

  15. symfony/lock Son architecture

  16. Une interface pour représenter le Lock

  17. Une Key pour sauvegarder l’état du lock dans le store

  18. Un Store pour persister le lock

  19. Un Lock

  20. Assemblage

  21. Un LockFactory pour la DX

  22. symfony/lock Les stores

  23. Distribué Expiration Bloquant Partagé Flock ✅ ✅ Memcached ✅ ✅

    MongoDb ✅ ✅ PDO ✅ ✅ Postgres ✅ ✅ ✅ Redis ✅ ✅ ✅ Semaphore ✅ Zookeeper ✅ Les stores
  24. Les stores Voir la documentation 🙏🙏🙏 https://symfony.com/doc/current/components/lock.html#available-stores https://symfony.com/doc/current/components/lock.html#reliability

  25. Configuration

  26. symfony/lock Utilisation avancé

  27. Async ou cross process

  28. symfony/lock Les pièges à éviter

  29. Vérifier les valeurs de retours

  30. Assigner le lock

  31. symfony/lock Des uses cases

  32. Des uses cases • Système distribué • Écriture dans plusieurs

    base de données • Commande (CLI / Cron) à exécution unique • Génération de cache / fichier • Heartbeat
  33. Les sémaphores

  34. Comparaison avec un lock • Un lock autorise l’accès à

    une ressource à uniquement 1 processus • Une sémaphore autorise l’accès à une ressource à N processus Un lock est une semaphore avec N = 1
  35. Installation

  36. Utilisation

  37. Store(s) • Uniquement Redis • Non bloquant • Distribué •

    Avec expiration • PR welcome pour ajouter des nouveaux stores
  38. Use cases • Limiter à N processus / tache en

    meme temps (Github Action, Travis, Circle CI, etc) • Data ingestion (elasticsearch, RDBMS) • Batch processing (email, crawling) • Limiter le nombre d’accès à la page /login (pour éviter un DDOS) • Limiter l’accès à une ressource à N personnes (page download, chat, etc) • La seul limite est votre créativité 😁
  39. Merci