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

Symfony Lock & Semaphore

Grégoire Pineau
May 28, 2021
1.2k

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
  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. 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.
  4. Distribué Expiration Bloquant Partagé Flock ✅ ✅ Memcached ✅ ✅

    MongoDb ✅ ✅ PDO ✅ ✅ Postgres ✅ ✅ ✅ Redis ✅ ✅ ✅ Semaphore ✅ Zookeeper ✅ Les stores
  5. 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
  6. 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
  7. Store(s) • Uniquement Redis • Non bloquant • Distribué •

    Avec expiration • PR welcome pour ajouter des nouveaux stores
  8. 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é 😁