Archives pour octobre, 2010

Problème d’accès concurrent… au restaurant

Une petite histoire vraie qui nous est arrivée alors que je déjeunais avec des collègues, dans un restaurant près du travail. Nous étions huit, et au moment du déssert, entre les cafés et les désserts, les commandes sont passées de manière un peu désordonnée. C’est là que le drame s’est produit !

Un collègue commande un café. Un autre renchéri « deux cafés ». Un troisième et moi-même annonçons presque en même temps « trois cafés ». Avec nos quatre autres collègues qui commandaient simultanément des parts de tarte, des îles flottantes, etc., nous ne nous en sommes pas aperçu… jusqu’au moment où la serveuse nous apporta les desserts, et les trois cafés !

Le problème a évidemment été rapidement résolu, mais je me suis fait la réflexion : « tiens, un problème d’accès concurrent ! », qui (outre la déformation professionnelle qu’il prouve) m’a donné l’idée de ce billet.

Pour ceux qui n’auraient pas suivi, revoyons la scène au ralenti :

  • l’instance unique « serveuse » de la classe « Serveur » maintient une variable « nombreCafes » (entre autres variables qui ne nous intéressent pas)
  • chacun des huit threads « collegues » accède à « serveuse » pour faire des mises à jour de la commande
  • la variable « nombreCafes », malheureusement non synchronisée, a été récupérée par deux « collegues » avec la valeur ‘2’. Chacun l’a incrémenté, puis a effectué la mise à jour de cette valeur à ‘3’.

Le problème étant maintenant identifié, il convient de le résoudre de manière durable. En en discutant avec ces mêmes collègues, voici déjà plusieurs idées qui ont germé (les auteurs se reconnaitrons) :

  • Idée numéro 1 : on pose un jeton au milieu de la table. Seul la personne qui a le jeton en main a le droit de mettre la commande à jour. Pour l’acquisition du jeton, la loi du plus fort s’applique.
  • Idée numéro 2 : le problème provient évidemment d’une charge trop importante sur l’unique instance de « Serveur ». Il faut donc la remplacer par un pool de serveurs. Chaque collègue récupère du pool un serveur libre auprès duquel il passe sa commande. J’aime bien cette idée d’un serveur dédié au traitement de ma commande.

Si vous avez d’autres idées issues du monde de l’informatique (ou pas) pour empêcher ce problème de se reproduire (si possible donnant lieu à une situation loufoque), proposez-les en commentaire !