17. Jul 2023Backend

Jak budujeme náš backend tech stack na osvědčených, ale moderních technologiích

V GoodRequest je pro nás důležité spojení kvality, stability a moderních postupů. A na tom stavíme i v našem technologickém stacku. Za léta zkušeností v oblasti backendu jsme si vyzkoušeli řadu technologií, takže víme, jak důležitý jejich výběr je.

Matej DugovičBackend Developer

Za každým novým dílkem jsou nejdřív hodiny analýz a diskuzí. Danou technologii si sice nevybíráte na celý život, ale nikdo z týmu nechce po několika měsících zjistit, že nám tak úplně nevyhovuje a že je třeba se znovu poohlédnout po něčem jiném. 

 

Každá technologie nebo novinka musí projít přísným sítem, kde si nejdřív řekneme, v čem bude lepší než současný stav, jaké má limity, jak je podporovaná a jaké budou náklady na její začlenění do našeho stacku. 

 

Pokud obstojí ve srovnání s jinými dostupnými alternativami, čeká ji ještě kritika od členů týmu.

 

Jádro našich aplikací už roky tvoří osvědčený server Node.js (framework Express.js) nebo paměťová vrstva v RedisuTypeScript je samozřejmostí, svět bez něj si už nedokážeme představit.

 

Snažíme se, abychom v našem týmu měli na každou oblast, ať už jde o architekturu, databáze, bezpečnost nebo optimalizace, odborníka, který se v tématu neustále vzdělává.

Databáze

K ukládání dat nejčastěji používáme relační databáze, konkrétně PostgreSQL. Pokud si to situace nebo klient žádají, máme zkušenosti například i s MySQL nebo MariaDB.

 

PostgreSQL nám nejvíc vyhovuje svými funkcemi a rychlostí. Z větších projektů už máme zkušenosti, jak z něj díky správné konfiguraci, modelům a indexům dostat maximum.

 

To samozřejmě ne vždy stačí, a proto si případě vypomáháme paměťovým úložištěm Redis, které je ideální pro krátkodobé ukládání dat.

 

Pokud jde o rychlé vyhledávání, používáme ElasticSearch, do kterého transformujeme data z hlavních databází například pomocí pluginu PGSync. V konkrétních případech zvažujeme, zda není pro některou část aplikace vhodnější databáze NoSQL, jako např. MongoDB.

 

Bezpečnost

Hlavní technologický stack, ale i používané knihovny, pravidelně aktualizujeme, a to nejen kvůli novým funkcím, ale hlavně kvůli opravám chyb a bezpečnostním záplatám. Na nové verze nás upozorňuje bot Renovate, který automaticky vytváří popisné pull requesty přímo v kódu. Každou změnu ale vždy ještě zkontrolujeme.

 

Na bezpečnost kódu je důležité myslet už během vývoje. Užitečnou pomůckou v souvislosti s nejčastějšími zranitelnými místy je žebříček OWASP Top 10.

 

Mezi základní věci, které by neměly chybět v žádném projektu, určitě patří ošetření hlaviček HTTP pomocí knihovny Helmet, pro validaci vstupů knihovna Joi a pro ochranu proti SQL injection používáme knihovnu ORM, která se stará také o ošetření dynamicky vkládaných parametrů do surových výpočtů SQL.

Vývoj

Na kvalitu kódu, ale i na některá bezpečnostní rizika nám pomáhá dohlížet Eslint.

K ověřování uživatelů využíváme tokeny JWT, které používáme ať už se standardem OAuthLDAP, s poskytovateli identit nebo například i při přihlašování prostřednictvím účtů sociálních sítí nebo Apple ID.

 

V první řadě se snažíme sáhnout po aktivních a osvědčených řešeních, která již mají vychytané mouchy a která jsou odzkoušená na několika produkčních projektech, ale někdy ani to nestačí anebo přijdeme s výraznými vylepšeními.

           

V rámci inovační platformy si vyvíjíme vlastní nástroje, které jsou šité na míru našim kvalitativním požadavkům napříč projekty –⁠ ať už jde o optimalizaci, implementaci nových technologií, vlastní knihovny nebo vylepšení těch, které používáme. 

 

Změny kontroluje kromě autora také jiný kolega v rámci code review a nový kód musí ještě před sloučením projít testy v CI/CD. Dáváme si záležet, aby každý náš projekt byl už od začátku pokryt jednotkovými a integračními testy, které zvyšují kvalitu dodávaných produktů. Ve spolupráci s kolegy z frontendu připravujeme také end-to-end testy.

 

Hotovou verzi aplikace pak zabalíme do kontejneru Docker a nasadíme na náš server nebo díky použité technologii kontejnerizace také pohodlně na infrastrukturu klienta. O orchestraci a škálování kontejnerů se pak stará Kubernetes.

 

Služby třetích stran

Chyby v aplikacích monitorujeme prostřednictvím služby Sentry a pokročilejší logy, chování a výkon prostřednictvím služby New Relic. Pokud se jedná o citlivá data, umíme tyto služby integrovat i do vlastní infrastruktury.

 

Máme také bohaté zkušenosti s integrací služeb třetích stran, v oblasti plateb máme zkušenosti s osmi platebními branami, jako jsou PayPal, 24Pay, SMS platby a mobilní platby pro Android a iOS.

 

Pro push notifikace do appek používáme Firebase. Pokud potřebujeme spravovat běžné úlohy, používáme „frontu“ úloh BullMQ a pro složitější systémy, například při komunikaci mezi více službami, používáme zase RabbitMQ.

 

Pro některé projekty používáme také infrastrukturu AWS –⁠ například virtuální servery v EC2, pro ukládání obrazů a souborů zase S3 nebo CloudWatch pro monitorování a další.


 

Matej DugovičBackend Developer