Job queues, messages queues
état des lieux & retours d'expérience

PHP Forum 2013
Jean-François Bustarret (CTO), Sylvain L...
SOCLOZ ?
Un peu de contexte…

15/11/13

SoCloz - Tous droits réservés

2
Socloz : l’équipe

• 
• 
• 
• 
• 

Fondée en 2010
En ligne depuis novembre 2011
Deuxième levée de fond bouclée
10 personne...
SoCloz : le produit

Moteur de recherche de produits en magasin
1 500 000 produits dans plus de 10 000 magasins et 150 ens...
SoCloz : l’architecture

Architecture à base de micro-services
Frontend : PHP Symfony2 • Backend : Go/PHP (Erlang) • 14 se...
MESSAGES QUEUES : GÉNÉRALITÉS
Principes de bases, patterns d’utilisation et critères de choix

15/11/13

SoCloz - Tous dro...
Message queues : principe de base

Une message queue, comment ça marche ?
Serveur	
  1	
  

consommateur	
  

producteur

...
Message queues : patterns d’utilisation

Point à point (job queue, RPC)
consommateur	
  

producteur

broker	
  

consomma...
Message queues : patterns d’utilisation

Publish-subscribe / fan-out
consommateur	
  

producteur

broker	
  

consommateu...
Message queues : patterns d’utilisation

Publish-subscribe / fan-out
consommateur	
  

producteur

broker	
  

consommateu...
Message queues : critères de choix

•  Besoins fonctionnels
• 
• 
• 
• 

Point à point ou fan-out
Traitements différés
Rej...
PROBLÉMATIQUE #1
Traitement des flux

15/11/13

SoCloz - Tous droits réservés

12
Problématique #1 : traitement des flux
Besoin

Parallélisation de traitements
Solution : beanstalkd

