Vybojovali jsme 2. místo na WebTop100 za projekt pro Armádu ČR
Jsme hrdí na to, že kvalitu tak významného řešení ocenila porota největší soutěže digitálních projektů v Česku a na Slovensku. Pojďme si jej představit.
Moderní databáze evitaDB pro e-shopy naplňuje očekávání našich vývojářů. Podívejte se na první výsledky z nasazení a nové funkce našeho vlastního produktu.
EvitaDB je moderní databáze, která e-shopům přinese zcela novou úroveň rychlosti i u těch nejnáročnějších projektů (statisíce produktů, miliony cen). Tato noSQL paměťová databáze slouží k ukládání a prohledávání všech dat pro uživatelskou část webu – umožňuje provádět tisíce komplexních dotazů za sekundu.
Minulý rok jsme vám ji představili v našem článku a nyní vás seznámíme s výsledky prvních nasazení na projektech a novými funkcemi. Tento článek jsme pojali technicky a bude zajímavý hlavně pro vývojáře a technologické nadšence. Autorem je náš seniorní Java developer Jan Novotný.
Na prvních nasazeních se potvrzují výsledky našich původních výkonnostních testů – evitaDB se v produkčním nasazení chová stabilně, predikovatelně a její odezvy nepřesahují ve špičkách při 95% percentilu 50 ms, s obvyklou odezvou spíše kolem 20 ms.
Klíčovým faktorem je přímá zpětná vazba z produkčního nasazení, na jejímž základě můžeme i nadále vylepšovat evitaDB jak z pohledu výkonnosti, tak z pohledu funkčnosti. V nejbližších měsících na této platformě spustíme celou řadu dalších projektů, které jsou již ve fázi dokončování.
Vývoj evityDB jde stále kupředu a každá nová verze do ní přináší nové funkce a vylepšení těch stávajících. Aktualizujeme zhruba jednou měsíčně a toto tempo hodláme udržet. Je pro nás důležité, aby naši vývojáři jasně viděli, že řešení neustále rozvíjíme a tím zjednodušujeme práci na jejich projektech.
Databáze automaticky aktualizuje uložená data, takže aktualizace nové verze představuje na našich současných projektech pouze několikasekundový výpadek.
Nedávno jsme vyměnili webový server, který je integrován do “standalone” distribuce evitaDB. Původní implementaci postavenou na americkém Undertow serveru jsme nahradili korejským serverem Armeria (o tomto kroku se můžete obšírněji dočíst v samostatném článku na blogu). Jedním z hlavních důvodů bylo sjednocení všech API na knihovně Netty, čímž došlo k úspoře zdrojů serveru.
Díky tomu dokážeme provozovat všechna API (gRPC, REST i GraphQL) na společném portu a zároveň na něm provozovat jak HTTPS, tak i HTTP protokol. Zároveň nám Armeria zpřístupňuje použití gRPC/web protokolu, který mohou využít jednak externí klienti a jednak jej používá i naše nová verze evitaLab webového klienta.
Za posledních šest měsíců jsme dokončili řadu zajímavých funkcí, které jsou již dostupné prostřednictvím API a postupně je integrujeme i do uživatelského rozhraní evitaLab. Po úvodním naplnění daty přechází databáze do tzv. “transakčního režimu”, který poskytuje snapshot izolaci při práci jednotlivých klientů. Dokud není otevřená transakce potvrzena (commit), je možné ji zrušit (rollback) aniž by došlo k ovlivnění obsahu databáze.
Zároveň jsou všechny změny v transakci privátní pro klienta, který ji zahájil. Změny jsou ostatními klienty viditelné až po potvrzení transakce a jsou vidět buď všechny najednou nebo ani jedna z nich (tzv. vlastnost atomicity). Pro zpracování transakcí používá evitaDB v databázovém světě zavedený mechanismus WAL (write ahead log).
Díky transakčnímu režimu a přírůstkové interní reprezentaci dat umí v současné době evitaDB i tzv. point-in-time recovery. Je tedy možné kdykoliv vytvořit zálohu databáze pro libovolný okamžik v minulosti, který je stále zachycen ve WAL souborech. Období návratu do minulosti je omezeno pouze místem na disku, který je vyhrazen WAL a datovým souborům.
Tato vlastnost umožňuje i dalším klientům analyzovat data v minulosti, takže pro evitaLab chystáme nové funkce, které umožní mimo jiné procházet změny v databázi, zobrazit si historii změn konkrétní entity či jejího údaje, jako je atribut nebo ceny.
Brzy budeme nad WAL stavět tzv. change-data-capture nadstavbu, která umožní propagaci změn v clusteru nebo reakci na změny v databázi na úrovni klientů (výmaz keše, aktualizace lokálních dat či reakce na změny v datech v reálném čase).
Další novinkou je funkce řazení položek podle výše slevy. Ta umožňuje zobrazit nejprve produkty s největší slevou oproti běžné prodejní ceně. V oblasti B2B řešení, variantních produktů a podobných specialit e-commerce světa, je výpočet slevy náročná úloha – především proto, že cena produktu může být pro každého přihlášeného zákazníka odlišná. Při řazení podle výše slevy musí databáze tento proces absolvovat dvakrát – jednou pro výpočet původní prodejní ceny a jednou pro výpočet ceny po slevě, aby bylo možné výstupní seznam produktů správně seřadit.
Novinkou jsou také oboustranné reference mezi entitami. Vazby mezi entitami v evitaDB jsou převážně jednosměrné – např. produkt patří do kategorie a je tudíž možné jej dotazovat pouze po ose této relace.
V tomto případě tedy: Najdi všechny produkty, které se váží na konkrétní kategorie. Díky grafovému mechanismu načítání odkazovaných entit bylo k takovému produktu jednoduše možné načíst i data kategorie, na kterou se produkt odkazuje. Existuje však celá řada scénářů, kdy nemožnost putovat po vazbách z obou stran komplikuje implementační práce.
Jednosměrné relace jsou stále výchozí volbou pro vztahy mezi entitami v evitaDB, ale volitelně je možné některé z nich označit jako oboustranné. Ačkoliv takové vazby konzumují více paměťového prostoru, umožňují díky dedikovaným indexům velmi rychlé vyhodnocování na úrovni bitmapových operací. Z pohledu vývojáře je pak práce s oboustrannými vazbami transparentní – ať už založí relaci z jakékoliv strany, databáze automaticky založí odpovídající zrcadlovou vazbu. Totéž platí pro rušení vazeb či nastavování hodnot atributů, které na dané vazbě leží.
Webový klient evitaLab už nyní umožňuje vytvářet nové katalogy, přejmenovávat je či mazat. Zpřístupňuje interaktivní zálohování a obnovu dat (to je samozřejmě možné provést i přímo přes API). Velké změny však doznalo jeho vnitřní fungování, které nám umožňuje mnohem rychlejší adaptaci nových funkcí. Na základě zpětné vazby jsme zásadně zjednodušili jeho konfiguraci. V současné době tak stačí znalost jednoho jediného URL pro zprovoznění nového spojení na evitaDB instanci z rozhraní evitaLab.
Stále existuje řada oblastí, které by náš tým chtěl pokrýt dříve, než prohlásí evitaDB implementaci za dokončenou (myšleno trochu s nadsázkou, produkt budeme neustále vylepšovat).
Možnosti databáze stále posouváme kupředu a často i směrem, o kterém jsme dříve ani neuvažovali. Ukazuje se, že cesta rozvoje není přímočará, ale různě se klikatí tak, jak získáváme nové zkušenosti a důležitou zpětnou vazbu z implementace na našich projektech.
Některé úkoly jsou díky tomu prioritizované více, za cenu odsouvání plánované funkcionality do příštího roku (např. aktualizace schématu, fulltextové vyhledávání, autorizace atp.). U softwarových komponent tohoto typu se však určitě vyplatí nespěchat a nechat některé myšlenky a rozhodnutí uzrát. Kvalifikované rozhodnutí se v budoucnosti mnohonásobně vrátí.
Důležité je, že klíčové předpoklady, které na databázi byly kladeny – tedy požadavky na latenci a propustnost v kombinaci se stabilitou řešení, podle dosavadních zkušeností databáze splňuje.