Tento víkend jsem se zúčastnil Rockaway AWS Hackathonu, jehož tématem byly technologie Amazon Web Services. Část z nich u nás ve firmě používáme pro provoz ABRA FlexiBee, ale chtěl jsem se podívat i na ty další. Jsem od nátury megaloman, a tak mne zajímaly ty, které umožní škálovat provoz mých služeb opravdu ve velkém.
Hackathon byl tvořen přednáškovým blokem a především programováním zvolené úlohy v malém týmu za 30 hodin. Abychom si mohli technologie skutečně osahat, organizátoři měli připraveny kredity v hodnotě cca 8 000 dolarů (cca 200 000 Kč), což je na 24hodinovou akci docela dost. Pro srovnání stejnou částku utratíme za cloud FlexiBee za půl roku. Tak jsem si řekl, že budu dělat tak škálovatelnou a masivní aplikaci, která tyto peníze vyčerpá do mrtě.
Z přednášek mi v paměti zůstala především ta od Štěpána Bechynského o AWS Lambda. Jedná se o malé kousky programu, které nahrajete do AWS a které lze snadno pouštět. Mohou to být i docela velké programy, ale jejich běh se musí dokončit ve zvoleném časovém limitu (obvykle od 5 vteřin do maximálně 5 minut). Vy napíšete jen kus kódu a vše ostatní zajistí Amazon.
Následovala prezentace nápadů a jejich rozdělení. Všichni se seběhli a měli jasno v tom, co budou dělat. Dopředu jsem se na hackathon moc nepřipravoval, a tak jsem neměl sestavený ani tým a ani nápad. Vše jsem doháněl až na místě. Díky tomu jsem se stal součástí populárního týmu “Zoufalců”. Tedy těch, co na sebe zbyli a kteří nevěděli, co budou dělat.
Chvíli jsme uvažovali o tom, že provedeme analýzu transparentních účtů s prostřednictvím WebAPI od České Spořitelny. Ale nakonec jsme zvolili nápad jednoho z organizátorů (moje žena zpětně řekla, že to byl chytrý krok).
Naše aplikace
Rozhodli jsme se, že uděláme jednoduchou aplikaci, která zjistí počet sdílení webové adresy (URL) na sociálních sítích (Facebook, Twitter, Google+ a LinkedIn). Každý uživatel zadá adresu a služba zjistí počet sdílení. Následně se každých 5 minut provede zjištění aktuálního stavu, což se ukládá a pro uživatele se vytváří historie. Uživateli ukazujeme graf vývoje v čase.
Výsledek je vidět na tomto videu a screenshoty na konci stránky:
Poznámka: V tomto videu je graf fiktivní, protože jsme jej dokončili těsně před prezentacemi a hotové video už bychom nestačili předělat.
V našem týmu jsme byli tři: mladý talentovaný grafik Marek Dlugoš, programátor Lukáš Kříž a já. Se skromností sobě vlastní jsem se ujal vedení týmu. Marek dal naší aplikaci to nejdůležitější, a to pěkný design. S Lukášem jsme vše naprogramovali.
Aplikaci jsme stavěli tak, že se jednalo o sadu úloh AWS Lambda v node.js, které byly volány pomocí AWS API Gateway. Jednotlivé úlohy jsou volány z různých serverů a IP adres, což nás zbavilo starostí s limity na množství volání API služeb sociálních sítí.
Nejdříve jsme napsali základ aplikace a pak začali řešit její schopnost škálovat. Nechali jsme kontrolovat 18 000 různých adres a zkoušeli zatížení. Samozřejmě neúspěšně. Problém byl právě maximální časový limit spouštěné aplikace. Načetli jsme odkazy ke zpracování z databáze a začali rozdělovat úkoly. To ale trvalo dlouho. Vyzkoušeli jsme spoustu slepých uliček, až jsme skončili u načtení všech adres, jejich rozdělení po stovkách, odeslání další službě, která zajistila spuštění podúloh s kontrolou jednotlivých adres. Během cca 20 vteřin jsme byli schopni otestovat desítky tisíc adres najednou.
Celkem jsme provedli během dvou hodin milion kontrol. To znamená, že jsme provedli milion požadavků na Facebook, milion na Twitter, milion na LinkedIn a milion na Google+.
Přišla mi hrozně zajímavá ta změna myšlení, kdy místo počítání hodinu jedním počítačem rozdám úlohu deseti tisícům počítačů a výsledek mám za 10 vteřin. Na rozdíl od reality v AWS funguje myšlenka, že 9 žen odnosí dítě za měsíc. Když jsme se v průběhu realizace bavili s organizátory o naší aplikaci, zdvořile nám naznačovali, že nemáme sami spotřebovat veškerý připravený kredit. Asi nejsme chápaví.
Pro větší škálování se nakonec ukázal omezující výkon SQL databáze, kterou jsme použili na ukládání výsledků. Každá úloha se totiž na ni obracela přímo a musela tak vyřídit obrovské množství dotazů najednou. O provoz databáze se staral pouze jeden server. Sice velmi výkonný, ale pro obsluhu provozu z tisíců serverů to prostě nemohlo stačit. Příště bychom nenechali koncové úlohy komunikovat přímo s databází, ale pouze vrátit načtená data rodiči, který data souhrně uloží. Po úpravě bychom dokázali zpracovat za stejnou dobu tisícinásobek úloh.
Jak jsme utráceli cizí peníze
Když naše aplikace konečně začala dělat to co má, tak začala provádět stovky tisíc operací. Představoval jsem si, jak přidělený kredit mizí jako pára nad hrncem a jak budou všichni ostatní namydlení, že jejich aplikace nebude mít na čem běžet. Už jsem náš tým viděl jako vítěze o největší útratu. Tak jsem to šel zkontrolovat. Seděl jsem a škodolibě jsem se z toho radoval. Pak mě ale napadla krutá myšlenka, zda vůbec naše služba je napojena na kredit organizátorů. Chvilka napětí. Nebyla! Jak to, vždyť tam je moje vlastní platební karta! Polil mně studený pot. Rychle jsem běžel za organizátory napojit naši aplikaci na jejich účet.
Šel jsem zkontrolovat, kolik mně ta legrace stála. V duchu jsem se připravoval na osobní bankrot. Naštěstí jsem téměř nepřekročil kredit, který nabízí AWS vývojářům zdarma a stálo mne to jen 6 dolarů.
Prezentace
Na prezentace jsem byl už strašně unavený a nevyspalý. Když se mě organizátoři nečekaně zeptali, co jsme vlastně dělali, nedokázal jsem říct ani slovo. To se mi moc často nestává.
A jak jsme dopadli?
Byli jsme druzí první. Organizátoři dávali velký důraz na to, že nejsme druzí, ale že jsou dva první. Jedny označili za více první, protože měli pouze jednu hlavní výhru. My jsme dostali basu piv a tu si odnesl domů Marek. Psal, že většinu rozdal ještě v metru, protože byla moc těžká.
Osobně považuji za vítěze celé akce Marka, protože dodal design oběma vítězným týmům a možná si tam rovnou domluvil i novou práci. Na jeho příběhu jsme postavili i obhajobu celé aplikace.
Chci poděkovat organizátorům za povedenou akci. A pokud vás akce zaujala, můžete se jí zúčastnit ještě i v Brně a Ostravě.
Zdrojáky jsou přístupné na GitHub. Kvůli nedostatku času jsou dost nahackované a nesmíte z nich nic usuzovat.