10x rýchlejšie requesty vďaka Go-čku

Rád skúšam nové veci, nové technológie aj jazyky. A ideálne vo väčšom, než len cez “hello world”. Keď sme na Crossuite začali riešiť problém s pomalou časťou aplikácie, diskutovali sme medzi dvoma riešeniami. Buď túto časť “roztiahnuť” na viac serverov alebo ju prepísať. A tak som sa chopil príležitosti vyskúšať nový jazyk a po analýze prepísal kód do GoLang. Keď som to spustil, spadla mi sánka. Doslova.

Zaujíma ma každý nový jazyk, obzvlášť, ak vychádza z C-čka. Na ňom som vyrastal a doteraz je to moja srdcovka. A aj keď Go-čko bolo inšpirované C/C++, v porovnaní s nimi je minimalistické a nevyžaduje toľko písania kódu. Podľa internetových zdrojov by malo byť teda rovnako rýchle, ale pri menšej “námahe”. Táto informácia bola mojou hlavnou motiváciou vyskúšať ho. Ďalším argumentom bolo napríklad to, že v Go-čku sú písané aplikácie ako Google Search, Docker, Kubernetes alebo Prometheus, ktorý používame na monitoring dát v Cloude. 

Okrem toho som sa dočítal aj to, že Go-čko má tzv. Goroutines, teda paralelné spúšťanie kódu. Pri veľkom množstve requestov je dôležité, aby jeden nečakal na druhý, a Go to má vyriešené už na úrovni jazyka, nie až operačného systému. Už iba naštartovanie “paralelného procesu” je teda rýchlejšie. To bolo niečo, s čím som sa dosiaľ nestretol, a opäť ma to podnecovalo k tomu Go-čko vyskúšať.

Analýza porovnaním

V rámci analýzy som si teda rovnakú funkciu napísal v troch jazykoch, čo aktuálne používame v bart-e – PHP, NodeJS a Python – a pridal som aj Go-čko. Nechal som kód spustiť stokrát a sledoval, ako rýchlo zbehol a koľko zdrojov (RAM a pod.) “zožral”. Výsledok ma milo prekvapil. Go sa ukázal ako najrýchlejší aj najefektívnejší jazyk. Prečo?

Pri PHP alebo Pythone ide o interpretované jazykypokyny sa konvertujú z toho, čo napíšeš do kódu stroja vždy pri spustení programu. Go-čko je tzv. kompilovaný jazyk – po uložení je potrebné kód previesť cez kompilátor do programovej verzie, ktorú je následne možné spustiť. Pri samotnom spúšťaní sa teda kompilácia preskakuje, vykonáva sa opäť až pri zmenách.

Výsledkom tohto procesu je omnoho rýchlejšia aplikácia. V našom prípade, na projekte Crossuite, sme mali pri rovnakej funkcionalite oproti Pythonu približne 10x rýchlejšie requesty a namiesto 500 MB nám RAM brala len 15 MB. 

Vyberať treba s rozumom

Prečo sa teda Go-čko nepoužíva všade? Lebo má aj svoje špecifiká:

  • Striktnosť – Go-čko je navrhnuté tak, že ak napríklad zahrnieš do kódu nejakú knižnicu alebo zadefinuješ premennú, ale nakoniec ich nepoužiješ, Go odmietne kód skompilovať. Rovnako neobsahuje veľa „moderných“ prvkov dostupných v iných jazykoch (generics, inheritance, exceptions, atď.). Nutí ťa teda písať čistejšie, štruktúrovanejšie, viac si veci plánovať.
  • Rozšírenosť – Na školách sa väčšinou učia “tradičné” jazyky a preto je ťažké nájsť programátorov, čo Go ovládajú. Je preto jednoduchšie písať projekty v PHP alebo NodeJS, v ktorých sa vedia nové posily vo firme rýchlejšie zorientovať.
  • Trvanie kompilácie – Pri robustných projektoch môže kompilácia trvať dlho. Ak ti fixnutie bugu trvá 3 minúty, no zmena sa prejaví až po pol hodinovej kompilácii, nie je to veľmi efektívne. Naštastie je tu Go kompilátor, ktorý podľa dostupných zdrojov čas kompilácie výrazne skracuje. Na veľkom projekte ho ale výskušaný ešte nemám.

Go-čko, ako aj iné kompilované jazyky, sa teda nehodí všade a jeho použitie si treba dobre premyslieť. Nám sa to však rozhodne oplatilo. Keďže ide o malú časť projektu, kompilácia trvá len asi 15 sekúnd, a túto stratu nám bohato vynahrádza rýchlosť requestov a šetrenie prostriedkov.

Išlo v podstate o malú zmenu, iniciatívu jedného člena tímu, ktorý si urobil analýzu a povedal: “Poďme to skúsiť!”. Dostal som zelenú a vyšlo to. Teraz všetci v tíme vedia, že GoLang je super a motivuje ich to naučiť sa ho tiež, aby sme v ňom mohli vyvíjať viac.

Máš toto všetko v malíčku? Potom sa pridaj do nášho tímu!