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

Symfony Lock & Semaphore

Grégoire Pineau
May 28, 2021
860

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.

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

    View Slide

  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

    View Slide

  3. Situation de compétition

    View Slide

  4. Situation de compétition

    View Slide

  5. Situation de compétition

    View Slide

  6. Solutions ?
    Les locks ou sémaphores

    View Slide

  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.

    View Slide

  8. symfony/lock
    Son utilisation

    View Slide

  9. Installation

    View Slide

  10. Utilisation

    View Slide

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

    View Slide

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

    View Slide

  13. Expiration

    View Slide

  14. Lock partagé (Shared)

    View Slide

  15. symfony/lock
    Son architecture

    View Slide

  16. Une interface pour représenter le Lock

    View Slide

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

    View Slide

  18. Un Store pour persister le lock

    View Slide

  19. Un Lock

    View Slide

  20. Assemblage

    View Slide

  21. Un LockFactory pour la DX

    View Slide

  22. symfony/lock
    Les stores

    View Slide

  23. Distribué Expiration Bloquant Partagé
    Flock ✅ ✅
    Memcached ✅ ✅
    MongoDb ✅ ✅
    PDO ✅ ✅
    Postgres ✅ ✅ ✅
    Redis ✅ ✅ ✅
    Semaphore ✅
    Zookeeper ✅
    Les stores

    View Slide

  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

    View Slide

  25. Configuration

    View Slide

  26. symfony/lock
    Utilisation avancé

    View Slide

  27. Async ou cross process

    View Slide

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

    View Slide

  29. Vérifier les valeurs de retours

    View Slide

  30. Assigner le lock

    View Slide

  31. symfony/lock
    Des uses cases

    View Slide

  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

    View Slide

  33. Les sémaphores

    View Slide

  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

    View Slide

  35. Installation

    View Slide

  36. Utilisation

    View Slide

  37. Store(s)
    ● Uniquement Redis
    ● Non bloquant
    ● Distribué
    ● Avec expiration
    ● PR welcome pour ajouter des nouveaux stores

    View Slide

  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é 😁

    View Slide

  39. Merci

    View Slide