27-10-2011, 12:09 PM
(Modification du message : 27-10-2011, 12:13 PM par Sephi-Chan.)
Je t'invite à lire ces slides très intéressants : Concurrency Control: How It Really Works.
Une job queue ne se fait pas avec du long polling ou quoi que ce soit lié au client. Redis (et je crois que c'est pareil avec RabbitMQ et compagnie) implémente un mécanisme de publish/subscribe qui va permettre de maintenir une queue (ou plusieurs) en envoyant des éléments dedans, avec un peu de données.
Dans Conquest on Rails, j'insère dans la queue un élément avec 2 informations : le nom d'une classe et l'id de la partie à lancer. Redis se fout de ces données, il les stocke juste.
Ensuite, d'autres programmes vont pouvoir écouter cette file et en dépiler les éléments pour en faire quelque chose. On appelle généralement ces processus des workers.
Pour reprendre l'exemple, ce travail est effectué par Resque (écrit en Ruby, mais un portage en PHP a été fait), qui va savoir quoi faire des informations qu'il dépile. Il va regarder le nom de la classe qu'on a renseigné et appeler sa méthode de classe (= statique) perform en lui passant en argument les autres informations qu'on a donné (en l'occurrence, l'id de la partie).
Une job queue ne se fait pas avec du long polling ou quoi que ce soit lié au client. Redis (et je crois que c'est pareil avec RabbitMQ et compagnie) implémente un mécanisme de publish/subscribe qui va permettre de maintenir une queue (ou plusieurs) en envoyant des éléments dedans, avec un peu de données.
Dans Conquest on Rails, j'insère dans la queue un élément avec 2 informations : le nom d'une classe et l'id de la partie à lancer. Redis se fout de ces données, il les stocke juste.
Ensuite, d'autres programmes vont pouvoir écouter cette file et en dépiler les éléments pour en faire quelque chose. On appelle généralement ces processus des workers.
Pour reprendre l'exemple, ce travail est effectué par Resque (écrit en Ruby, mais un portage en PHP a été fait), qui va savoir quoi faire des informations qu'il dépile. Il va regarder le nom de la classe qu'on a renseigné et appeler sa méthode de classe (= statique) perform en lui passant en argument les autres informations qu'on a donné (en l'occurrence, l'id de la partie).