Vývoj inzertního systému Engerio založeného na Cloud Native

Případová studie na vývoj systému nativní inzerce pomocí Cloud Native přístupu pro zobrazování relevantních reklam na největších slovenských a dalších světových mediálních platformách.

Obslouží 100 000 dotazů za minutu
Zpracováno 100 000 článků za 6 měsíců
20 000 návštěv za minutu
450 milionů impresí měsíčně

Logo společnosti

Klient

Engerio je slovenská společnost zabývající se nativní reklamou v online médiích. Inzerentům nabízí možnost propagovat své produkty a služby formou nerušivých obchodních sdělení přímo v obsahu. Dále poskytuje inzerentům kompletní datový servis týkající se reklamních kampaní (míra prokliků, imprese, CTR, …).

Požadavek

Klient nás požádal o vývoj nativního inzertního systému založeného na nejmodernějších Cloud Native technologiích. Koncept nativní reklamy spočívá v tom, že se návštěvníkům zpravodajských a jiných mediálních portálů zobrazuje inzerce nerušivým způsobem přímo mezi články. Reklamní sdělení jsou navíc vybírána tak, aby byla co nejvíce relevantní pro konkrétního uživatele. Algoritmus vyhodnocuje uživatelovy preference a podle nich mu ve speciálním widgetu zobrazuje reklamní obsah, který by ho mohl zajímat. Inzerenti jako ČSOB, O2 či Kaufland mohou touto cestou propagovat své služby na nejnavštěvovanějších slovenských webech (Pravda.sk, Zoznam.sk, Topky.sk a spoustě dalších) a dostat tak na své stránky prostřednictvím prokliků mnoho nových potenciálních klientů.

 

Dashboard pro inzerenty

Seznam vydavatelů

Problémy

Problémy, se kterými jsme se při vývoji museli popasovat:

  1. Komplexnost systému: Výsledné řešení mělo obsahovat mnoho vrstev a zvládat vysoce komplexní úlohy, jako je získávání a třídění dat, zobrazování relevantního obsahu podle preferencí uživatelů, přizpůsobení zobrazení pro mobily a tablety atd.
  2. Scraping dat: Vytvoření databáze článků určených k vydání a postupné doplňování novými články.
  3. Vytvoření a nastavení widgetů: Publisheři měli být schopni si widgety sami vkládat na své weby, přidávat do nich reklamy a plně si je přizpůsobit.
  4. Komunikace se SmartAd: Bylo nutné vyřešit komunikaci systému s touto reklamní výdejovou aplikací.
  5. Optimalizace fungování systému: Vzhledem k rozsahu projektu bylo potřeba počítat s velmi vysokým provozem (miliony návštěvníků denně), nízkou odezvou (cca 100 ms) kvůli vynikajícímu uživatelskému dojmu a nepřetržitou dostupností systému 24 hodin denně bez výpadků.
  6. Náklady: Měsíční provozní náklady bylo nutné nastavit na takovou úroveň, aby byl celý projekt rentabilní.
  7. Vhodný výběr článků: Návštěvníkům se musí zobrazovat články, které ještě nečetli, a u kterých je zároveň největší pravděpodobnost, že se jim budou líbit.
  8. Zastarávání a změny článků: Stejně jako veškerý obsah na internetu i zpravodajské a jiné články v online médiích se mohou v čase měnit a ztrácet na aktuálnosti.

Řešení problémů

Komplexnost systému

Systém byl navržen jako Cloud Native a rozdělen do několika modulů, které fungují nezávisle na sobě. Tím se nám podařilo jeho komplexitu snížit. Systém jsme rozdělili na tyto části:

  • Widget skript
  • Skript na notifikaci o nových článcích
  • Scrapování článků
  • Webová aplikace – administrace
  • Webová aplikace – dashboard pro klienty
  • Modul pro komunikaci se SmartAd
  • Periodické úkoly
  • API

Nastavení scraperu

Logo Scrapy

Získávání článků

  • Když uživatel klikne na článek, článek se uloží do naší databáze, kde proběhne jeho další zpracování (scraping). K získávání článků pomocí metody scrapingu jsme využili knihovnu Scrapy, kterou jsme upravili pro naši potřebu.
  • Nové články jsou vyhledávány pomocí skriptu, který anonymně sleduje zobrazení článků na webu a poté jejich URL posílá k nám na servery. Pokud zjistíme, že pro danou URL ještě nemáme článek „scrapnutý“, a pokud článek zároveň odpovídá pravidlům nastaveným ve webové aplikaci, pak proběhne scraping.
  • Jelikož některé weby scraping blokují, musíme pro ně v jednotlivých případech navrhnout řešení na míru, které umožní tuto překážku obejít.

