SlideShare a Scribd company logo
1 of 32
Download to read offline
Job queues, messages queues
état des lieux & retours d'expérience

PHP Forum 2013
Jean-François Bustarret (CTO), Sylvain Lassaut (Lead Dev)
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 personnes (pas de stagiaires)
5 embauches en cours

15/11/13

SoCloz - Tous droits réservés

3
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
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
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
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
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
Message queues : patterns d’utilisation

Publish-subscribe / fan-out
consommateur	
  

producteur

broker	
  

consommateur	
  

consommateur	
  

15/11/13

SoCloz - Tous droits réservés

9
Message queues : patterns d’utilisation

Publish-subscribe / fan-out
consommateur	
  

producteur

broker	
  

consommateur	
  

consommateur	
  

15/11/13

SoCloz - Tous droits réservés

10
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
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é, 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 – 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
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
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
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
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

More Related Content

What's hot

Ccna 4 configuration-de_frame_ relay_hub_and_spoke
Ccna 4 configuration-de_frame_ relay_hub_and_spokeCcna 4 configuration-de_frame_ relay_hub_and_spoke
Ccna 4 configuration-de_frame_ relay_hub_and_spokeTouré Kunda
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorFlorian Beaufumé
 
Les commandes CISCO (routeur)
Les commandes CISCO (routeur)Les commandes CISCO (routeur)
Les commandes CISCO (routeur)EL AMRI El Hassan
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c mouad Lousimi
 
Corrigé cisco wissamben
Corrigé cisco wissambenCorrigé cisco wissamben
Corrigé cisco wissambenWissam Bencold
 
05 2014-varnish
05 2014-varnish05 2014-varnish
05 2014-varnishthomaslc
 
Presentation
PresentationPresentation
Presentationbois
 
configuration vpn-ipsec-routeur
 configuration vpn-ipsec-routeur configuration vpn-ipsec-routeur
configuration vpn-ipsec-routeurJULIOR MIKALA
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureFlorian Hussonnois
 
Mise en place d'un vpn site à site avec pfsense
Mise en place d'un vpn site à site avec pfsenseMise en place d'un vpn site à site avec pfsense
Mise en place d'un vpn site à site avec pfsensePape Moussa SONKO
 
Maintenance du système Linux
Maintenance du système LinuxMaintenance du système Linux
Maintenance du système LinuxEL AMRI El Hassan
 

What's hot (20)

APACHE HTTP
APACHE HTTPAPACHE HTTP
APACHE HTTP
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Ccna 4 configuration-de_frame_ relay_hub_and_spoke
Ccna 4 configuration-de_frame_ relay_hub_and_spokeCcna 4 configuration-de_frame_ relay_hub_and_spoke
Ccna 4 configuration-de_frame_ relay_hub_and_spoke
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et Reactor
 
Les commandes CISCO (routeur)
Les commandes CISCO (routeur)Les commandes CISCO (routeur)
Les commandes CISCO (routeur)
 
Protocoles SSL/TLS
Protocoles SSL/TLSProtocoles SSL/TLS
Protocoles SSL/TLS
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
Corrigé cisco wissamben
Corrigé cisco wissambenCorrigé cisco wissamben
Corrigé cisco wissamben
 
WebSocket avec Java EE 7
WebSocket avec Java EE 7WebSocket avec Java EE 7
WebSocket avec Java EE 7
 
Vpn
VpnVpn
Vpn
 
E4 pt act_7_5_1
E4 pt act_7_5_1E4 pt act_7_5_1
E4 pt act_7_5_1
 
05 2014-varnish
05 2014-varnish05 2014-varnish
05 2014-varnish
 
Presentation
PresentationPresentation
Presentation
 
configuration vpn-ipsec-routeur
 configuration vpn-ipsec-routeur configuration vpn-ipsec-routeur
configuration vpn-ipsec-routeur
 
Routage
RoutageRoutage
Routage
 
Eigrp ccna v5
Eigrp ccna v5 Eigrp ccna v5
Eigrp ccna v5
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & Architecture
 
Mise en place d'un vpn site à site avec pfsense
Mise en place d'un vpn site à site avec pfsenseMise en place d'un vpn site à site avec pfsense
Mise en place d'un vpn site à site avec pfsense
 
Maintenance du système Linux
Maintenance du système LinuxMaintenance du système Linux
Maintenance du système Linux
 
Protocole EIGRP
Protocole EIGRPProtocole EIGRP
Protocole EIGRP
 

Viewers also liked

