Escalando	
  hasta	
  las	
  10.000	
  
pe1ciones	
  por	
  segundo	
  
Sergio	
  Arroyo	
  Cuevas	
  
sergio.arroyo@tapta...
@TAPTAP_Networks	
  
Proveedor	
  de	
  
campañas	
  
Proveedor	
  de	
  
“escaparates”	
  
inventario	
  
AdServer	
  
Forecas1ng	
  
SSP	
  
AdExchange	
  
Subasta	
  
DSP	
  
Bidder	
  
SDK	
  
1.	
  Dame	
  
anuncios	
  
2.	
  Hay	
  un	
  escaparate	
 ...
•  ¿Qué	
  campaña	
  ponemos?	
  
•  ¿Cuánto	
  pagamos	
  por	
  ella?	
  
•  Necesitamos	
  muchísimas	
  pe1ciones	
  ...
¿CÓMO	
  AFRONTAMOS	
  EL	
  RETO?	
  
Redis	
  
Storm	
  
Hadoop	
  
MongoDB	
  
Amazon	
  S3	
  
Dev Team Bidder
Dev Team Bidder
Round	
  0	
  
DRPCSpout	
  
BidRequest	
  
Crea1vi1es	
   RequestLog	
  
RetrieveCampaignsByGeohash	
  
CampaignCrea1vi1e...
Round	
  0	
  
¡40	
  QPS!	
  
¿Seguro?	
  
KO
Dev Team Bidder
•  Paralelizar	
  Iene	
  un	
  sobre-­‐coste	
  
•  La	
  serialización	
  es	
  cara	
  y	
  aburrida	
  de	
  
programa...
•  Paralelizar	
  1ene	
  un	
  sobre-­‐coste	
  
•  La	
  serialización	
  es	
  cara	
  y	
  aburrida	
  de	
  
programa...
¡500	
  QPS!	
  
¿Seguro?	
  
KO
Dev Team Bidder
•  Paralelizar	
  1ene	
  un	
  sobre-­‐coste	
  
•  La	
  serialización	
  es	
  cara	
  y	
  aburrida	
  de	
  
programa...
Round	
  2	
  
Round	
  2	
  
Round	
  2	
  
¡500	
  QPS!	
  
¿Seguro?	
  
KO
Dev Team Bidder
•  Paralelizar	
  1ene	
  un	
  sobre-­‐coste	
  
•  La	
  serialización	
  es	
  cara	
  y	
  aburrida	
  de	
  
programa...
•  Monitorizar	
  es	
  importante	
  para	
  nosotros	
  
Round	
  3	
  
Round	
  3	
  
CORE	
  
PORTS	
  
ADAPTERS	
  
Round	
  3	
  
CORE	
  
STORM	
  
REDIS	
  
Round	
  3	
  
CORE	
  
DROPWIZARD	
  +	
  STORM	
  
MONGO	
  +	
  REDIS	
  
Round	
  3	
  
Cómo	
  conseguimos	
  las	
  métricas?	
  