Zpracování widgetů pro publishery

  • Webová aplikace nabízí rozsáhlé možnosti nastavení widgetu (zejména jeho zobrazení).
  • Dále jsou zde funkce pokročilého přizpůsobení pomocí přídavného CSS kódu. Publisherovi stačí jednoduše vložit náš skript a zvolit umístění, kam ho chce uložit.
  • Výhodou widgetu je také malá velikost díky minimalizovanému kódu. Jeho stažení je tak opravdu rychlé, šetří výpočetní kapacitu serveru/CDN a zbytečně nezpomaluje načítání stránky. 

Nastavení zobrazení widgetu

Logo SmartAd

Komunikace se SmartAd

Komunikace se službou SmartAd probíhá na několika úrovních:

  • V rámci reportů synchronizujeme údaje ze SmartAd do aplikace Engerio.
  • Následuje synchronizace údajů kampaní (počet zobrazení, procento prokliků, …), které jsou sdíleny s klienty pomocí dashboardu ve webové aplikaci.
  • Nejdůležitější částí je získávání reklam, které se mají zobrazit ve widgetu.

Optimalizace fungování systému

  • CDN
    • Provoz systému jsme optimalizovali zčásti s pomocí Cloud Native technologií, které jsou k dispozici na AWS Cloudu, a zčásti jsme si pomohli vlastními řešeními v Pythonu.
    • Všechny CSS a JS soubory potřebné k zobrazení widgetů jsou umístěný na CDN, která je cachuje a rozesílá do tzv. edge locations umístěných po celém světě. V případě změny některého souboru (buď kvůli nové verzi, nebo kvůli změně nastavení widgetu v aplikaci) je vynuceno stažení nové verze.
  • API
    • Většina dat (např. výdej článků a informace o nastavení widgetu) je cachovaná, což odlehčuje databázi.
    • Úkoly, které není třeba provádět okamžitě, jako například zápis zobrazení, prokliků a dalších statistik nebo scraping, se vkládají do fronty, odkud je poté zpracovávají „workeři“. Tím se předchází narušování provozu systému.
    • Dále jsme výrazně optimalizovali dotazy do databáze, kdy každý dotaz musí být dokončen do 5 ms.
    • Optimalizovány byly také veškeré knihovny, nástroje a webserver.

Logo AWS CloudFront

Logo AWS Aurora

Škálování a načítání widgetů

  • Škálování služeb
    • Kromě optimalizací jsme také zavedli škálování a vysokou dostupnost některých služeb v duchu Cloud Native přístupu (databáze, fronty, webservery).
    • Škálování je nastaveno tak, aby u každé z těchto služeb běžely alespoň dvě instance, přičemž každá musí být umístěna v jiném datovém centru. Tím je zajištěna vysoká dostupnost aplikace a její plynulé fungování i v případě výpadku jednoho datového centra.
    • Pokud se navíc vytížení blíží vysoké hranici, nasadí se další instance, čímž se vytížení sníží, a naopak.
  • Podmíněné načítání widgetů
    • Pokud je widget umístěn ve spodní části webu, není potřeba načítat ho při vstupu na stránku, ale až poté, co uživatel „doscrolluje“ do spodní části stránky.

Náklady

  • Díky škálování (viz bod výše) lze při nízkém vytížení (primárně v noci) omezit počet spuštěných instancí služeb, což výrazně šetří provozní náklady.
  • Všechny výše zmíněné optimalizace nám umožnily dostat se na méně než 2,5 % výkonu oproti situaci, kdy bychom se optimalizacemi vůbec nezabývali.

Logo AWS Cost Explorer

Seznam postů

Vhodný výběr článků

  • Jelikož jsme nemohli použít cookies, museli jsme se poohlédnout po méně invazivní alternativě, která neumožňuje přímé sledování návštěvníka webu.
  • Rozhodli jsme se pro tzv. otisk prohlížeče. Jednoduše řečeno, každý prohlížeč (a tím pádem i individuálního uživatele) lze identifikovat podle určité sady údajů, jako jsou verze a typ prohlížeče, operační systém, aktivní pluginy, časové pásmo, jazyk, rozlišení obrazovky a řada dalších.
  • Webové stránky mohou na základě těchto informací identifikovat „skoro“ unikátní uživatele a sledovat jejich chování v online prostoru, což lze využít především k zobrazování relevantního reklamního obsahu.