•  Job queue (priorit...
Beanstalk : exemple de code
pda/pheanstalk

Producteur

Consommateur

// initialisation
$pheanstalk = new Pheanstalk_Phean...
Beanstalk : analyse
Avantages

•  performant : in-memory, event-driven
•  facile à mettre en place (pas de conf)
Inconvéni...
PROBLÉMATIQUES #2 ET #3
Statistiques
Agents

15/11/13

SoCloz - Tous droits réservés

16
Problématique #3 : statistiques
Besoin
Décompte des vues produits/
marques/magasins/catégories

Solution initiale
Ecriture...
Problématique #4 : agents
Besoin
Traitements asynchrones sur les
données importées
• 
• 
• 
• 
• 

enrichissement de donné...
Solution #1: NSQ

NSQ, Matt Reiferson @ bitly (2012)
https://github.com/bitly/nsq
https://github.com/davegardnerisme/nsqph...
NSQ : architecture
producteur

Envoi de messages sur un/plusieurs nsqd

nsqd

nsqd

nsq
lookupd

nsqd

Connexion à tous
le...
NSQ : exemple de code
nsqphp

Producteur

Consommateur

// initialisation
$nsq = new nsqphpnsqphp();
$nsq->publishTo('loca...
NSQ : contraintes sur le client
Problème

écouter plusieurs connexions nsqd en parallèle
Solution

E/S asynchrones (React)...
NSQ : conclusion
Avantages
facile à mettre en place

•  pas de conf
•  topic / channel créés à la volée

Inconvénients
con...
Solution #2 : RabbitMQ/AMQP
AMQP (Advanced Message Queuing Protocol)
•  architecture programmable : exchange / queue (poin...
RabbitMQ : exemple de code (pub/sub)
php-amqplib

Producteur

Consommateur

// initialisation
$connection = new AMQPConnec...
RabbitMQ ou beanstalkd + NSQ ?
Job queue : beanstalkd vs RabbitMQ

1.  Réponse au besoin fonctionnel : beanstalkd > Rabbit...
AUTRES OUTILS
Voire autres problématiques…

15/11/13

SoCloz - Tous droits réservés

27
Autres outils : les plus simples
Redis (C)

Pub/sub simple, job queues simples. En direct ou avec un surcouche (ex: resque...
Autres outils : les plus complexes
Amazon SNS/SQS (SaaS)

SNS (pub/sub) et SQS (job queue), à coupler éventuellement
Les –...
Autres problématiques : event/log processing
Distribué, performant, fonctionnel limité
Conçus souvent pour transporter des...
Autres problématiques : Stream processing
Storm - (Java/Clojure – Twitter, Groupon)

Des spouts injectent des flux de donn...
Merci !
SoCloz recrute :
-  Un dev frontend (HTML/CSS/PHP+Symfony2)
-  Un dev backend (PHP+Symfony2/Go)
-  Un devops (Linu...
Prochain SlideShare
Chargement dans…5
×

Messages queues - Socloz@PHPForum 2013

1 718 vues

Publié le

1/ Retour d'expérience sur la mise en place d'une message queue pour SoCloz - http://www.socloz.fr.

- première phase : job queue, résolu par la mise en place de beanstalk
- deuxième phase : pub/sub.

Alternatives évaluées : NSQ (en complément de beanstalk) et RabbitMQ.

Adéquation fonctionnelle : léger avantage pour beanstalk (job), égalité (pub/sub)
Simplicité : avantage pour beanstalk/NSQ
Durabilité : avantage RabbitMQ

2/ Etat des lieux des solutions de message queue

Publié dans : Technologie
0 commentaire
3 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 718
Sur SlideShare
0
Issues des intégrations
0
Intégrations
212
Actions
Partages
0
Téléchargements
20
Commentaires
0
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Messages queues - Socloz@PHPForum 2013

  1. 1. Job queues, messages queues état des lieux & retours d'expérience PHP Forum 2013 Jean-François Bustarret (CTO), Sylvain Lassaut (Lead Dev)
  2. 2. SOCLOZ ? Un peu de contexte… 15/11/13 SoCloz - Tous droits réservés 2
  3. 3. Socloz : l’équipe •  •  •  •  •  Fondée en 2010 En ligne depuis novembre 2011 Deuxième levée de fond bouclée 10 personnes (pas de stagiaires) 5 embauches en cours 15/11/13 SoCloz - Tous droits réservés 3
  4. 4. SoCloz : le produit Moteur de recherche de produits en magasin 1 500 000 produits dans plus de 10 000 magasins et 150 enseignes www.socloz.fr SFR Shopping [mobile] Le Guide Mappy Shopping … Un système de réservation Naf-Naf Le Tanneur Guy Degrenne … 15/11/13 SoCloz - Tous droits réservés 4
  5. 5. SoCloz : l’architecture Architecture à base de micro-services Frontend : PHP Symfony2 • Backend : Go/PHP (Erlang) • 14 serveurs récep,on  des  flux   enseigne   frontend   importa,on   API  internes   normalisa,on   enrichissement   indexa,on   15/11/13 SoCloz - Tous droits réservés 5
  6. 6. MESSAGES QUEUES : GÉNÉRALITÉS Principes de bases, patterns d’utilisation et critères de choix 15/11/13 SoCloz - Tous droits réservés 6
  7. 7. Message queues : principe de base Une message queue, comment ça marche ? Serveur  1   consommateur   producteur broker   consommateur   Serveur  2   consommateur   15/11/13 SoCloz - Tous droits réservés 7
  8. 8. Message queues : patterns d’utilisation Point à point (job queue, RPC) consommateur   producteur broker   consommateur   consommateur   15/11/13 SoCloz - Tous droits réservés 8
  9. 9. Message queues : patterns d’utilisation Publish-subscribe / fan-out consommateur   producteur broker   consommateur   consommateur   15/11/13 SoCloz - Tous droits réservés 9
  10. 10. Message queues : patterns d’utilisation Publish-subscribe / fan-out consommateur   producteur broker   consommateur   consommateur   15/11/13 SoCloz - Tous droits réservés 10
  11. 11. Message queues : critères de choix •  Besoins fonctionnels •  •  •  •  Point à point ou fan-out Traitements différés Rejeu/Rejeu différé en cas de plantage de worker Priorités •  Garanties •  •  •  Durabilité & Délivrabilité (plantage broker, consommateur inactif) Garantie d’unicité Garantie d’ordre •  Débit Qu’est ce que je suis capable d’exploiter ? Un outil universel et complexe ou deux outils spécialisés et simples ? 15/11/13 SoCloz - Tous droits réservés 11
  12. 12. PROBLÉMATIQUE #1 Traitement des flux 15/11/13 SoCloz - Tous droits réservés 12
  13. 13. Problématique #1 : traitement des flux Besoin Parallélisation de traitements Solution : beanstalkd •  Job queue (priorité, délai) •  Catégorisation (tubes) •  Protocole simple et robuste : clients disponibles pour la plupart des langages 15/11/13 SoCloz - Tous droits réservés 13
  14. 14. Beanstalk : exemple de code pda/pheanstalk Producteur Consommateur // initialisation $pheanstalk = new Pheanstalk_Pheanstalk( '127.0.0.1' ); $pheanstalk->useTube('test'); // initialisation $pheanstalk = new Pheanstalk_Pheanstalk( '127.0.0.1' ); $pheanstalk->watch('test'); // envoi d'un message $pheanstalk->put("hello world"); 15/11/13 // boucle de traitement des messages while (true) { $job = $pheanstalk->reserve(); try { // traitement ... echo $job->getData(); // suppression $pheanstalk->delete($job); } catch (Exception $e) { // requeue (priorité par défaut, délai 0) $pheanstalk->release($job, null, 0); } } SoCloz - Tous droits réservés 14
  15. 15. Beanstalk : analyse Avantages •  performant : in-memory, event-driven •  facile à mettre en place (pas de conf) Inconvénients •  pas de réplication / cluster •  support durabilité́ minimal / expérimental •  Linux & FreeBSD uniquement 15/11/13 SoCloz - Tous droits réservés 15
  16. 16. PROBLÉMATIQUES #2 ET #3 Statistiques Agents 15/11/13 SoCloz - Tous droits réservés 16
  17. 17. Problématique #3 : statistiques Besoin Décompte des vues produits/ marques/magasins/catégories Solution initiale Ecritures en base depuis le front Maximum 3 écritures de 1 à >100 compteurs sur une page Tops produits/marques/ magasins/catégories Map/Reduce Problèmes •  Trop d’écritures en base •  Coût des map-reduce •  « Tu me ferais le top marques de chaque catégorie ? En temps réel ? » Nouveau besoin Fort volume, haute dispo, faible criticité 15/11/13 SoCloz - Tous droits réservés 17
  18. 18. Problématique #4 : agents Besoin Traitements asynchrones sur les données importées •  •  •  •  •  enrichissement de données (http, …) normalisation géocodage des adresses des magasins téléchargement d’images … Solution initiale Planification (polling) Stockage d’un état en base de données 3 requêtes à chaque planification : •  Nouvelles données •  Réessais •  Mises à jour Envoi de tâches dans Beanstalkd Problèmes •  Requêtes de planifications coûteuses •  Ce serait mieux avec de vrais observers Nouveau besoin : observers Pub/sub, faible criticité 15/11/13 SoCloz - Tous droits réservés 18
  19. 19. Solution #1: NSQ NSQ, Matt Reiferson @ bitly (2012) https://github.com/bitly/nsq https://github.com/davegardnerisme/nsqphp consommateur   producteur topic   channel consommateur   consommateur   15/11/13 SoCloz - Tous droits réservés 19
  20. 20. NSQ : architecture producteur Envoi de messages sur un/plusieurs nsqd nsqd nsqd nsq lookupd nsqd Connexion à tous les nsqd simultanément 15/11/13 nsqd Notification des nsqlookups de la présence du topic nsq lookupd consomma teur SoCloz - Tous droits réservés Quels nsqd produisent ce topic ? 20
  21. 21. NSQ : exemple de code nsqphp Producteur Consommateur // initialisation $nsq = new nsqphpnsqphp(); $nsq->publishTo('localhost'); // initialisation $nsq = new nsqphpnsqphp( new nsqphpLookupFixedHosts('localhost:4160') ); $nsq ->subscribe('test', 'channel1', function ($msg) { // traitement... echo $msg->getPayLoad(); }) ->subscribe('test', 'channel2', function ($msg) { // traitement... echo $msg->getPayLoad(); }); // envoi d'un message $nsq->publish( 'test', new nsqphpMessageMessage('hello world') ); // boucle de traitement $nsq->run(); 15/11/13 SoCloz - Tous droits réservés 21
  22. 22. NSQ : contraintes sur le client Problème écouter plusieurs connexions nsqd en parallèle Solution E/S asynchrones (React) http://reactphp.org/ •  •  •  écouteurs (callback) d’événements (écriture, lecture...) sur descripteur (fichier, connexion) timers (appel différé́) plusieurs backends disponibles : libev, libevent, select 15/11/13 SoCloz - Tous droits réservés 22
  23. 23. NSQ : conclusion Avantages facile à mettre en place •  pas de conf •  topic / channel créés à la volée Inconvénients contraintes sur le client idempotence haute disponibilité́ •  support simple et robuste admin web Conclusion •  Idéal pour pub/sub •  Peu adapté à notre besoin de job queue 15/11/13 SoCloz - Tous droits réservés 23
  24. 24. Solution #2 : RabbitMQ/AMQP AMQP (Advanced Message Queuing Protocol) •  architecture programmable : exchange / queue (point à point, fan-out, …) •  durabilité (réglable par message) •  authentification / contrôle d'accès RabbitMQ •  Ecrit en Erlang @ Rabbit Technologies (2008) •  Protocoles AMQP, HTTP(S), XMPP... •  Gestion de plugins (Erlang) •  Cluster / réplication Client PHP : php-amqplib, amqp (pecl) 15/11/13 SoCloz - Tous droits réservés 24
  25. 25. RabbitMQ : exemple de code (pub/sub) php-amqplib Producteur Consommateur // initialisation $connection = new AMQPConnection( 'localhost', 5672, 'guest', 'guest' ); $channel = $connection->channel(); $channel->exchange_declare( 'test', 'fanout' ); // initialisation $connection = new AMQPConnection( 'localhost', 5672, 'guest', 'guest' ); $channel = $connection->channel(); // envoi d'un message $channel->basic_publish( new AMQPMessage("hello world"), '', 'test' ); $channel->exchange_declare( 'test', // nom 'fanout' // type ); list($queue_name, ,) = $channel->queue_declare(); $channel->queue_bind($queue_name, 'test'); $channel->basic_consume( $queue_name, '', false, true, false, false, function ($msg) { // traitement echo $msg->body; } ); // boucle de traitement while(count($channel->callbacks)) { $channel->wait(); } 15/11/13 SoCloz - Tous droits réservés 25
  26. 26. RabbitMQ ou beanstalkd + NSQ ? Job queue : beanstalkd vs RabbitMQ 1.  Réponse au besoin fonctionnel : beanstalkd > RabbitMQ 2.  Simplicité : beanstalkd >> RabbitMQ 3.  Disponibilité : RabbitMQ >> beanstalkd Pub / sub : NSQ vs RabbitMQ 1.  Réponse au besoin fonctionnel : NSQ ≈ RabbitMQ 2.  Simplicité : NSQ >> RabbitMQ 3.  Délivrabilité/Durabilité : RabbitMQ > NSQ Simplicité totale : NSQ + beanstalkd > RabbitMQ 15/11/13 SoCloz - Tous droits réservés 26
  27. 27. AUTRES OUTILS Voire autres problématiques… 15/11/13 SoCloz - Tous droits réservés 27
  28. 28. Autres outils : les plus simples Redis (C) Pub/sub simple, job queues simples. En direct ou avec un surcouche (ex: resque – GitHub pour Ruby) Les - : fonctionnel limité (pas de rejeu, pas de différé) http://redis.io/ Gearman (C – LiveJournal, digg) RPC et job-queues Les - : pas optimal en job-queue, pas de clusterisation http://gearman.org/ http://pecl.php.net/package/gearman Kestrel (Scala - twitter, foursquare, tumblr) Job queue & pub/sub, protocole memcache Les - : assez lourd, nécessite un minimum de connaissance de Scala https://github.com/robey/kestrel http://blog.shupp.org/2011/05/07/getting-started-with-kestrel-from-a-php-application/ Darner (C++ - wavii) Dérivé de kestrel, plus simple, meilleurs performances Les - : wavii racheté par Google, pérennité ? https://github.com/wavii/darner IronMQ (SaaS) Fonctionnellement très complet et simple à mettre en place Les – : pas gratuit http://www.iron.io/mq 15/11/13 SoCloz - Tous droits réservés 28
  29. 29. Autres outils : les plus complexes Amazon SNS/SQS (SaaS) SNS (pub/sub) et SQS (job queue), à coupler éventuellement Les – : pas gratuit, latences http://aws.amazon.com/fr/sns/ et http://aws.amazon.com/fr/sqs/ Marconi (C – Openstack) Réponse d’OpenStack à SNS/SQS. Basé sur 0MQ, utilise MongoDB/QPID pour le stockage Les – : jeune (mais prometteur) https://wiki.openstack.org/wiki/Marconi Celery (Python – Instagram) Couche d’abstraction au dessus d’un broker (RabbitMQ, Redis, MongoDB, CouchDB, SQS, IronMQ, …) Les – : complexité (connaissance de Python recommandée) http://www.celeryproject.org/ 0MQ Librairie C, avec extension PHP PECL http://zeromq.org/ http://pecl.php.net/package/zmq AMQP QPID - http://qpid.apache.org/ ActiveMQ - http://activemq.apache.org/, Apollo - http://activemq.apache.org/apollo/ HornetQ - http://www.jboss.org/hornetq 15/11/13 SoCloz - Tous droits réservés 29
  30. 30. Autres problématiques : event/log processing Distribué, performant, fonctionnel limité Conçus souvent pour transporter des logs vers des systèmes de type Hadoop, mais utilisables pour faire des traitements Kafka (Java - LinkedIn, Tumblr, Twitter) http://kafka.apache.org/ Fluentd (C/Ruby – Line, SlideShare) http://fluentd.org/ Scribe (C++ - Facebook, Digg, Zynga) https://github.com/facebook/scribe Flume (Java - Cloudera) https://cwiki.apache.org/confluence/display/FLUME/Home 15/11/13 SoCloz - Tous droits réservés 30
  31. 31. Autres problématiques : Stream processing Storm - (Java/Clojure – Twitter, Groupon) Des spouts injectent des flux de données qui sont traités par un graphe de bolts, développés dans des langages variés (java, python, ruby, PHP, …) http://storm-project.net/ et https://github.com/Lazyshot/storm-php spout   spout   bolt   bolt   15/11/13 spout   bolt   bolt   SoCloz - Tous droits réservés bolt   31
  32. 32. Merci ! SoCloz recrute : -  Un dev frontend (HTML/CSS/PHP+Symfony2) -  Un dev backend (PHP+Symfony2/Go) -  Un devops (Linux/Go/PHP) techjobs@socloz.com http://www.socloz.fr @SoClozTech / @jfbus jf@socloz.com

×