hi-media couchbase meetup paris nb #1
DESCRIPTION
How Hi-Media is using Couchbase for retargeting advertising. Cédric Pessan and Mickaël Le Baillif demonstrate how Hi-Media is using Couchbase to deliver low-latency, highly-available retargeted advertisements.TRANSCRIPT
Couchbase Meetup {"Number" :1}21 novembre 2013
Utilisation de CouchbaseUtilisation de Couchbasepour le ciblage publicitairepour le ciblage publicitaire
Cédric PessanMickaël Le Baillif
Couchbase Meetup {"Number" :1}21 novembre 2013
Ce que nous allons voir ensemble...
● Hi-Media : aperçu de la société et de ses activités
● Ciblage publicitaire : à quoi ça sert, comment ça marche ?
● Notre utilisation de Couchbase– Place au sein de notre architecture– Connexions avec nos modules métiers– Interaction avec PostgreSQL
Couchbase Meetup {"Number" :1}21 novembre 2013
Présentation Présentation institutionnelle d'Hi-Mediainstitutionnelle d'Hi-Media
Couchbase Meetup {"Number" :1}21 novembre 2013
Hi-Media en chiffres● 500 personnes dont 100 ingénieurs IT● Bureaux IT à Paris et à Nantes
Couchbase Meetup {"Number" :1}21 novembre 2013
Les métiers d'Hi-Media
Publicité Paiement et micro-paiement
Création et hébergement de
sites
Couchbase Meetup {"Number" :1}21 novembre 2013
Le retargeting produitLe retargeting produit
Couchbase Meetup {"Number" :1}21 novembre 2013
Objectif du retargeting produit
● Visite d'un site marchand : « tracking » de l'activité d'un internaute
● Visite d'un site tiers : mise en valeur des articles recherchés et recommandés dans des bannières publicitaires
Couchbase Meetup {"Number" :1}21 novembre 2013
Phase de tracking 1/2
http://himedia/trackingAnnonceur : nnSite : mmAction : fiche produitRef produit : rr-vv-pp
Cookie : uid=AE23DF34
Couchbase Meetup {"Number" :1}21 novembre 2013
NginX
Phase de tracking 2/2Serveur web
http://himedia/trackingAnnonceur : nnSite : mmAction : fiche produitRef produit : rr-vv-pp
Cookie : uid=AE23DF34
HTTP 200 OKMoteur de
recommandation NginX
Module métier
« tracking »
Validation format URL
+Envoi msg
queue
Couchbase Meetup {"Number" :1}21 novembre 2013
Asynchrone : stockage du tracking
uid=AE23DF34Annonceur : nnSite : mmAction : fiche produitRef produit : rr-vv-pp
Msg queue
uid=AE23DF34 Action 1 Action 2
uid=AE23DF34 Action 1 Action 2 Action 3
Moteur de recommandation
Mise à jour de l'historique+
Invalidation cache
Couchbase Meetup {"Number" :1}21 novembre 2013
uid=AE23DF34
HTTP 200 OKenvoi bannière pub
Cache ?
Calcul liveMise en
cache
Phase d'affichage de publicité
Couchbase
NginX
Serveur web
Module métier
« display »
NginXMoteur de
recommandation
Couchbase Meetup {"Number" :1}21 novembre 2013
Notre utilisation de Notre utilisation de CouchbaseCouchbase
Couchbase Meetup {"Number" :1}21 novembre 2013
Quelques chiffres
● 7 buckets, pour séparation logique des données et besoins distincts de réplication
● 80 Go de données en RAM sans les réplicas● 100 millions de clés● Réplication XDCR unidirectionnelle vers
cluster en hot standby
Couchbase Meetup {"Number" :1}21 novembre 2013
NoSQL : pourquoi Couchbase ?
● Redimensionnement horizontal très aisé, idéal pour suivre l'évolution de nos volumétries
● Expériences précédentes avec memcached● On a débuté avec membase, pas besoin de NoSQL
orientés documents● Besoin de temps de réponse très courts pour des
données précalculées ou mises en cache● Sécurisation des données par réplication● Tolérance aux pannes pour haute disponibilité
Couchbase Meetup {"Number" :1}21 novembre 2013
Protocole
● Besoin d'un protocole adapté à notre boucle événementielle C++ boost::asio
● Utilisation du protocole ASCII de memcached– get, gets, set, cas, incr, decr
– Formattage des messages et parsing des réponses très simple à implémenter
– Envoi/réception des messages sans passer par une bibliothèque externe, utilise directement boost::asio
Couchbase Meetup {"Number" :1}21 novembre 2013
Protocole
● En python, également protocole ASCII couplé à eventlet pour l'événementiel– À essayer : version 1.1.0 de la lib couchbase-python-client qui expérimente la délégation des I/O de libcouchbase (en C) par Python/gevent ou Python/Twisted
– Overhead pour établir une connexion REST (management channel) + 100 connexions data sur des sessions de courtes durées (<10s) vs 100 connexions TCP sans contexte d'init à parser
Couchbase Meetup {"Number" :1}21 novembre 2013
Gestion des connexions
● Modèle événementiel : nombreuses requêtes métiers traitées simultanément– Plusieurs requêtes couchbase simultanées
● Une requête couchbase = une connexion TCP● Utilisation d'un pool de connexion vers chaque
bucket : environ 100 connexions par processus
Couchbase Meetup {"Number" :1}21 novembre 2013
Gestion des connexions
● Protocole ASCII simple : aucune notion de nœuds, typologie, vbucket, etc.
● Connexion des modules métiers vers des moxis● Un bucket = un moxi● Chaque machine a ses moxis en local, centaines de
connexions entrantes (upstream)● Moxi établit les connexions vers les nœuds Couchbase
(downstream) en s'adaptant à la typologie, dispatche les requêtes vers les nœuds responsables des données
Couchbase Meetup {"Number" :1}21 novembre 2013
Gestion des connexions
● Utilisation du gold-standard recommandé par Couchbase(1) :– Chaque moxi se connecte vers un haproxy local– Conf haproxy liste tous les nœuds :
● cluster couchbase principal● cluster couchbase de backup si aucun nœud du cluster
principal n'est joignable
– Les connexions des moxis sont réparties équitablement vers l'ensemble des nœuds opérationnels
(1) http://docs.couchbase.com/moxi-manual-1.8/#moxi-standalone
Couchbase Meetup {"Number" :1}21 novembre 2013
Gestion des connexionsServeur A
Cluster Couchbase2 nœuds
3 buckets
haproxy
upstream downstream
moxisbucket Abucket Bbucket C
x100
x100
x100
RE
ST
Module métier
Couchbase Meetup {"Number" :1}21 novembre 2013
Interactions entre modules
Module métier C++
Module métier C++
Module métier C++
PZQ (1) / 0M
Q (2)
Modules métier Python
libmemcacheasio (3) + boost::asio
HTTP
memcache_client(4) + eventlet
(1) https://github.com/mkoppanen/pzq(2) http://www.zeromq.org(3) https://code.google.com/p/memcacheasio/(4) https://github.com/mixpanel/memcache_client
CSV/XML
Catalogues annonceur
NginX
Couchbase Meetup {"Number" :1}21 novembre 2013
Interactions entre modules
Module métier C++
Module métier C++
Module métier C++
PZQ / 0M
Q
Modules métier Python
HTTP
CSV/XML
Catalogues annonceur
moxi
moxi
haproxy
haproxy
NginX
Couchbase Meetup {"Number" :1}21 novembre 2013
Interactions entre modules
Module métier C++
Module métier C++
Module métier C++
Modules métier Python
HTTP
CSV/XML
Catalogues annonceur
NginX
PZQ / 0M
Q
Interface IHM PHP
Ligne de commande
Couchbase Meetup {"Number" :1}21 novembre 2013
PostgreSQL vs Couchbase
● Requêtes PG pour calcul des liens entre produits d'un catalogue– Catégories, prix, etc.
● Requêtes trop lentes pour être utilisées « en live » lors d'un affichage de publicité
● Pré-calcul des données et stockage dans Couchbase
● Mis à jour lors d'un import de catalogue
Couchbase Meetup {"Number" :1}21 novembre 2013
Remplissage de Couchbase
● Dépend des buckets● Historique internautes : par consommation sur queue de
messages● Statistiques : incréments lors du traitement des requêtes
HTTP● Cache d'affichage : à la volée lors du traitement d'une
requête HTTP– RAZ par TTL– RAZ si historique change ou catalogue mis à jour
● Catalogues : chaînes d'import
Couchbase Meetup {"Number" :1}21 novembre 2013
Exemple : PostgreSQL vers Couchbase
Cluster Couchbase
PostgreSQL
Script Python
Worker CB
Worker CB
Worker CB
Distribution sur queue
Couchbase Meetup {"Number" :1}21 novembre 2013
Exemple : PostgreSQL vers Couchbase
Retrouvez ce code source commenté sur :https://gist.github.com/demikl/7559175
Couchbase Meetup {"Number" :1}21 novembre 2013
Questions à creuser...● Crash des moxis observé sous forte charge
(20.000 set/s) si on augmente le nombre de downstreams (16 par nœud et par thread vs. 4 par défaut)
● Vues couchbase :
– délai de mise à jour des index– Flag disponible pour savoir si l'index est à jour ?
● Répli XDCR bidirectionnelle :– mutations en boucle : MAJ clé sur cluster A, répliqué
sur cluster B, répliqué sur cluster A, ...
– Certaines clés/valeurs sont refusées :« invalid_json, […] lexical error: invalid bytes in UTF8 string »
Couchbase Meetup {"Number" :1}21 novembre 2013
Contacts
Cédric Pessan
Mickaël Le Baillif@demikl
Retrouvez cette présentation sur :http://bit.ly/1awgBBk