fbpx

Real Time Bidding

av Nicolai Gjellestad | 12 Februar, 2020

I et stort globalt annonsenettverk for programmatisk kjøp av annonseplasser foregår det tusenvis av transaksjoner i sekundet. Hver eneste gang noen åpner en nettside eller app som deltar i nettverket startes det en auksjon hvor mange aktører har muligheten til å by på annonseplassene. Vinneren er den med det høyeste godkjente budet. Dette er auksjon i sanntid, eller real time bidding (RTB), og i sentrum står en RTB-applikasjon som byr på annonseplasser på for oss på vegne av våre kunder.

Nurofy har som ambisjon å lage en komplett annonseplattform for annonsering med Nurofy Ads. I den sammenheng er det viktig for oss å kunne tilby programmatisk kjøp av annonseplasser uten mange fordyrende mellomledd. For at vi som en liten aktør skal få tilgang til å kjøpe annonseplasser i slike auksjonsnettverk som Google AdExchange eller AppNexus må vi ha en RTB-applikasjon som kan by på annonseplasser for oss. Det finnes hyllevare og open source prosjekter på dette i dag, men etter å ha lest spesifikasjonene bestemte vi oss for å lage vår egen slik at det passer best mulig inn i våre systemer. Dette gir oss tilgang på en hel verden av annonseplasser hos de største nettstedene og applikasjonene i verden. Til å begynne med kobler vi oss opp på Google sitt auksjonsnettverk AdExchange, men når den integrasjonen er klar begynner vi å integrere mot neste nettverk som AppNexus, eller kanaler som Twitter og LinkedIn.

En del av utfordringen er at det skal gå fort nok. Hele prosessen med kjøp og leveranse av annonsen skal foregå før nettsiden din er ferdig lastet, så vi har mellom 125 og 300 millisekunder på å svare på auksjonen. Dette var en av grunnene til at vi valgte å skrive det i Go fordi språket gir oss stor kontroll over alt som skjer og med goroutines er det lett å skrive effektivt og samtidig kode. Mye av arbeidet ligger i å strømlinjeforme data slik at det er minst mulig evaluering i sanntid, slik at vi kan bruke tiden på å levere flest mulig bud for kundene våre.

Når en nettside laster går det et kall fra publisisten (nettstedets eier) til Google AdExchange, deretter sendes det ut henvendelser om å få inn bud (bid request) fra deltagerne i auksjonen. Formatet sendes på protokollen OpenRTB eller Google sin egen Real-Time Bidding Protocol som oftest serialisert med protocol buffers (https://developers.google.com/protocol-buffers/) eller JSON. Applikasjonen vår er en webserver i Go som har et API-endepunkt som mottar budhenvendelser på POST-requests fra Google sitt auksjonsnettverk. Deretter pakker vi den ut og sjekker opp mot våre nåværende annonsekampanjer for å se om det er noen som treffer på kriteria til annonsen, at brukeren er lokalisert på riktig plass, annonseplassen har riktige dimensjoner og at den ikke er dyrere enn det kunden er villig til å betale for plassen. Vi pakker annonsen i HTML-format og prisen vi er villig til å betale inn i et bud (bid response) og svarer til Google, så vil de avgjøre hvem som har vunnet auksjonen. Dersom vi vinner denne sendes det et kall til vår tjeneste som sporer annonsevisninger om at denne annonsen vises, dette kallet inneholder prisen vi må betale for visningen slik at vi kan registrere transaksjonen og oppdatere budsjettet.

Annonsekampanjene vi til enhver tid skal by på vegne av lagrer vi i Redis og andre tjenester vil sørge for at denne til enhver tid er oppdatert. En annen fordel er at vi kan skalere horisontalt med flere instanser av vår RTB som leser fra samme Redis Cache slik at vi kan ta unna enda større budmengder. For å hele tiden holde listen over annonser vi byr med oppdatert har vi asynkrone prosesser som legger til nye kampanjer eller stopper kampanjer som enten er ferdig eller budsjettet er tomt. Foreløpig ser ytelsestester veldig bra ut, uten nettverksventetid bruker bidderen 4,5 millisekunder på å svare på en budhenvendelse med 4 annonseplasser opp mot en liste på 50 annonser vi har. Tiden øker med antall samtidige budhenvendelser, nettverksventetid og antall annonser. Neste steg er full integrasjonstest under samme forutsetninger som et reelt produksjonsmiljø.

Status nå er at vi finpusser våre interne integrasjons og ytelsetester før vi går i gang med testfase i samarbeid med Google. I testfasen vil vi motta produksjonsdata og kan gi bud, men i testfasen vil alle budene våre bli forkastet. Dette gir en sikker og veldig produksjonsnær test av systemet før vi går i produksjon. Mengden bud vil være liten i starten og så økes det gradvis slik at vi ser at vår RTB vil håndtere budmengden. Vi bruker Elastic APM og Kibana for overvåkning av svartider og ytelse slik at vi kan justere på ting for å kneppe inn på millisekunder før vi går i testfase med Google. Foreløpige resultater ser bra ut, vi må bare finne det rette oppsettet i Azure og gjøre noen justeringer i koden slik at vi når de ytelsesmålene vi har satt oss selv. Etter testfasen hos Google er vi endelig en aktør i auksjonsnettverket! Vi kan da tilby programmatisk kjøp for våre kunder fra vår egen RTB og kutte kostnader i form av teknologiavgifter.

Vil du høre mer om hva vi holder på med?