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
2. SOCLOZ ?
Un peu de contexte…
15/11/13
SoCloz - Tous droits réservés
2
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. 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. 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. 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. 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. 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
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
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. 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. 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. PROBLÉMATIQUES #2 ET #3
Statistiques
Agents
15/11/13
SoCloz - Tous droits réservés
16
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. 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
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. 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. 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. 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
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. 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. 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. 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. 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