Projekat 05 · Marketplace i prihodi
Analitika uživo za oglašivače na dva miliona upisa dnevno
Napravio sam analitički sloj marketplacea za oglašavanje. Godišnji izvještaj stizao je za manje od sekunde, čak i za klijente s više od 900 oglasa.
2M+ upisa dnevno
u bazu vremenskih serija
Godišnji izvještaj za manje od sekunde na 900+ oglasa
iz 365 dnevnih zbirova po oglasu
Priča u 5 koraka
Stack
- InfluxDB
- MySQL
- WebSockets
- Node.js
- AWS
01 · Kontekst
Projektovao sam i napravio analitički sloj za oglasni marketplace.
Projektovao sam i napravio analitički sloj za oglasni marketplace. Primao je preko dva miliona upisa dnevno, punio dashboard koji se osvježavao uživo i za manje od sekunde vraćao cijelu godinu historije.
Velik broj upisa, prikaz uživo i brzi godišnji izvještaji inače se međusobno isključuju. Baza koja brzo prima podatke spora je na složenim upitima, a godina sirovih podataka tim tempom znači stotine miliona redova. Nijedna baza ne radi sva tri posla, pa sam ih podijelio na dvije.
02 · Nije se smjelo mijenjati
Na oglasnoj platformi klijent plaća dokaz da je njegov oglas viđen.
Na oglasnoj platformi klijent plaća dokaz da je njegov oglas viđen. Kad servis za popravke plati oglas, pri obnovi ga zanima samo koliko je ljudi vidjelo oglas i koliko ih je nazvalo.
Analitika je ono čime se opravdava faktura, pa gotov alat nije dolazio u obzir. Opšta web analitika mjeri saobraćaj prema sajtu. Ne mjeri vrijednost koju je dobio jedan oglašivač i ne može mu tu brojku prikazati u njegovom korisničkom računu, na dashboardu, pored datuma obnove.
Sistem je istovremeno morao primati velik broj upisa, prikazivati podatke uživo i brzo sabrati cijelu godinu. Svaka od tih stvari sama po sebi je lagana.
03 · Šta sam uradio
Baza vremenskih serija za prijem podataka, s namjerno malim indeksom. Identifikatore kao što su oglas, korisnik i uređaj stavio sam u polja.
Baza vremenskih serija za prijem podataka, s namjerno malim indeksom. Identifikatore kao što su oglas, korisnik i uređaj stavio sam u polja. U bazi vremenskih serija tagovi su indeksirani, a polja nisu, pa ID oglasa u tagu znači da svaki novi oglas pravi novu seriju i da se indeks na kraju uguši. To je najčešći razlog zbog kojeg ovakve instalacije propadnu.
Pošto ID oglasa nije bio u indeksu, baza vremenskih serija nije mogla efikasno grupisati po oglasu, pa se to grupisanje radilo u relacionoj bazi.
Dnevni zbirovi u relacionoj bazi. Sirovi događaji čuvali su se sedam dana, a svaki dan su se izvozili u object storage kao arhiva. Dnevni sažetak po oglasu upisivao se u relacionu bazu, a dashboard i fakture čitali su upravo njega.
Zahvaljujući dnevnim zbirovima, godišnji izvještaj nikad nije dirao sirove redove: čitao je 365 sažetih redova po oglasu.
Brzina mjerena na najvećim klijentima. Rezultat ispod jedne sekunde važi i za klijente s više od 900 oglasa, kod kojih godina dnevnih zbirova znači otprilike 330.000 redova sabranih u jednom upitu. Izvještaj koji se za klijenta s tri oglasa vrati za manje od sekunde ne govori ništa o arhitekturi, pa sam mjerio najgori slučaj, a ne prosjek.
Ukupni i jedinstveni pregledi u odvojenim bucketima. Jedinstvene preglede brojao sam po sesiji i po URL-u stranice, pa se neko ko je tražio u dva grada nije brojao kao jedan pregled: tražio je dvije različite stvari. Ukupni pregledi su veća brojka i ljepše izgledaju, a jedinstveni oglašivaču govore koliko ga je različitih ljudi vidjelo. Zadržao sam obje brojke, pa nijednu nije trebalo skrivati.
Filtriranje botova na tri sloja. Botove sam filtrirao na firewallu, po poznatim adresama i po user agentu. Na oglasnoj platformi napuhan broj pregleda ruši povjerenje: oglašivač koji vidi pet stotina pregleda i nijedan poziv prestane vjerovati brojci, a onda i fakturi.
04 · Rezultat
2M+ upisa dnevno u bazu vremenskih serija
- 2M+ upisa dnevno u bazu vremenskih serija
- Oglašivači svoje brojke prate uživo na dashboardu
- Godišnji izvještaj za manje od sekunde na 900+ oglasa, iz 365 dnevnih zbirova po oglasu
- Isti podaci pune i godišnji izvještaj koji se šalje prije svake obnove
05 · Šta bih uradio drugačije
Sedam dana čuvanja sirovih podataka izabrano je rano i nikad nije preispitano.
Sedam dana čuvanja sirovih podataka izabrano je rano i nikad nije preispitano. Gotovo sigurno je to bilo ispravno, ali nikad nisam provjerio šta smo time izgubili: da li je ikome trebalo ponovo obraditi period duži od sedmice i koliko bi koštalo čuvati trideset dana. Izabrao sam broj i krenuo dalje.
Povezane usluge
Usluge koje se oslanjaju na ovaj projekat.
- Web razvojFull-stack web razvojAnalitika koja prima dva miliona upisa dnevno, uživo osvježava dashboard klijenta i godinu historije vraća za manje od sekunde.
- Cloud i DevOpsPregled troškova cloudaAnalitika marketplacea sa 2M upisa dnevno: skladištenje je činilo 95% računa za managed time-series servis, a vlastita instanca bila je, po našoj procjeni, oko 27.000 $ godišnje jeftinija. Promjena politike čuvanja podataka spustila je skladištenje na 1,31 $ mjesečno, a managed servis je i dalje bio skuplji, ovaj put zato što naplaćuje svaki upit koji pokrene dashboard nekog od korisnika.
- Web razvojAdmin paneli i interni alatiDashboard uživo za oglašivače na američkoj platformi za usluge kamionima. Za klijente s više od 900 oglasa cijela godina historije učita se za manje od sekunde.
- Backend, podaci i integracijeProduktna analitika i praćenje događajaUkupni i jedinstveni pregledi čuvaju se odvojeno, a promet botova filtrira se na tri nivoa: na firewallu, po poznatim adresama i po user agentu. Napuhan broj košta vas povjerenja klijenta.
- Backend, podaci i integracijeSistemi s velikim brojem upisaPreko dva miliona upisa dnevno ide u time-series skladište s namjerno malim indeksom, a svaki oglašivač rezultate vidi uživo u svom dashboardu.
- Backend, podaci i integracijeOptimizacija SQL-a i data warehouseaOglašivačima na američkom marketplaceu godišnji izvještaj otvara se za manje od sekunde i kad imaju više od 900 oglasa, jer čita samo dnevne agregacije.
- Backend, podaci i integracijeReal-time i WebSocketsWebSocket servis na američkom marketplaceu prenosio je ažuriranja dashboarda uživo za oglašivače, obavijesti pojedinačnim korisnicima, prisilnu odjavu i zaključavanje koje sprječava da dva admina istovremeno uređuju isti zapis. Analitika koja puni te dashboarde prima više od dva miliona upisa dnevno.
Povezani tekstovi
Tekstovi nastali iz ovog projekta.
- 19 SEP 2026 · 8 minVlastiti hosting InfluxDB-a ostao je jeftiniji zbog naplate po upituNa 2 TB vlastiti hosting štedio je oko 27.000 $ godišnje. Kad je kraći rok čuvanja podataka spustio trošak skladišta na 1,31 $, ostao je jeftiniji: plaća se svaki upit s dashboarda.
- 17 SEP 2026 · 8 minServerless chat na AWS-u: 19 $ mjesečno za 100 korisnika i njegove graniceU grupama od deset jedan server postaje jeftiniji na oko 1.200 korisnika. Nove konekcije ostaju ograničene na 500 u sekundi po AWS računu dok AWS ne poveća kvotu.
- 15 SEP 2026 · 9 minCijena serverless WebSocketa: minute konekcije rijetko su najveća stavkaMinute konekcije bile su najveća stavka u samo 3 od 18 modeliranih scenarija. Ispod 1.000 korisnika veći dio računa čini fiksni trošak od 16,64 $ mjesečno za Redis i VPC endpoint.
- 29 JUL 2026 · 6 minKardinalnost u InfluxDB-u: ID-jevi korisnika i uređaja ne idu u tagoveID-jevi u tagovima povećavaju indeks InfluxDB-a sa svakim novim posjetiocem. Uz ID-jeve u poljima i dnevni sažetak u MySQL-u, godina za preko 900 oglasa vraća se za manje od sekunde.
Projekat 05
Radite na sličnom problemu? Odgovaramo u roku od jednog radnog dana.
Prvi poziv traje 30 minuta i ni na šta vas ne obavezuje.