Bien compter avec SQL pour un compteur de vues

Le site du Grand Club, le réseau social de RDS, est développé en Rails.

Le site Web a un gros trafic et de nombreuses interactions. Sur les billets, il y a des compteurs de vue. À chaque fois qu’un billet est accédé le nombre de vues est incrémenté dans la base de données de la façon suivante.

  1. Lecture du nombre de vues dans la base de données
  2. Incrémentation dans l’application Rails
  3. Écriture dans la base de données

Le problème est lorsque le trafic devient important plusieurs processus concurrents lisent la valeur de la base de données actuelles, exemple: 42. Tous ces processus incrémentent la valeur à 43 et donc tentent d’écrire la même valeur dans la base de données. Le nombre de vues est donc inexact. La correction a été faite en changeant simplement le processus.

  1. À chaque lecture de la page, demander à la base de données d’incrémenter la valeur par un.

C’est une erreur simpliste, mais corrigée. Il reste cependant un problème qui est cette fois ci de performances. L’incrémentation de la valeur dans la base de données représente une écriture.

Louis Asselin et Olivier Théreaux sont en recherche de solutions pour trouver un meilleur système utilisant possiblement un daemon de compteur, peut-être avec memcache. À suivre.

Tags: , , ,

3 comments

  1. Ont-ils finalement trouvé une solution élégante et performante ? Cela m’intéresse au plus haut point !

  2. Il y a plusieurs solutions autour de la notion de compteurs. Certaines passent par la notion de daemon, d’autres par l’utilisation de cache. Il y aura une suite à cet article.

  3. Mon vote, pour l’instant, reste celui d’un compteur non-persistent via memcache, avec sauvegarde en base de données toutes les n minutes.

Leave a comment