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.
Le cloud-in-a-box avec Cloud Platform System (CPS) et Windows Azure Pack
Hi-Media Couchbase meetup Paris Nb #1
1. Utilisation de Couchbase
pour le ciblage publicitaire
Cédric Pessan
Mickaël Le Baillif
Couchbase Meetup {"Number" :1}
21 novembre 2013
2. 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
7. 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
8. Phase de tracking 1/2
http://himedia/tracking
Annonceur : nn
Site : mm
Action : fiche produit
Ref produit : rr-vv-pp
Cookie : uid=AE23DF34
Couchbase Meetup {"Number" :1}
21 novembre 2013
9. Phase de tracking 2/2
Serveur web
http://himedia/tracking
NginX
Module
métier
« tracking »
Moteur de
recommandation
Validation
format URL
+
Envoi msg
queue
Couchbase Meetup {"Number" :1}
21 novembre 2013
Annonceur : nn
Site : mm
Action : fiche produit
Ref produit : rr-vv-pp
Cookie : uid=AE23DF34
NginX
HTTP 200 OK
10. Asynchrone : stockage du tracking
uid=AE23DF34
Action 1
Action 2
uid=AE23DF34
Annonceur : nn
Site : mm
Action : fiche produit
Ref produit : rr-vv-pp
Msg queue
Moteur de
recommandation
Mise à jour de l'historique
+
Invalidation cache
uid=AE23DF34
Action 1
Action 2
Action 3
Couchbase Meetup {"Number" :1}
21 novembre 2013
11. Phase d'affichage de publicité
Serveur web
Cache ?
Module
métier
« display »
Couchbase
Mise en
cache
e
l liv
cu
Cal
Moteur de
recommandation
Couchbase Meetup {"Number" :1}
21 novembre 2013
NginX
NginX
uid=AE23DF34
HTTP 200 OK
envoi bannière pub
13. 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
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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
20. Gestion des connexions
Serveur A
moxis
upstream
bucket A
bucket B
bucket C
downstream
x100
Module
métier
x100
x100
REST
haproxy
Couchbase Meetup {"Number" :1}
21 novembre 2013
Cluster Couchbase
2 nœuds
3 buckets
21. Interactions entre modules
HTTP
NginX
Module
métier C++
libmemcacheasio (3) + boost::asio
)
(1
Q
PZ
Module
métier C++
M
/0
)
(2
Q
Module
métier C++
CSV/XML
Catalogues
annonceur
memcache_client(4) + eventlet
Modules métier
Python
(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
Couchbase Meetup {"Number" :1}
21 novembre 2013
22. Interactions entre modules
HTTP
NginX
Module
métier C++
Q
PZ
Module
métier C++
moxi
haproxy
M
/0
Q
Module
métier C++
CSV/XML
Catalogues
annonceur
Modules métier
Python
Couchbase Meetup {"Number" :1}
21 novembre 2013
moxi
haproxy
23. Interactions entre modules
HTTP
NginX
Module
métier C++
Q
PZ
Module
métier C++
M
/0
Q
Module
métier C++
Ligne de commande
CSV/XML
Catalogues
annonceur
Modules métier
Python
Interface IHM
PHP
Couchbase Meetup {"Number" :1}
21 novembre 2013
24. 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
25. 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
26. Exemple : PostgreSQL vers Couchbase
Script Python
Worker
CB
Distribution
sur queue
PostgreSQL
Worker
CB
Worker
CB
Cluster
Couchbase
Couchbase Meetup {"Number" :1}
21 novembre 2013
27. Exemple : PostgreSQL vers Couchbase
Retrouvez ce code source commenté sur :
https://gist.github.com/demikl/7559175
Couchbase Meetup {"Number" :1}
21 novembre 2013
28. 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