Laforgue Metodo Historico
Laforgue Metodo HistoricoLaforgue Metodo Historico
Laforgue Metodo HistoricoAdalberto
 
L'avenir du m o
L'avenir du m oL'avenir du m o
L'avenir du m oMajid Bdw
 
Prestige et réputation de votre compagnie de danse
Prestige et réputation de votre compagnie de dansePrestige et réputation de votre compagnie de danse
Prestige et réputation de votre compagnie de danseNorbert Leonhard
 
Les personnages du Pays de Fouesnant - phph7 efau
Les personnages du Pays de Fouesnant - phph7 efauLes personnages du Pays de Fouesnant - phph7 efau
Les personnages du Pays de Fouesnant - phph7 efauFoenizella.com
 
Programación 2010
Programación 2010Programación 2010
Programación 2010Adalberto
 
125 médecine et religion. r. panikkar. (document à télécharger en format
125 médecine et religion. r. panikkar. (document à télécharger en format 125 médecine et religion. r. panikkar. (document à télécharger en format
125 médecine et religion. r. panikkar. (document à télécharger en format Eldoux
 
Teletrabajo Sector Público
Teletrabajo Sector PúblicoTeletrabajo Sector Público
Teletrabajo Sector PúblicoHeidy Balanta
 
Toponymie du Pays de Fouesnant - phpid vp-qj
Toponymie du Pays de Fouesnant -   phpid vp-qjToponymie du Pays de Fouesnant -   phpid vp-qj
Toponymie du Pays de Fouesnant - phpid vp-qjFoenizella.com
 
Peuplement automatisé d’ontologies par analyse des programmes scolaires
Peuplement automatisé d’ontologies par analyse des programmes scolaires Peuplement automatisé d’ontologies par analyse des programmes scolaires
Peuplement automatisé d’ontologies par analyse des programmes scolaires ILOT Project
 
La galette des rois
La galette des roisLa galette des rois
La galette des roisAna Bailo
 
Régionales : les résultats par cantons
Régionales : les résultats par cantonsRégionales : les résultats par cantons
Régionales : les résultats par cantonsGuyon Jacky
 
tecnologias del domingo
tecnologias del domingotecnologias del domingo
tecnologias del domingomonica991
 
Laexpresindelconocimientocientfico 090623120646-phpapp01
Laexpresindelconocimientocientfico 090623120646-phpapp01Laexpresindelconocimientocientfico 090623120646-phpapp01
Laexpresindelconocimientocientfico 090623120646-phpapp01Adalberto
 
Verdaderoa(Musica)
Verdaderoa(Musica)Verdaderoa(Musica)
Verdaderoa(Musica)Adalberto
 
L A S CÉ L U L A S Y L O S O R G A N I S M O S V I V O S
L A S  CÉ L U L A S  Y  L O S  O R G A N I S M O S  V I V O SL A S  CÉ L U L A S  Y  L O S  O R G A N I S M O S  V I V O S
L A S CÉ L U L A S Y L O S O R G A N I S M O S V I V O Sjaival
 
Curiosidades
CuriosidadesCuriosidades
CuriosidadesMat2009
 
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2Rochefort-en-Terre Tourisme
 
Sergio G. Meneses Ponce
Sergio G. Meneses PonceSergio G. Meneses Ponce
Sergio G. Meneses PonceSergio Meneses
 
Le programme des courses du 2 août
Le programme des courses du 2 aoûtLe programme des courses du 2 août
Le programme des courses du 2 aoûtGuyon Jacky
 

Viewers also liked (20)

Laforgue Metodo Historico
Laforgue Metodo HistoricoLaforgue Metodo Historico
Laforgue Metodo Historico
 
L'avenir du m o
L'avenir du m oL'avenir du m o
L'avenir du m o
 
Prestige et réputation de votre compagnie de danse
Prestige et réputation de votre compagnie de dansePrestige et réputation de votre compagnie de danse
Prestige et réputation de votre compagnie de danse
 
Les personnages du Pays de Fouesnant - phph7 efau
Les personnages du Pays de Fouesnant - phph7 efauLes personnages du Pays de Fouesnant - phph7 efau
Les personnages du Pays de Fouesnant - phph7 efau
 
Programación 2010
Programación 2010Programación 2010
Programación 2010
 
125 médecine et religion. r. panikkar. (document à télécharger en format
125 médecine et religion. r. panikkar. (document à télécharger en format 125 médecine et religion. r. panikkar. (document à télécharger en format
125 médecine et religion. r. panikkar. (document à télécharger en format
 
La culture hacker
La culture hackerLa culture hacker
La culture hacker
 
Teletrabajo Sector Público
Teletrabajo Sector PúblicoTeletrabajo Sector Público
Teletrabajo Sector Público
 
Toponymie du Pays de Fouesnant - phpid vp-qj
Toponymie du Pays de Fouesnant -   phpid vp-qjToponymie du Pays de Fouesnant -   phpid vp-qj
Toponymie du Pays de Fouesnant - phpid vp-qj
 
Peuplement automatisé d’ontologies par analyse des programmes scolaires
Peuplement automatisé d’ontologies par analyse des programmes scolaires Peuplement automatisé d’ontologies par analyse des programmes scolaires
Peuplement automatisé d’ontologies par analyse des programmes scolaires
 
La galette des rois
La galette des roisLa galette des rois
La galette des rois
 
Régionales : les résultats par cantons
Régionales : les résultats par cantonsRégionales : les résultats par cantons
Régionales : les résultats par cantons
 
tecnologias del domingo
tecnologias del domingotecnologias del domingo
tecnologias del domingo
 
Laexpresindelconocimientocientfico 090623120646-phpapp01
Laexpresindelconocimientocientfico 090623120646-phpapp01Laexpresindelconocimientocientfico 090623120646-phpapp01
Laexpresindelconocimientocientfico 090623120646-phpapp01
 
Verdaderoa(Musica)
Verdaderoa(Musica)Verdaderoa(Musica)
Verdaderoa(Musica)
 
L A S CÉ L U L A S Y L O S O R G A N I S M O S V I V O S
L A S  CÉ L U L A S  Y  L O S  O R G A N I S M O S  V I V O SL A S  CÉ L U L A S  Y  L O S  O R G A N I S M O S  V I V O S
L A S CÉ L U L A S Y L O S O R G A N I S M O S V I V O S
 
Curiosidades
CuriosidadesCuriosidades
Curiosidades
 
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2
Tutoriel : Rédaction web & Blog Jimdo - Les excursions numériques saison 2
 
Sergio G. Meneses Ponce
Sergio G. Meneses PonceSergio G. Meneses Ponce
Sergio G. Meneses Ponce
 
Le programme des courses du 2 août
Le programme des courses du 2 aoûtLe programme des courses du 2 août
Le programme des courses du 2 août
 

Similar to Messages queues - Socloz@PHPForum 2013

Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormParis_Storm_UG
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
Solutions temps réel sous linux
Solutions temps réel sous linuxSolutions temps réel sous linux
Solutions temps réel sous linuxembedded-linux-bdx
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08Loïc Descotte
 
DevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoDevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoPierre Souchay
 
Présentation CoreOS
Présentation CoreOSPrésentation CoreOS
Présentation CoreOSgcatt
 
Projet IPv6 Matrix / Version française intégrale
Projet IPv6 Matrix / Version française intégraleProjet IPv6 Matrix / Version française intégrale
Projet IPv6 Matrix / Version française intégraleOlivier MJ Crépin-Leblond
 
Php 7 Think php7
Php 7 Think php7Php 7 Think php7
Php 7 Think php7neuros
 
Hadoop Introduction in Paris
Hadoop Introduction in ParisHadoop Introduction in Paris
Hadoop Introduction in ParisTed Drake
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Loic Ortola
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantALTIC Altic
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !Carles Sistare
 

Similar to Messages queues - Socloz@PHPForum 2013 (20)

Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec Storm
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Solutions temps réel sous linux
Solutions temps réel sous linuxSolutions temps réel sous linux
Solutions temps réel sous linux
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08
 
DevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoDevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @Criteo
 
Présentation CoreOS
Présentation CoreOSPrésentation CoreOS
Présentation CoreOS
 
Projet IPv6 Matrix / Version française intégrale
Projet IPv6 Matrix / Version française intégraleProjet IPv6 Matrix / Version française intégrale
Projet IPv6 Matrix / Version française intégrale
 
Php 7 Think php7
Php 7 Think php7Php 7 Think php7
Php 7 Think php7
 
Hadoop Introduction in Paris
Hadoop Introduction in ParisHadoop Introduction in Paris
Hadoop Introduction in Paris
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performant
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
 

Messages queues - Socloz@PHPForum 2013

  • 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. 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
  • 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. 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. 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. PROBLÉMATIQUE #1 Traitement des flux 15/11/13 SoCloz - Tous droits réservés 12
  • 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
  • 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. 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
  • 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. 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. 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. AUTRES OUTILS Voire autres problématiques… 15/11/13 SoCloz - Tous droits réservés 27
  • 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