SlideShare une entreprise Scribd logo
Kill the bottleneck
Servir des maps à haute performance
by Loïc Ortola, CTO
jawgmaps
Les incontournables
1.  C’est quoi une carte?
2.  Nos choix TKs
3.  Rétrospective Load-testing
4.  è Continuous improvement
1. Qu’entend-on par Carte?
4 métiers principaux dans les maps digitales
Geocoding
Routing (Itinéraire)
Cartes (Fonds de carte) ex : WMTS, WMS, Slippy Map Tiles
Données supplémentaires (Vos POIs) ex : WFS
1. Qu’entend-on par Carte?
Carte de Paris à l’échelle 1:15 000 (zoom 15)
Monde entier: 70 trillion pixels
1. Qu’entend-on par Carte?
Carte de Paris à l’échelle 1:15 000 (zoom 15)
Monde entier: 1 billion tiles 256x256 pixels
1. Qu’entend-on par Carte?
Zoom 0
Scale 1:500 Million
Zoom 1
Scale 1:250 Million
1. Qu’entend-on par Carte?
Rendu jusqu’au Zoom 19:
Somme des tuiles des zooms 0 à 19:
S = ~= 366 billion tiles
1. Qu’entend-on par Carte?
Ca sert à quoi un map-server?
A dessiner des données sur des cartes (routes etc…)
A faciliter le stockage / le cache / les flux de données
A gérer la stratégie d’import / réimport
Dessine moi une carte
Entrée: Règles de “dessin”
Sortie: Moteur de rendu
Lecture en DB
Clipping / drawing
Prend du temps et des ressources
quelques ms à plusieurs minutes de rendu
utilise le CPU, la mémoire & le disque
Dessine moi une carte
Besoin d’optimisations
… sur la DB
… sur le style
… sur les requêtes
Optimiser le rendu des tuiles
Concept : La Meta-tile
Rendre plusieurs tuiles côte à côte, et les découper ensuite
Avantages
Empêche de saturer les I/O
Diminue grandement les connections actives BDD
Inconvénients
Génère des tuiles inutiles è plus long
Optimiser le rendu des tuiles
Rendement
28/64 = 43%
Ex: Meta8
Rendement
28/256 = 11%
Donc…
Impossible de pré-calculer toutes les tuiles du monde à tous les niveaux de zoom.
c’est (infiniment) long
ça prend trop de place, c’est éphémère
Besoin de logiques de “cache” et de “pré-rendu”
Système hautement contraint
Stockage des tuiles et cache
Une “map” ó entre 12 et 48 tuiles
è Comment diminuer mes I/O quand je vais chercher des données?
Stockage des tuiles et cache
Stocker les tuiles contigues ensemble (Meta-Tile)
Concentrer les requêtes demandant la même information
Garder un cache mémoire (LRU)
(Ré-)importer des données
Une archive à importer dans une base
Des traitements sur la donnée pour le rendu
Peut prendre plusieurs heures à quelques jours
(Ré-)importer des données
Attention à la stratégie de mise à jour (fréquence, diff)
Besoin d’une stratégie d’invalidation des caches
A dimensionner de façon intelligente
Nos choix TKs
Comment bâtir nos services
Robustes, scalables et performants
Hosting strategy
Hosting Strategy
+ : Ressources dédiées
- : Scalabilité, prix,
defaillance HW
+ : TTM réduit
- : Latence, vendor-lock, $
Serveurs Dédiés Cloud + EBS +
CDN + ALB + ASG
+ : Faible Latence, full-control
- : Long à dev, risque de failure
Cloud + Manuel
- : ressource mutualisée
Monolith vs Micro-Service
Micro-Service approach
Pros:
•  Maintenabilité
•  Micro-Scaling
•  Technology-independent
Cons:
•  + de chaos, + de failles
•  Nécessite une infra bien pensée
•  Coute (en général) plus cher
Orchestrator/Scheduler
vs
Homemade
Homemade
Paradigmes:
è Detect-fast, Fail-fast, recover-fast
è No recovery automation
Service-discovery / DNS: Consul
Outils monitoring: Telegraf, Kapacitor
Time series DB: InfluxDB
Reactive programming
Reactive
Modèle classique:
1 requête = 1 thread
10 requêtes = 10 threads
100 requêtes = 100 threads
… Mais combien d’opérations peuvent réellement être
exécutées en même temps?
Modèle réactif:
Des requêtes, des “workers”
Optimiser l’activité du thread plutôt que le nombre de threads
27
Architecture
24 prod servers
6 websites
Lab – Manager – Style –
Demo – WWW – Swagger
9 public APIs
Account – Storage - Static maps – Tile-edge –
Auth – Stats – Style Registry – Geocoding – Routing
11 backend services
Cassandra – InfluxDB – Telegraf – Grafana – Kapacitor –
Consul – Registry – Gitlab – PFSense – YouTrack – PostGreSQL
4 private APIs
Keystore – Tile-edge-diff –
Tile-edge-renderer –Stats – Tile-edge-worker
2 SDKs
Android, iOS
Load Testing
Les conditions aux limites
Objectifs
•  Admettre le plus de trafic possible sur chaque machine
•  Avoir un temps de réponse le plus bas possible
KPIs
•  Performance =
Maximiser le nombre de requêtes par seconde
+
99th percentile <= 800ms
99.9th percentile <= 1200 ms
0 timeout ou requête non satisfaite
Test de performance
•  Mode Cluster
•  Métriques ultra-détaillées
•  Live reporting
Architecture dans la Réalité
PRISE EN MAIN
RAPIDITE
EXACTITUDE
BANDE PASSANTE
CPU
MEMOIRE
CPU
CPU
MEMOIRE
I/O
UTILISATEURS
APP CACHES
RENDERS
APP LB
APP LB
BANDE PASSANTE
CPU
Architecture Test de Charge
EG-30
HG-30
EG-15
HG-120
INJECTEURS
APP CACHES
RENDERS
APP LB
APP LB EG-7
•  8 vCores 2,3Ghz
•  30 Go RAM
•  2 Gbps BP
•  2 vCores 2,3Ghz
•  7 Go RAM
•  300 Mbps BP
•  8 vCores 3,1Ghz
•  30 Go RAM
•  2 Gbps BP
•  4 vCores 2,3Ghz
•  15 Go RAM
•  1 Gbps BP
•  32 vCores 3,1Ghz
•  120 Go RAM
•  4 Gbps BP
Rétrospective : les embûches
Setup
Spawn time
OVH Manager vs Horizon + Nova + Neutron
Déploiement
SSHJ + OpenStack
Run
nf_conntrack_max
steal-cpu et network softirq
Bande passante
Rétrospective : avec 4 caches
850 000 utilisateurs en 30 min
Entre 1 et 15 map views / user(ó entre 28 et 420 tuiles / user)
Sur les 12 zones les plus peuplées du monde entier
Rétrospective : avec 4 caches
108 k req/s en pointe ó ~25k req/s/cache
Moyenne des temps de réponse = 65 ms
99.9th percentile de temps de réponse < 600ms
Rétrospective : avec 4 caches
2 Gbps atteints sur EG-30
~10k utilisateurs concurrents
Rétrospective : avec 4 caches
90% CPU utilisé
5% IOWait
Steal & softirq négligeables
Rétrospective : recommandations
Optimiser la bande passante
Choisir les bonnes instances (Cloud ou Dédié)?
Compression g-zip (tile-edge-cache)?
Affiner le tuning kernel / DB / Runtime / Conf
file descriptors, ulimit, conntrack
PostGIS / profil d’import
Optimiser l’architecture
Cache de niveau 2 – Object Storage
Séparation DB / Render
300+ Références
42
300+ Références
43
Pourquoi n’es-tu pas sur cette liste?
Jawg Lab
Viens, on est bien!
White Papers
1.  Map services: from theory to implementation
Disponible maintenant @ http://jawg.io
2.  Map services: Benchmarks & high-scale profiles
Disponibles sur demande
Loïc Ortola
CEO @ jawg
Loïc Ortola @LoicOrtola
loic@jawg.io
jawgmaps Merci
?

