Escalando hasta las 10.000 peticiones por segundo

52
Escalando hasta las 10.000 pe1ciones por segundo Sergio Arroyo Cuevas [email protected] @delr3ves

Transcript of Escalando hasta las 10.000 peticiones por segundo

Page 1: Escalando hasta las 10.000 peticiones por segundo

Escalando  hasta  las  10.000  pe1ciones  por  segundo  

Sergio  Arroyo  Cuevas  [email protected]  

@delr3ves  

Page 2: Escalando hasta las 10.000 peticiones por segundo
Page 3: Escalando hasta las 10.000 peticiones por segundo

@TAPTAP_Networks  

Page 4: Escalando hasta las 10.000 peticiones por segundo
Page 5: Escalando hasta las 10.000 peticiones por segundo
Page 6: Escalando hasta las 10.000 peticiones por segundo

Proveedor  de  campañas  

Proveedor  de  “escaparates”  inventario  

AdServer  

Forecas1ng  

Page 7: Escalando hasta las 10.000 peticiones por segundo
Page 8: Escalando hasta las 10.000 peticiones por segundo

SSP  AdExchange  

Subasta  

DSP  Bidder  

SDK  

1.  Dame  anuncios  

2.  Hay  un  escaparate    disponible,    ¿cuánto  me  dais?  

Page 9: Escalando hasta las 10.000 peticiones por segundo

•  ¿Qué  campaña  ponemos?  •  ¿Cuánto  pagamos  por  ella?  •  Necesitamos  muchísimas  pe1ciones    

Problemas  

•  Tiempo  de  respuesta  <  100ms  •  Siempre  hay  que  dar  una  respuesta  válida  •  Almacenamos  todas  las  pe1ciones  •  No  podemos  precalcular  el  resultado  

Restricciones  

Page 10: Escalando hasta las 10.000 peticiones por segundo

¿CÓMO  AFRONTAMOS  EL  RETO?  

Page 11: Escalando hasta las 10.000 peticiones por segundo
Page 12: Escalando hasta las 10.000 peticiones por segundo
Page 13: Escalando hasta las 10.000 peticiones por segundo

Redis  Storm  

Hadoop  MongoDB  

Amazon  S3  

Page 14: Escalando hasta las 10.000 peticiones por segundo

Dev Team Bidder

Page 15: Escalando hasta las 10.000 peticiones por segundo

Dev Team Bidder

Page 16: Escalando hasta las 10.000 peticiones por segundo

Round  0  DRPCSpout  

BidRequest  

Crea1vi1es   RequestLog  

RetrieveCampaignsByGeohash  

CampaignCrea1vi1es   PacingReached   IsAc1ve   Scheduling   FrequencyCapping   BlockedByPublisher  

Intersec1on  

CalculateWinner  

BidResponse  

ResultLog  

Page 17: Escalando hasta las 10.000 peticiones por segundo

Round  0  

Page 18: Escalando hasta las 10.000 peticiones por segundo

¡40  QPS!  ¿Seguro?  

KO

Dev Team Bidder

Page 19: Escalando hasta las 10.000 peticiones por segundo

•  Paralelizar  Iene  un  sobre-­‐coste  •  La  serialización  es  cara  y  aburrida  de  programar  

•  No  sabemos  que  pasa  por  dentro  •  “Real1me  processing”  !=  comunicación  sincrona  

Lecciones  aprendidas  

Page 20: Escalando hasta las 10.000 peticiones por segundo

•  Paralelizar  1ene  un  sobre-­‐coste  •  La  serialización  es  cara  y  aburrida  de  programar  

 

 

Round  1  

DRPCSpout  

CojoBolt  

RequestLog  ResponseLog  

Page 21: Escalando hasta las 10.000 peticiones por segundo

¡500  QPS!  ¿Seguro?  

KO

Dev Team Bidder

Page 22: Escalando hasta las 10.000 peticiones por segundo

•  Paralelizar  1ene  un  sobre-­‐coste  •  La  serialización  es  cara  y  aburrida  de  programar  

•  No  sabemos  que  pasa  por  dentro  •  “Real1me  processing”  !=  comunicación  sincrona  

•  Redis  no  nos  sirve  como  Storage  principal  

Lecciones  aprendidas  

Page 23: Escalando hasta las 10.000 peticiones por segundo

Round  2  

Page 24: Escalando hasta las 10.000 peticiones por segundo

Round  2  

Page 25: Escalando hasta las 10.000 peticiones por segundo

Round  2  

Page 26: Escalando hasta las 10.000 peticiones por segundo

¡500  QPS!  ¿Seguro?  

KO

Dev Team Bidder

Page 27: Escalando hasta las 10.000 peticiones por segundo

•  Paralelizar  1ene  un  sobre-­‐coste  •  La  serialización  es  cara  y  aburrida  de  programar  

•  No  sabemos  que  pasa  por  dentro  •  “RealIme  processing”  !=  comunicación  sincrona  

•  Redis  no  nos  sirve  como  Storage  principal  

Lecciones  aprendidas  

Page 28: Escalando hasta las 10.000 peticiones por segundo

•  Monitorizar  es  importante  para  nosotros  

Round  3  

Page 29: Escalando hasta las 10.000 peticiones por segundo

Round  3  

CORE  

PORTS  

ADAPTERS  

Page 30: Escalando hasta las 10.000 peticiones por segundo

Round  3  

