30. Jan 2023Backend & DevOps

Ako budujeme náš Backend tech stack na overených, no moderných technológiách

V GoodRequest je pre nás dôležité spojenie kvality, stability a moderných postupov a na tom staviame aj v našom technologickom stacku. Za roky našich skúseností na backende sme si vyskúšali viacero technológií a preto vieme, aký je ich výber dôležitý.

Matej DugovičBackend Developer

Za každým novým kúskom sú najskôr hodiny analýz a diskusií. Konkrétnu technológiu si síce nevyberáte na celý život, ale nikto v tíme nechce po pár mesiacoch zistiť, že nám nie celkom vyhovuje a musíme sa znovu popozerať po niečom lepšom. 

 

Každá technológia alebo novinka musí prejsť prísnym sitom, kde si najskôr povieme, čo nám oproti súčasnej situácii vylepší, aké má limity, ako je podporovaná a aké budú náklady ju začleniť do nášho stacku. 

 

Ak prežije porovnanie s inými dostupnými alternatívami, čaká ju ešte kritika od členov tímu.

 

Jadro našich aplikácií už roky tvorí overený Node.js (Express.js framework) server či pamäťová vrstva v Redise. Samozrejmosťou je TypeScript, svet bez neho si už nevieme predstaviť.

 

Snažíme sa, aby sme mali na každú oblasť, či už ide o architektúru, databázy a bezpečnosť alebo optimalizácie, v našom tíme odborníka, ktorý sa v téme neustále vzdeláva.

Databázy

Na ukladanie dát najčastejšie používame relačné databázy, a to konkrétne PostgreSQL. Keď si to situácia alebo klient vyžaduje, máme skúsenosti napríklad aj s MySQL alebo MariaDB.

 

PostgreSQL nám vyhovuje najviac svojimi funkciami a rýchlosťou, z väčších projektov máme už skúsenosti, ako z neho pri správnom nastavení konfigurácie, modelov a indexov dostať čo najviac.

 

Samozrejme, nie vždy to stačí, a vtedy si pomáhame pamäťovým úložiskom v Redise, ktorý je ideálny krátkodobé ukladanie dát.

 

Keď ide o rýchle vyhľadávanie, pomôžeme si s ElasticSearchom, do ktorého transformujeme dáta z hlavných databáz napríklad pomocou pluginu PGSync. V špecifických prípadoch zvažujeme, či na niektorú časť aplikácie nie je vhodnejšia aj NoSQL databáza ako MongoDB.

 

Bezpečnosť

Hlavný technologický stack, ale aj používané knižnice pravidelne aktualizujeme nielen kvôli novým funkciám, ale hlavne pre opravy chýb a bezpečnostné záplaty. Na nové verzie nás upozorňuje Renovate bot, ktorý automaticky vytvára popisné pull requesty priamo do kódu. Každú zmenu ale vždy ešte skontrolujeme.

 

Na bezpečnosť kódu je dôležité myslieť už pri vývoji. Užitočná pomôcka toho, čo sú najčastejšie zraniteľnosti, je rebríček OWASP Top 10.

 

K základným veciam, ktoré by nemali v žiadnom projekte chýbať patrí určite ošetrenie HTTP hlavičiek pomocou knižnice Helmet, na validáciu vstupov knižnicu Joi a pre ochranu pred SQL injection používame ORM knižnicu, ktorý sa postará aj o ošetrenie dynamicky vkladaných parametrov do surových SQL výpočtov.

 

Vývoj

Na kvalitu kódu, ale aj niektoré bezpečnostné riziká nám pomáha dohliadať Eslint.

Na autentifikáciu používateľov využívame JWT tokeny, ktoré využívame či už so štandardom OAuth, LDAP, identity providermi alebo napríklad aj pri prihlasovaní cez účty sociálnych sietí alebo Apple ID.

 

V prvom rade sa snažíme siahnuť najskôr po aktívnych a overených riešeniach, ktoré už majú vychytané muchy a sú odskúšané na viacerých produkčných projektoch, no niekedy nám ani tie nepostačujú alebo prídeme s výraznými vylepšeniami.

           

V rámci inovačnej platformy si vyvíjame vlastné nástroje, ktoré sú šité na mieru našim kvalitatívnym požiadavkám naprieč projektami - či už ide o optimalizáciu, implementáciu nových technológií, vlastné knižnice alebo vylepšenia tých, ktoré používame. 

 

Zmeny kontroluje okrem autora aj iný kolega v code review a ešte pred mergnutím musí nový kód úspešne prejsť testami v CI / CD. Dávame si záležať, aby každý náš projekt bol už od začiatku pokrytý unit a integračnými testami, ktoré zvyšujú kvalitu dodávaných produktov. V spolupráci s kolegami z frontendu tiež pripravujeme End to End testy.

 

Hotovú verziu aplikácie potom zabalíme do Docker kontajnera a nasadíme u nás na server alebo vďaka použitej technológií kontajnerizácie aj pohodlne na infraštruktúre klienta. Orchestráciu kontajnerova ich škálovanie potom riešime cez Kubernetes.

 

Služby tretích strán

Chyby v aplikáciách monitorujeme cez službu Sentry a pokročilejšie logy, správanie a výkon cez New Relic. Ak ide o citlivé dáta, tieto služby vieme integrovať aj na vlastnú infraštruktúru.

 

Máme tiež bohaté skúsenosti s integráciami na služby tretích strán, pri platbách máme skúsenosti s ôsmymi platobnými bránami, ako napríklad PayPal, 24Pay, SMS platby, mobilné platby prere Android a iOS.

 

Pre push notifikácie do appiek využívame Firebase. Pokiaľ potrebujeme manažovať pravidelné úlohy, používame "poradovník"úloh BullMQ a na zložitejší systém napríklad pri komunikácii medzi viacerými službami zasa RabbitMQ.

 

Pre niektoré projekty využívame aj AWS infraštruktúru – napríklad virtuálne servery v EC2, na ukladanie obrázkov a súborov zasa S3 alebo CloudWatch pre monitoring a ďalšie.

Matej DugovičBackend Developer