Contenu connexe

Tendances

Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
Paris_Storm_UG
 
Scalabilité de MongoDB
Scalabilité de MongoDBScalabilité de MongoDB
Scalabilité de MongoDB
MongoDB
 

Tendances (19)

Logs serveurs : du terme barbare à la simplicité de la réalité
Logs serveurs :  du terme barbare à la simplicité de la réalitéLogs serveurs :  du terme barbare à la simplicité de la réalité
Logs serveurs : du terme barbare à la simplicité de la réalité
 
05 2014-varnish
05 2014-varnish05 2014-varnish
05 2014-varnish
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyriba
 
[Breizhcamp 2015] Refactoring avec 1,22% de code couvert par les tests ... Go...
[Breizhcamp 2015] Refactoring avec 1,22% de code couvert par les tests ... Go...[Breizhcamp 2015] Refactoring avec 1,22% de code couvert par les tests ... Go...
[Breizhcamp 2015] Refactoring avec 1,22% de code couvert par les tests ... Go...
 
Journée DevOps : Tests de performance en continu
Journée DevOps : Tests de performance en continuJournée DevOps : Tests de performance en continu
Journée DevOps : Tests de performance en continu
 
Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Hadoop et son écosystème - v2
Hadoop et son écosystème - v2
 
04 big data fournisseurs
04 big data fournisseurs04 big data fournisseurs
04 big data fournisseurs
 
