escalando hasta las 10.000 peticiones por segundo
TRANSCRIPT
@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 disponible, ¿cuánto me dais?
• ¿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
¿CÓMO AFRONTAMOS EL RETO?
Redis Storm
Hadoop MongoDB
Amazon S3
Dev Team Bidder
Dev Team Bidder
Round 0 DRPCSpout
BidRequest
Crea1vi1es RequestLog
RetrieveCampaignsByGeohash
CampaignCrea1vi1es PacingReached IsAc1ve Scheduling FrequencyCapping BlockedByPublisher
Intersec1on
CalculateWinner
BidResponse
ResultLog
Round 0
¡40 QPS! ¿Seguro?
KO
Dev Team Bidder
• 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
• Paralelizar 1ene un sobre-‐coste • La serialización es cara y aburrida de programar
Round 1
DRPCSpout
CojoBolt
RequestLog ResponseLog
¡500 QPS! ¿Seguro?
KO
Dev Team Bidder
• 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
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 programar
• No sabemos que pasa por dentro • “RealIme processing” != comunicación sincrona
• Redis no nos sirve como Storage principal
Lecciones aprendidas
• 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 here!}
...!Histogram validFoundCampaigns = Metrics.newHistogram("FoundCampaigns");!
validFoundCampaigns.update(filteredCampaigns.size()); !...!
Métricas siempre visibles
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());!"} !
}
¡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 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
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
“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
• 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
Cuidado con el tamaño del heap
• 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
Cada pieza del puzzle es mo1vo de preocupaciones.
Sobreingenieria es evil
• Miedo al cambio. • Sen1miento de pertenencia. • Ser exesivamente conservador. • Fíate de tus ins1ntos.
“La inercia te frena ¿WTF?”
Q&A Muchas Gracias
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!