CORE  

STORM  

REDIS  

Page 31: Escalando hasta las 10.000 peticiones por segundo

Round  3  

CORE  

DROPWIZARD  +  STORM  

MONGO  +  REDIS  

Page 32: Escalando hasta las 10.000 peticiones por segundo

Round  3  

Page 33: Escalando hasta las 10.000 peticiones por segundo

Cómo  conseguimos  las  métricas?  

@Timed(name = "BidRequests") !public Response bid(...) { !

"//Do your magic here!}  

...!Histogram validFoundCampaigns = Metrics.newHistogram("FoundCampaigns");!

validFoundCampaigns.update(filteredCampaigns.size()); !...!

Page 34: Escalando hasta las 10.000 peticiones por segundo

Métricas  siempre  visibles  

Page 35: Escalando hasta las 10.000 peticiones por segundo

Enviando  métricas  a  Graphite  

public static void configureMetricsReporter( !" "GraphiteConfiguration graphiteConfiguration) { !"if (graphiteConfiguration != null && graphiteConfig.isEnabled()) { !

GraphiteReporter.enable( !" " " "graphiteConfig.getGraphiteSendMetricsPeriodInSeconds(), " " " "TimeUnit.SECONDS, !" " " "graphiteConfig.getGraphiteHost(),!

graphiteConfig.getGraphitePort(), "!" " " "graphiteConfig.getGraphiteMetricsId());!"} !

}  

Page 36: Escalando hasta las 10.000 peticiones por segundo
Page 37: Escalando hasta las 10.000 peticiones por segundo
Page 38: Escalando hasta las 10.000 peticiones por segundo

¡3500  QPS!  ¡¡Seguro!!  

KO

Dev Team Bidder

Page 39: Escalando hasta las 10.000 peticiones por segundo

Round  5  

Page 40: Escalando hasta las 10.000 peticiones por segundo

Round  5  

Page 41: Escalando hasta las 10.000 peticiones por segundo

¡10000  QPS!  

KO

Dev Team Bidder

Page 42: Escalando hasta las 10.000 peticiones por segundo

•  En  cuanto  solucionas  un  cuello  de  botella  aparecerá  el  siguiente.  

•  Por  mucho  que  lo  intentemos  tendemos  a  la  op1mización  prematura.  

•  La  algoritmia  no  nos  ha  resuelto  el  problema.  •  Busca  una  librería  de  métricas  para  tu  stack.  •  Un  entorno  de  trabajo  higiénico  es  imprescindible.  

Lecciones  aprendidas  

Page 43: Escalando hasta las 10.000 peticiones por segundo
Page 44: Escalando hasta las 10.000 peticiones por segundo

Entre  175  y  250  GB  diarios  de  datos  comprimidos  (1,6TB  en  crudo)  •  Escritura  en  disco  en  diferido  •  Discos  SSD  •  Envío  por  lotes  a  S3  

Problemas  de  almacenamiento  

Page 45: Escalando hasta las 10.000 peticiones por segundo

“Si  devuelve  void,  puede  esperar”  

public void log( ! final RTBImplementationBean request, ! final AdExchange adExchange) { ! FutureTask futureLog = new FutureTask(new Callable() { ! @Override! public Object call() throws Exception { !

" synchLog(request, adExchange);!" " "return null; !" } !" );!

futureLog.run();!}  

Rest  Server   Worker  PubSub   DB  

A  nivel  de  código  

A  nivel  arquitectónico  

Page 46: Escalando hasta las 10.000 peticiones por segundo

•  Si  necesitas  backups,  ten  en  cuenta  que  necesita  el  doble  de  memoria  de  la  que  vas  a  usar.  

Redis  va  como  un  1ro  pero…  

Backup  instance  

Page 47: Escalando hasta las 10.000 peticiones por segundo

Cuidado  con  el  tamaño  del  heap  

Page 48: Escalando hasta las 10.000 peticiones por segundo

•  De  dicas  más  1empo  a:  – Programar  vs  Despelgar?  – Diagnos1car  vs  Corregir?  – Bugs  vs  Features?  

•  Opacidad  •  Pérdida  del  control    

Cuida  tu  entorno  de  trabajo  

Page 49: Escalando hasta las 10.000 peticiones por segundo

Cada  pieza  del  puzzle  es  mo1vo  de  preocupaciones.  

Sobreingenieria  es  evil  

Page 50: Escalando hasta las 10.000 peticiones por segundo

• Miedo  al  cambio.  •  Sen1miento  de  pertenencia.  •  Ser  exesivamente  conservador.  •  Fíate  de  tus  ins1ntos.  

“La  inercia  te  frena  ¿WTF?”  

Page 51: Escalando hasta las 10.000 peticiones por segundo

Q&A  Muchas  Gracias  

Page 52: Escalando hasta las 10.000 peticiones por segundo

Spain!(headquarters)!

! Pº Castellana 111, 1st floor!

28046 Madrid – Spain!+34 91 101 1001!

<<<<  

USA!! !

747 3rd Avenue!NY, NY 10017!

+1 516 206 2392!  

Colombia!! !

Carrera 7, nº71 – 21. Torre B!Piso 13 – 15!

Bogotá, Colombia!+57 1 31 35 913!

 

Contact us at :!www.taptpanetworks.com & www.sonatalocal.com!

[email protected]!@TAPTAP_Networks & @SONATAlocal!