Změny v článcích a neaktuálnost

  • Články se po dobu své existence mohou měnit, a některé se navíc rychle stávají neaktuálními. Proto jsme nastavili scraping článků s periodickým opakováním. Opakované pokusy o scraping provádíme také v případě, že scraping z nějakého důvodu selže.
  • Články zůstávají v databázi jen po dobu, kterou nastavují pravidla v administraci.

Dashboard pro inzerenty

Reference klienta

„Pre náš projekt sme sa pri výbere programátorskej firmy rozhodovali medzi viacerými. Think Easy nás presvedčili svojim precíznym prístupom už pri úvodnej analýze. Pri príprave podkladov aj z finálnych výstupov bolo vidieť ako detailne rozmýšľajú nad návrhom aplikácie. Veľmi sa nám na spolupráci páči, že sa hlbšie zamýšľajú ako funkcie aplikácie spraviť užívateľsky čo najprívetivejšie. Zároveň myslia na veľa detailov, ktoré by nám ako klientovi nenapadli. Vnímame, že máme partnera, na ktorého sa môžeme spoľahnúť.“

Zuzana Kačírová, CEO Engerio

Editace postu

Hlavní přínos

  • Inzerenti jako jsou ČSOB, Kaufland nebo O2 mohou každý den oslovit miliony návštěvníků největších slovenských online médií formou widgetů / agregovaných článků.
  • Publisheři monetizují svůj obsah tím, že do něj vkládají widgety s nativními reklamami.
  • Vysoké procento prokliků vůči impresím a kompletní přehled o reklamních kampaních pro inzerenty.
  • Nízká odezva systému.
  • Robustní správa scraperů s vysokým počtem pravidel umožňuje přesnější specifikaci kritérií pro ukládání článků, které mají být zařazeny do databáze.
  • Robustní správa widgetů s rozsáhlými možnostmi přizpůsobení.
  • Prvotřídní CDN (síť pro doručování obsahu).
  • Pestrá nabídka reklamních formátů (obrázky, videa, carousely).

Použité platformy a technologie

Jaké platformy a technologie jsme při vývoji použili

  • Řešení jakožto celek je postavené na AWS Cloudu.
  • Backend/API jsme vytvořili pomocí Django/Django Rest Frameworku.
    • Pro zpracování asynchronních a periodických úkolů jsme využili knihovnu Celery
    • Jako „podvozek“ pro backend/API slouží cloudová služba AWS Elasticache for Redis.
    • Backend/API běží v kontejnerech na AWS ECS – díky tomu lze tuto část systému jednoduše spravovat a škálovat.
  • Jako databázi jsme zvolili PostgreSQL, respektive AWS Aurora for PostgreSQL.
  • Pro webové aplikace jsme použili jako obvykle React.js.
  • Celá aplikace i média stojí na CDN AWS CloudFront.
  • Se scrapingem jsme si poradili pomocí knihovny Scrapy, kterou jsme modifikovali pro naše potřeby.
  • Celý systém běží v AWS Cloudu jako Cloud Native aplikace.

Seznam scraperů

Co v budoucnu?

Klient chce systém posouvat dál a rozšiřovat o nové funkce. Plánujeme další optimalizace jako například spouštění periodických a asynchronních úloh na serverless platformě AWS Lambda. Také se chceme věnovat problematice adblockerů.

Data o aplikaci

  • Aplikace ve špičce zvládá až 100 000 požadavků za minutu a až 80 milionů požadavků za den. To znamená asi 20 000 návštěvníků za minutu.
  • Předpokládáme, že do roka tato čísla vzrostou minimálně na dvojnásobek.
  • Scrapingem dat bylo během 6 měsíců od spuštění získáno přes 100 000 článků.
  • Systém po prvních 6 měsících využívá přes 60 publisherů.
  • 6 měsíců po spuštění nabízí systém přes 150 widgetů.
  • 2,5 miliardy načtení widgetů a 450 milionů impresí článků měsíčně.
  • Widgety Engerio jsou umístěné na nejnavštěvovanějších zpravodajských webech a dalších mediálních platformách na Slovensku (viz seznam na webu Engerio.sk).

Reporty widgetů

Náhled aplikace