5. ● Données comportementales de 400
millions de profils uniques (via SDK)
● Des milliers de campagnes
publicitaires internationales
● Publicité ciblée
● Évolution vers le programmatique
PLATEFORME DE DATA MOBILE
C’est quoi ?
7. MAGNITUDE DE L’INFRA
AVANT
MAINTENANT
• 400 Millions Profiles
• 1.5 Milliards Req/Jour
• Temps de réponse <35ms
• Calcul du Targeting: 1.5h
• 700 instances
• 14 noeuds Redshift
• 13 BD Postgres
• IT team > 40 devs
• 50k Profiles
• 200k Req/Jour
• Temps de réponse >300ms
• Calcul du Targeting: 10h
• IT team 2 devs
9. Les inconvénients des API REST/JSON
➔ Le streaming est difficile (presque impossible dans certains langages)
➔ La diffusion bidirectionnelle n'est pas du tout possible
➔ Gourmande (les représentations textuelles ne sont pas optimales pour les réseaux)
➔ Pas de contrat d'API formel (lisible par machine)
◆ Corollaire: la rédaction de libs clients nécessite des humains
◆ Corollaire: les humains sont chers et n'aiment pas écrire des libs clients
11. ➔ SWAGGER:
◆ API REST with JSON format
◆ Génération de code, via des fichiers de conf (mais c’est verbeux)
◆ Génération de la DOC
◆ Beaucoup d’outils open source pour travailler avec Swagger
◆ Ne résout pas le souci de performance, streaming etc...
◆ ....
gRPC: ALTERNATIVES
12. ➔ THRIFT:
◆ Framework RPC
◆ Génération de code
◆ Génération de la DOC
◆ Format d’encodage équivalent à Protobuf avec plus de possibilités
◆ Techno très mature (utilisé par Facebook, Cassandra, ...)
◆ Documentation et Exemples très difficiles à trouver
◆ ....
gRPC: ALTERNATIVES
13. HTTP2: TCP CONNECTIONS
HTTP1
1 TCP conn -> Multiplexed Requests
HTTP2
1 TCP conn per HTTP req (hors Keep-Alive)
HEAD OF LINE BLOCKING
15. HTTP2: HEADERS
HTTP1 HTTP2
Header Text Plain
Header et Data dans le même frame
Chaque Request on renvoie le meme header
Header comprimé codage Huffman
Header et Data frames differents
- On peut les envoyer séparément
Première Request envoie tous les headers
N+1 Request envoie juste la difference
16. PROTOBUF
ProtoBuffer est un protocole de sérialisation et désérialisation via un schéma
créé par Google actuellement en version 3.
Seulement les types, positions et les valeurs transitent sur le réseau. Pas les
noms de des champs.
20. PROTOBUF HEADER
La formule magique
(POSITION << 3) | TYPE
POSITION : 1
TYPE : 0
Header : 0x08
(1 << 3) | 0 = 0000 1000
21. PROTOBUF VARINT 150 : 1001 0110
→ Step 1: Groupe de 7 bits
000 0001 001 0110
→ Step 2: Inverse (Least
significant group first)
001 0110 000 0001
→ Step 3: Add msb
1001 0110 0000 0001
→ Least significant group first.
1 bit msb (most significant bit)
+
7 bits pour le stockage
Quand le MSB = 1 c’est qu’il y a un octet supplémentaire.
DATA : 96 01
24. PROTOBUF STRING 08 96 01 : 150 (vu ensemble)
12 0B 48 65 6c 6c 6f 20 77 6f 72 6c 64
→ Step 1: Header
0x12 : 0001 0010
TYPE : 2 (010)
POSITION : 2 (0010)
→ Step 2: Length
0x0B : 0000 1101
11
→ Step 3: Text
48 65 6c 6c 6f 20 77 6f 72 6c 64
H e l l o w o r l d
08 96 01 12 0B 48 65 6c 6c 6f
20 77 6f 72 6c 64
25. ➔ Gain limité s’il y a beaucoup de chaînes de caractère.
◆ Favoriser les Enums (description erreurs, label, etc... ) car seul
l’id transit sur le réseau.
PROTOBUF
26. ➔ Protocole pour appeler des fonctions qui ne s'exécutent pas forcément dans la même machine
gRPC: REMOTE PROCEDURE CALL
27. ➔ Les développeurs peuvent s’abstraire de toute complexité:
◆ Réseau
◆ Format des données
◆ Sécurité
◆ ....
➔ Pouvoir se concentrer sur le code business
gRPC: REMOTE PROCEDURE CALL
28. ➔ Contraintes:
◆ Toutes les questions de format de données et communication sont à définir à l’avance
◆ Chaque évolution du framework custom RPC peut impacter toute la stack
◆ Moins de flexibilité qu’une API REST
◆ ....
gRPC: REMOTE PROCEDURE CALL
30. gRPC: types de requetes
SIMPLE RPC REQUEST STREAM RESPONSE STREAM FULL DUPLEX
31. gRPC: Implémentation NodeJS
➔ Utilise PROTOBUF.JS:
◆ Il génère dynamiquement les classes lors de l'instanciation du
serveur ou du client
◆ Approche utilisé surtout pour le web: protobuf depuis le browser
32. gRPC: Implémentation JAVA
➔ Classes générées avant la compilation
➔ BUILDER PATTERN:
◆ Pouvoir gérer tous les champs optionnels
◆ Classe standard pour chaque message,
avec plein de constructors c’est pas propre
33. gRPC : SERVEUR JAVA - STACK
➔ Spring Boot Starter Web
➔ Module grpc-spring-boot-starter de LogNet (https://github.com/LogNet/grpc-spring-boot-starter)
34. gRPC : SERVEUR JAVA - GÉNÉRATION DU CODE
Fichier PROTO
Générateur gRPC
35. gRPC : SERVEUR JAVA - GÉNÉRATION DU CODE
https://github.com/grpc/grpc-java
MAVEN LIGNE DE COMMANDE
<PATCH_BIN_PROTOC>/protoc
--java_out=src/main/java/
./exemple.proto
38. gRPC: parlons perf
HTTP HTTP Keep-Alive GRPC Simple GRPC Full Duplex
Messages/Sec 366 655 1040 1448
Bande Passante I/O Input: 5,6 Mo
Output: 5,33 Mo
Input: 2,79 Mo
Output: 2,46 Mo
Input: 1,61 Mo
Output: 1,26 Mo
Input: 1 Mo
Output: 933 Ko
Temps Réponse p95 4 ms 2 ms 1 ms 1 ms
Temps Réponse p99 9,4 ms 8 ms 4 ms 2 ms
➔ Séries de 10000 requetes
➔ 2 * t2.micro (1 Core / 1 Go RAM) pour le client et le serveur
39. gRPC: Inconvénients
➔ Load Balancing
➔ Déboguer des erreurs c’est difficile
➔ Pas encore des libs pour supporter gRPC depuis un browser
➔ Documentation pauvre pour certains langages
➔ Pas de standard d'implémentation entre langages
40. NOTRE RETOUR D’EXPERIENCE
- Si votre API est simple, sans beaucoup de charge ou accessible par des clients externes => REST
- Si votre priorité c’est la perf, le QUICK WIN c’est gRPC
- Si le nombre de connections par client n’est pas très élevé => REST
MIGRER SUR gRPC?
TIPS INTEGRATION
- Double Entrypoint REST/gRPC pratique pour déboguer
- Load Balancing via TCP
41. PROCHAIN RENDEZ-VOUS
REDSHIFT
• Introduction REDSHIFT
• Dig-in fonctionnement interne
• Retour d’expérience sur la mise en place de Data-WareHouse
(pêle-mêle):
○ Bien identifier son besoin pour bien choisir sa techno
○ Designer son schema DB en accord avec Redshift
○ Les ETL à haut volume et leurs problématiques
○ Gérer les limites de Redshift et les évolutions de son
usage
pierre-marie@ogury.co