REX Storm Redis
REX Storm RedisREX Storm Redis
REX Storm Redis
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
 
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
 
Scalabilité de MongoDB
Scalabilité de MongoDBScalabilité de MongoDB
Scalabilité de MongoDB
 
Pachyderm big data de l'ère docker
Pachyderm big data de l'ère dockerPachyderm big data de l'ère docker
Pachyderm big data de l'ère docker
 
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...
 
Réduire la taille de son apk
Réduire la taille de son apkRéduire la taille de son apk
Réduire la taille de son apk
 
Presentation Ceph
Presentation CephPresentation Ceph
Presentation Ceph
 
Comment gérer des applications nécessitant la persistance des données avec Ku...
Comment gérer des applications nécessitant la persistance des données avec Ku...Comment gérer des applications nécessitant la persistance des données avec Ku...
Comment gérer des applications nécessitant la persistance des données avec Ku...
 
Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...
Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...
Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...
 
Hadoop unit
Hadoop unitHadoop unit
Hadoop unit
 

Similaire à Modern DevOps - kill the bottleneck (part 2/2)

Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
Amazon Web Services
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08
Loïc Descotte
 

Similaire à Modern DevOps - kill the bottleneck (part 2/2) (20)

OVH Summit 2016 - Map as a Service by Löic Ortola
OVH Summit 2016 - Map as a Service by Löic OrtolaOVH Summit 2016 - Map as a Service by Löic Ortola
OVH Summit 2016 - Map as a Service by Löic Ortola
 
DevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoDevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @Criteo
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échelle
 
03 big data échelle
03 big data échelle03 big data échelle
03 big data échelle
 
Tech day hadoop, Spark
Tech day hadoop, SparkTech day hadoop, Spark
Tech day hadoop, Spark
 
Techday Arrow Group: Hadoop & le Big Data
Techday Arrow Group: Hadoop & le Big DataTechday Arrow Group: Hadoop & le Big Data
Techday Arrow Group: Hadoop & le Big Data
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 
Afterwork hadoop
Afterwork hadoopAfterwork hadoop
Afterwork hadoop
 
Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
Track 2 - Atelier 3 - Comment Ysance met le cloud au service du digital avec ...
 
Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques
 
Base de données
Base de donnéesBase de données
Base de données
 
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de Cassandre
 
Big Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foinBig Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foin
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
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
 
BigData_Technologies_PL.pdf
BigData_Technologies_PL.pdfBigData_Technologies_PL.pdf
BigData_Technologies_PL.pdf
 
Présentation Big Data et REX Hadoop
Présentation Big Data et REX HadoopPrésentation Big Data et REX Hadoop
Présentation Big Data et REX Hadoop
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08
 

Plus de Loic Ortola

Plus de Loic Ortola (6)

The rise of JS
The rise of JSThe rise of JS
The rise of JS
 
Map as a Service OVH Summit 2016
Map as a Service OVH Summit 2016Map as a Service OVH Summit 2016
Map as a Service OVH Summit 2016
 
Jawg maurice vs google maps
Jawg   maurice vs google mapsJawg   maurice vs google maps
Jawg maurice vs google maps
 