@Timed(name = "BidRequests")!
public Response bid(...) {!
"//Do your magic her...
Métricas	
  siempre	
  visibles	
  
Enviando	
  métricas	
  a	
  Graphite	
  
public static void configureMetricsReporter(!
" "GraphiteConfiguration graphiteC...
¡3500	
  QPS!	
  
¡¡Seguro!!	
  
KO
Dev Team Bidder
Round	
  5	
  
Round	
  5	
  
¡10000	
  QPS!	
  
KO
Dev Team Bidder
•  En	
  cuanto	
  solucionas	
  un	
  cuello	
  de	
  botella	
  
aparecerá	
  el	
  siguiente.	
  
•  Por	
  mucho	
  qu...
Entre	
  175	
  y	
  250	
  GB	
  diarios	
  de	
  datos	
  comprimidos	
  
(1,6TB	
  en	
  crudo)	
  
•  Escritura	
  en	...
“Si	
  devuelve	
  void,	
  puede	
  esperar”	
  
public void log(!
final RTBImplementationBean request,!
final AdExchange...
•  Si	
  necesitas	
  backups,	
  ten	
  en	
  cuenta	
  que	
  
necesita	
  el	
  doble	
  de	
  memoria	
  de	
  la	
  q...
Cuidado	
  con	
  el	
  tamaño	
  del	
  heap	
  
•  De	
  dicas	
  más	
  1empo	
  a:	
  
– Programar	
  vs	
  Despelgar?	
  
– Diagnos1car	
  vs	
  Corregir?	
  
– Bugs	
...
Cada	
  pieza	
  del	
  puzzle	
  es	
  mo1vo	
  de	
  
preocupaciones.	
  
Sobreingenieria	
  es	
  evil	
  
•  Miedo	
  al	
  cambio.	
  
•  Sen1miento	
  de	
  pertenencia.	
  
•  Ser	
  exesivamente	
  conservador.	
  
•  Fíate	...
Q&A	
  
Muchas	
  Gracias	
  
Spain!
(headquarters)!
!
Pº Castellana 111, 1st floor!
28046 Madrid – Spain!
+34 91 101 1001!
<<<<	
  
USA!
!
!
747 3rd Ave...
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Upcoming SlideShare
Loading in …5
×

Sergio arroyo | TAPTAP Networks | Developers

1,871 views

Published on

Sergio arroyo | TAPTAP Networks | Developers

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,871
On SlideShare
0
From Embeds
0
Number of Embeds
1,317
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Sergio arroyo | TAPTAP Networks | Developers

  1. 1. Escalando  hasta  las  10.000   pe1ciones  por  segundo   Sergio  Arroyo  Cuevas   sergio.arroyo@taptapnetworks.com   @delr3ves  
  2. 2. @TAPTAP_Networks  
  3. 3. Proveedor  de   campañas   Proveedor  de   “escaparates”   inventario   AdServer   Forecas1ng  
  4. 4. SSP   AdExchange   Subasta   DSP   Bidder   SDK   1.  Dame   anuncios   2.  Hay  un  escaparate    disponible,     ¿cuánto  me  dais?  
  5. 5. •  ¿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  
  6. 6. ¿CÓMO  AFRONTAMOS  EL  RETO?  
  7. 7. Redis   Storm   Hadoop   MongoDB   Amazon  S3  
  8. 8. Dev Team Bidder
  9. 9. Dev Team Bidder
  10. 10. Round  0   DRPCSpout   BidRequest   Crea1vi1es   RequestLog   RetrieveCampaignsByGeohash   CampaignCrea1vi1es   PacingReached   IsAc1ve   Scheduling   FrequencyCapping   BlockedByPublisher   Intersec1on   CalculateWinner   BidResponse   ResultLog  
  11. 11. Round  0  
  12. 12. ¡40  QPS!   ¿Seguro?   KO Dev Team Bidder
  13. 13. •  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  
  14. 14. •  Paralelizar  1ene  un  sobre-­‐coste   •  La  serialización  es  cara  y  aburrida  de   programar       Round  1   DRPCSpout   CojoBolt   RequestLog  ResponseLog  
  15. 15. ¡500  QPS!   ¿Seguro?   KO Dev Team Bidder
  16. 16. •  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  
  17. 17. Round  2  
  18. 18. Round  2  
  19. 19. Round  2  
  20. 20. ¡500  QPS!   ¿Seguro?   KO Dev Team Bidder
  21. 21. •  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  
  22. 22. •  Monitorizar  es  importante  para  nosotros   Round  3  
  23. 23. Round  3   CORE   PORTS   ADAPTERS  
  24. 24. Round  3   CORE   STORM   REDIS  
  25. 25. Round  3   CORE   DROPWIZARD  +  STORM   MONGO  +  REDIS  
  26. 26. Round  3  
  27. 27. 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());! ...!
  28. 28. Métricas  siempre  visibles  
  29. 29. 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());! "}! }  
  30. 30. ¡3500  QPS!   ¡¡Seguro!!   KO Dev Team Bidder
  31. 31. Round  5  
  32. 32. Round  5  
  33. 33. ¡10000  QPS!   KO Dev Team Bidder
  34. 34. •  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  
  35. 35. 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  
  36. 36. “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  
  37. 37. •  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  
  38. 38. Cuidado  con  el  tamaño  del  heap  
  39. 39. •  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  
  40. 40. Cada  pieza  del  puzzle  es  mo1vo  de   preocupaciones.   Sobreingenieria  es  evil  
  41. 41. •  Miedo  al  cambio.   •  Sen1miento  de  pertenencia.   •  Ser  exesivamente  conservador.   •  Fíate  de  tus  ins1ntos.   “La  inercia  te  frena  ¿WTF?”  
  42. 42. Q&A   Muchas  Gracias  
  43. 43. 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! info@sonatalocal.com! @TAPTAP_Networks & @SONATAlocal!

×