Native vs Hybrid - Options to develop your mobile application
Native vs Hybrid - Options to develop your mobile applicationNative vs Hybrid - Options to develop your mobile application
Native vs Hybrid - Options to develop your mobile application
 
Bringing Openstreetmap Mobile edition to the next level
Bringing Openstreetmap Mobile edition to the next levelBringing Openstreetmap Mobile edition to the next level
Bringing Openstreetmap Mobile edition to the next level
 
CatDroid talk: thinking different, sharing ideas
CatDroid talk: thinking different, sharing ideasCatDroid talk: thinking different, sharing ideas
CatDroid talk: thinking different, sharing ideas
 

Modern DevOps - kill the bottleneck (part 2/2)

  • 1. Kill the bottleneck Servir des maps à haute performance by Loïc Ortola, CTO jawgmaps
  • 2. Les incontournables 1.  C’est quoi une carte? 2.  Nos choix TKs 3.  Rétrospective Load-testing 4.  è Continuous improvement
  • 3. 1. Qu’entend-on par Carte? 4 métiers principaux dans les maps digitales Geocoding Routing (Itinéraire) Cartes (Fonds de carte) ex : WMTS, WMS, Slippy Map Tiles Données supplémentaires (Vos POIs) ex : WFS
  • 4. 1. Qu’entend-on par Carte? Carte de Paris à l’échelle 1:15 000 (zoom 15) Monde entier: 70 trillion pixels
  • 5. 1. Qu’entend-on par Carte? Carte de Paris à l’échelle 1:15 000 (zoom 15) Monde entier: 1 billion tiles 256x256 pixels
  • 6. 1. Qu’entend-on par Carte? Zoom 0 Scale 1:500 Million Zoom 1 Scale 1:250 Million
  • 7. 1. Qu’entend-on par Carte? Rendu jusqu’au Zoom 19: Somme des tuiles des zooms 0 à 19: S = ~= 366 billion tiles
  • 9. Ca sert à quoi un map-server? A dessiner des données sur des cartes (routes etc…) A faciliter le stockage / le cache / les flux de données A gérer la stratégie d’import / réimport
  • 10. Dessine moi une carte Entrée: Règles de “dessin” Sortie: Moteur de rendu Lecture en DB Clipping / drawing Prend du temps et des ressources quelques ms à plusieurs minutes de rendu utilise le CPU, la mémoire & le disque
  • 11. Dessine moi une carte Besoin d’optimisations … sur la DB … sur le style … sur les requêtes
  • 12. Optimiser le rendu des tuiles Concept : La Meta-tile Rendre plusieurs tuiles côte à côte, et les découper ensuite Avantages Empêche de saturer les I/O Diminue grandement les connections actives BDD Inconvénients Génère des tuiles inutiles è plus long
  • 13. Optimiser le rendu des tuiles Rendement 28/64 = 43% Ex: Meta8 Rendement 28/256 = 11%
  • 14. Donc… Impossible de pré-calculer toutes les tuiles du monde à tous les niveaux de zoom. c’est (infiniment) long ça prend trop de place, c’est éphémère Besoin de logiques de “cache” et de “pré-rendu” Système hautement contraint
  • 15. Stockage des tuiles et cache Une “map” ó entre 12 et 48 tuiles è Comment diminuer mes I/O quand je vais chercher des données?
  • 16. Stockage des tuiles et cache Stocker les tuiles contigues ensemble (Meta-Tile) Concentrer les requêtes demandant la même information Garder un cache mémoire (LRU)
  • 17. (Ré-)importer des données Une archive à importer dans une base Des traitements sur la donnée pour le rendu Peut prendre plusieurs heures à quelques jours
  • 18. (Ré-)importer des données Attention à la stratégie de mise à jour (fréquence, diff) Besoin d’une stratégie d’invalidation des caches A dimensionner de façon intelligente
  • 19. Nos choix TKs Comment bâtir nos services Robustes, scalables et performants
  • 21. Hosting Strategy + : Ressources dédiées - : Scalabilité, prix, defaillance HW + : TTM réduit - : Latence, vendor-lock, $ Serveurs Dédiés Cloud + EBS + CDN + ALB + ASG + : Faible Latence, full-control - : Long à dev, risque de failure Cloud + Manuel - : ressource mutualisée
  • 23. Micro-Service approach Pros: •  Maintenabilité •  Micro-Scaling •  Technology-independent Cons: •  + de chaos, + de failles •  Nécessite une infra bien pensée •  Coute (en général) plus cher
  • 25. Homemade Paradigmes: è Detect-fast, Fail-fast, recover-fast è No recovery automation Service-discovery / DNS: Consul Outils monitoring: Telegraf, Kapacitor Time series DB: InfluxDB
  • 27. Reactive Modèle classique: 1 requête = 1 thread 10 requêtes = 10 threads 100 requêtes = 100 threads … Mais combien d’opérations peuvent réellement être exécutées en même temps? Modèle réactif: Des requêtes, des “workers” Optimiser l’activité du thread plutôt que le nombre de threads 27
  • 28. Architecture 24 prod servers 6 websites Lab – Manager – Style – Demo – WWW – Swagger 9 public APIs Account – Storage - Static maps – Tile-edge – Auth – Stats – Style Registry – Geocoding – Routing 11 backend services Cassandra – InfluxDB – Telegraf – Grafana – Kapacitor – Consul – Registry – Gitlab – PFSense – YouTrack – PostGreSQL 4 private APIs Keystore – Tile-edge-diff – Tile-edge-renderer –Stats – Tile-edge-worker 2 SDKs Android, iOS
  • 30. Objectifs •  Admettre le plus de trafic possible sur chaque machine •  Avoir un temps de réponse le plus bas possible
  • 31. KPIs •  Performance = Maximiser le nombre de requêtes par seconde + 99th percentile <= 800ms 99.9th percentile <= 1200 ms 0 timeout ou requête non satisfaite
  • 32.
  • 33. Test de performance •  Mode Cluster •  Métriques ultra-détaillées •  Live reporting
  • 34. Architecture dans la Réalité PRISE EN MAIN RAPIDITE EXACTITUDE BANDE PASSANTE CPU MEMOIRE CPU CPU MEMOIRE I/O UTILISATEURS APP CACHES RENDERS APP LB APP LB BANDE PASSANTE CPU
  • 35. Architecture Test de Charge EG-30 HG-30 EG-15 HG-120 INJECTEURS APP CACHES RENDERS APP LB APP LB EG-7 •  8 vCores 2,3Ghz •  30 Go RAM •  2 Gbps BP •  2 vCores 2,3Ghz •  7 Go RAM •  300 Mbps BP •  8 vCores 3,1Ghz •  30 Go RAM •  2 Gbps BP •  4 vCores 2,3Ghz •  15 Go RAM •  1 Gbps BP •  32 vCores 3,1Ghz •  120 Go RAM •  4 Gbps BP
  • 36. Rétrospective : les embûches Setup Spawn time OVH Manager vs Horizon + Nova + Neutron Déploiement SSHJ + OpenStack Run nf_conntrack_max steal-cpu et network softirq Bande passante
  • 37. Rétrospective : avec 4 caches 850 000 utilisateurs en 30 min Entre 1 et 15 map views / user(ó entre 28 et 420 tuiles / user) Sur les 12 zones les plus peuplées du monde entier
  • 38. Rétrospective : avec 4 caches 108 k req/s en pointe ó ~25k req/s/cache Moyenne des temps de réponse = 65 ms 99.9th percentile de temps de réponse < 600ms
  • 39. Rétrospective : avec 4 caches 2 Gbps atteints sur EG-30 ~10k utilisateurs concurrents
  • 40. Rétrospective : avec 4 caches 90% CPU utilisé 5% IOWait Steal & softirq négligeables
  • 41. Rétrospective : recommandations Optimiser la bande passante Choisir les bonnes instances (Cloud ou Dédié)? Compression g-zip (tile-edge-cache)? Affiner le tuning kernel / DB / Runtime / Conf file descriptors, ulimit, conntrack PostGIS / profil d’import Optimiser l’architecture Cache de niveau 2 – Object Storage Séparation DB / Render
  • 44. Jawg Lab Viens, on est bien!
  • 45. White Papers 1.  Map services: from theory to implementation Disponible maintenant @ http://jawg.io 2.  Map services: Benchmarks & high-scale profiles Disponibles sur demande
  • 46. Loïc Ortola CEO @ jawg Loïc Ortola @LoicOrtola loic@jawg.io jawgmaps Merci ?