Architektura flexideo serveru

Svým konceptem se jedná o tzv. superserver. Tedy server, který v sobě obsahuje jeden nebo více serverů. Těmto jednotlivým serverům se říká instance. Každá instance je zcela samostatnou flexideo aplikací. Instance na sobě nejsou nijak závislé a každá může řešit zcela jinou problematiku.

Datové struktury na globální úrovni, tedy na úrovni superserveru, obsahují v zásadě pouze informace o podkladovém systému (velikost paměti, počet jader, tick freq, ...) a především seznam instancí. Seznam instancí se načítá při spuštění systému a je základem pro vytvoření seznamu implementovaných služeb. Služby jsou následně, jak odpovídá superserveru, provozovány jako větší množství služeb integrovaných v jednom procesu (in-process server). Každá instance si vytváří dvě služby, obě v sobě nesou jméno instance, kdy jedna je vlastní implementací instance a druhá je implementací mailové synchronizace. Mailová synchronizace není pro vlastní chod instance nutná. V dalších částech se již budeme věnovat vnitřní struktuře jednotlivé instance.


Základní struktura instance

Vlastní start instance se zahájí spuštěním hlavního vlákna instance. Toto vlákno zůstane běžet po celou dobu běhu instance a bude provádět veškeré operace na pozadí – zejména údržbu. Je-li instance spuštěna jako služba, je toto vlákno zároveň hlavním vláknem služby, tedy vláknem zodpovědným za reakci na příkazy předávané službě. Bezprostředně po svém spuštění vytvoří hlavní vlákno instance vlastní objekt instance (zatím prázdný) a tento zaregistruje do superserveru. Následně zahájí načítání „obsahu“ instance.

Nejobecnějším základem každé instance, který se vytváří ještě dříve, než je vůbec známa struktura je konfigurace. Tato konfigurace je obsažena v konfiguračním souboru instance a určuje všechny parametry nutné, jak pro načtení struktury (adresářové cesty), tak pro samotný běh (přístup k databázi, IP adresy pro webový server, ...) instance. Po načtení a kontrole konfiguračního souboru se zaregistrují další součásti instanční úrovně, zejména webový server (přesněji popsáno v kapitole níže), systémový log, přístupy k databázi a mnoho dalších.

Po této základní inicializaci se zahájí načítání DAD. DAD je základním popisem struktury konkrétní instance. Obsahuje databázovou strukturu, popis vazeb mezi daty, soupis užívaných rolí a jejich oprávnění k přístupu k různým datům. Obsahuje rovněž definice zvláštních vlastností, které mohou být přidělovány jednotlivým součástem a to jak na databázové, tak na aplikační úrovni. Během načítání je kontrolována konzistence datových struktur a po načtení je zkontrolována konzistence vzájemných vazeb uvnitř DAD. Proběhne-li tato kontrola správně a DAD je vyhodnoceno jako bezchybné, přistoupí se ke kontrole databáze.

V prvním kroku je načtena kompletní struktura stávající databáze, včetně programových součástí (procedury, funkce) a dalších objektů. Tato struktura databáze je porovnána s načteným DAD. Jsou-li shodné, přistoupí se k dalšímu kroku načítání flexidea. Pokud shodné nejsou, služba se spustí jako „pozastavená“ a zahájí se aktualizace databáze. Pokud by databáze vůbec neexistovala, vytvoří se databáze nová. Pokud se aktualizace databáze podaří, dostane se databáze do souladu se strukturou načteného DAD a pokračuje se k dalšímu kroku.

Dalším krokem je načtení databázových dat nutným pro chod instance. Mezi ty patří zejména informace o uživatelských účtech, dále cesty k úložištím přikládaných souborů, statistické informace o chodu instance a mnoho dalších (MIME typy, virtuální složky webového sídla, úlohy plánovače úloh, …).

V dalším kroku si instance zaregistruje do plánovače úloh několik systémových úloh (aktualizaci statistik, aktualizaci klíčů, …), ověří si platnost cest k úložištím souborů a načte klíčové soubory webového sídla. Nyní je flexideo instance připravena k použití a služba přejde do stavu „spuštěno“. Proběhla-li správně i inicializace webového serveru, je instance připravena obsluhovat klienty.

Instance v sobě tedy v obecné rovině obsahuje zejména svou datovou strukturu, dále pak svoji konfiguraci, registrace do globálních součástí, zejména webového serveru a obecně platné objekty jako systémový log, či úložiště přikládaných souborů. Nad rámec těchto objektů je kontejnerem pro ukládání dat specifických pro konkrétní operace. Zejména cache využívané při práci s dokumenty, předkompilovaných akcí, předzpracovaných XSLT šablon, OAuth ticketů a dalších.


Cache

Instance sice obsahuje popis struktury jednotlivých dokumentů, ale konkrétní dokumenty jsou zpracovávány prostřednictvím cache. Je-li potřeba pracovat s nějakým dokumentem, ať jej zobrazit, či měnit/ukládat, je nejprve načten/vytvořen v cache. Při načítání dokumentu z databáze je v cache vytvořena konkrétní instance konkrétního dokumentu včetně všech jeho návazností. Je-li tedy načítán dokument, na který je navázán další dokument je tento další dokument načten společně s ním, takto se pokračuje dále, jsou-li návaznosti složitější. Tento i další návazné dokumenty zůstávají v cache i po provedení operace nad dokumentem (změna, zobrazení). Je-li v budoucnu načten další dokument, který v sobě obsahuje návaznost na strukturu již načtenou v cache, je tento nově načítaný dokument začleněn do stávající struktury. Tento přístup umožňuje maximalizovat efektivitu cache a minimalizovat náklady na načítání dalších struktur. Je tak možné docílit stavu, kdy celá struktura databáze včetně všech vazeb bude připravena v paměti a bude tam právě jednou. Cache tedy neprovádí kopírování dat, ale naopak vždy pracuje „na místě“.

Jelikož množství dokumentů v databázi může být značné, tak k výše uvedené situaci nikdy nedojde a cache je průběžně pročišťována. Děje se tak tím způsobem, že jsou z dokumentové struktury postupně vytrhávány uzavřené celky tak, aby v cache zůstávaly „listy“, na které je nejvíce vazeb z jiných dokumentů.

Do cache se rovněž ukládají provedené přímé SQL dotazy, které tak při opakovaném použití nemusí být znovu načítány z databáze. Mezi oběma výše uvedenými cache je zajištěna konzistence, takže změna dokumentu nemůže vést k tomu, že by SQL dotaz vrátil chybná data.

Aby byla zajištěna efektivita cache, jsou počítány statistiky (viz dále) efektivity a s jejich pomocí a přihlédnutím k volným systémovým prostředkům, je rozhodováno, kdy a jaká data z cache uvolňovat.


Rozhraní pro práci s daty

S daty obsaženými v instanci se nikdy nepracuje přímo, naopak se k nim vždy přistupuje prostřednictvím vrstev níže, především cache. Tento přístup umožňuje efektivně využívat operační paměť a především omezit načítání dat z databáze. Níže popsané součásti přistupují k datům a provádějí jejich zpracování a to, jak na základě přímých požadavků uživatelů (Webový server), tak na základě časového plánování (Plánovač úloh). Zbylé stojí někde mezi.


Webový server

Ačkoli fakticky je webový server objektem globální úrovně, tedy běží až nad jednotlivými instancemi, jednotlivé instance se do něj registrují. Na globální úrovni, pokud se mu to podaří, začne webový server poslouchat na wildcard rozhraní (0.0.0.0) na portech http (80) a https (443 - pro ten si vytvoří self signed certifikát). Jakmile se zaregistruje první instance, přestane webový server poslouchat na výše uvedených rozhraních a poslouchá na rozhraní definovaném parametry instance (to může a nemusí být stejné). Každá další instance, která se zaregistruje může poslouchat na stejném rozhraní nebo přidat další. Je-li několik instancí zaregistrovaných na stejném rozhraní, je o adresátovi rozhodnuto na základě hostname (http) nebo na základě SNI (https), jak je definováno v HTTP/1.1 a jeho rozšířeních. Z uvedeného vyplývá, že webový server splňuje specifikace HTTP/1.1.

Certifikáty pro použití webovým serverem se definují v konfiguraci instance, mohou být sdíleny mezi instancemi za předpokladu, že jsou jednotlivé instance ve vztahu k certifikátu nakonfigurovány shodně. To zejména znamená, že mají shodně nastaveny parametry ohledně vytváření certifikátů. Vytváření certifikátů je akcí globálního webového serveru. Může je vytvářet jako self-signed nebo si prostřednictvím ACME žádat o jejich vystavení. Za výchozí zdroj certifikátů je nastaven poskytovatel Let’s encrypt. Aplikace umožňuje používat a vytvářet RSA certifikáty s běžnými délkami klíčů a ECDSA certifikáty opět s obvyklými délkami klíčů. Pro rozšíření bezpečnosti si aplikace na globální úrovni vytváří vlastní DH klíče. Ty jsou uloženy v adresáři se spustitelným souborem a lze vynutit obnovu jejich výmazem.

Registrace webového serveru v každé instanci obsahuje cache, která urychluje poskytování často žádaných dat. Do této cache se ukládají jednak statické soubory, ale také předkompilované FSP stránky. Použití cache lze parametrizovat v konfiguračním souboru, tak aby vyhovovala konkrétní instanci. Nastavit je možné, jak maximální velikost souboru, na který se bude cache aplikovat, tak celkovou velikost webové cache, ale také to, zda se bude kontrolovat aktuálnost souboru v cache oproti souboru ve filesystému. Webový server umožňuje přenášená data komprimovat algoritmem deflate.

FSP stránky jsou speciální, serverem interpretované, stránky (podobně jako PHP, či ASP), které mohou rozšiřovat možnosti aplikace. Tyto stránky jsou před vlastním provedení zkompilovány a uloženy do cache, takže každé další spuštění je výrazně rychlejší. FSP stránky mají příponu *.fsp, jsou napsány v proprietárním jazyce (FSP) a umožňují pracovat s daty flexideo serveru.

Že je webový server základní branou pro práci s instancemi asi nemá smysl popisovat. Kromě předávání statický a dynamických stránek, zprostředkovává přístup k uloženým souborům a rovněž umožňuje streamovat mediální obsah prostřednictvím integrovaného mediálního serveru, či exportovat rozhraní pro webové služby, které jsou pak prováděny prostřednictvím akcí (viz dále).


Akce

Jedná se o vysoce konfigurovatelné funkční celky, které umožňují provádět operace nad daty serveru. Je možné je volat jednak z uživatelského rozhraní, pak mohou být volány buď nad konkrétními záznamy, nebo nad celou množinou dat. Nebo je možné je volat jako naplánované úlohy, kdy mohou, na základě časového plánu, provádět operace nad množinou dat (odesílat maily, dotazovat se služeb třetích stran, upravovat dokumenty, …). V neposlední řadě je možné je volat jako webové služby. V těchto případech umožňují celou řadu vstupních a výstupních formátů (XML, JSON, plain text, kódovaná binárni data, ...).

Akce jsou serverem zpracovávány jako předpis po sobě jdoucích kroků s možností větvení. Tyto kroky jsou před vlastním provedením zkompilovány a uloženy do operační paměti. Jelikož nedílnou součástí akcí jsou XSL transformace, jsou i použité XSLT šablony přeloženy a uloženy do paměti pro další použití. Registr XSLT šablon je pro každou instanci globální, platí tedy, že každá šablona je uložena právě jednou a to i v případě, kdy je využívána vícero akcemi. Oba tyto postupy zvyšují míru efektivity a to zejména u opakovaně volaných akcí.


Plánovač úloh

Nabízí možnost provádět různé operace na základě časových parametrů. Umožňuje nastavit běžné periodické spouštění (každých x sekund/minut/hodin/dnů/…), ale také kombinované spouštění na základě dnů v týdnu. Podporuje opakování volání při selhání operace, izolaci volání, kdy je zajištěno, že úloha poběží právě jednou v jednu chvíli a další rozšířené funkce.

Nejčastější prováděnou úlohou plánovače je bezesporu spouštění akcí. Využíván je ale také k importu a exportu dat, volání běžných požadavků a celé řadě administrátorských úloh. Mezi nejčastější administrátorské úlohy patři optimalizace, či výmazy nepotřebných souborů.


Synchronizace pošty

Synchronizace pošty je samostatnou službou každé instance. Umožňuje komunikovat se SMTP a IMAP4 servery a odesílat, či synchronizovat s poštovní zprávy. Odesílací (SMTP) součást je klasickým SMTP klientem, který na základě předdefinovaného XML vstupu umožňuje tento vstup, včetně příloh, odeslat jako klasický email. Synchronizační (IMPA4) součást umožňuje sledovat napojenou poštovní schránku a na základě každé příchozí, změněné nebo smazané zprávy spustit akci, které jsou předány o této zprávě informace. Akce následně může provést odpovídající činnosti, dle obsahu předané zprávy.


Obecné podpůrné součásti

Jedná se o součásti, které poskytují služby vícero různým součástem vyšších vrstev. Sami o sobě jsou sice funkčním celkem, ale jejich činností je poskytovat služby ostatním.


Databáze

Jedná se o obecné rozhraní pro práci s databází. Umožňuje jakékoli součásti volat databázové dotazy, či uložené procedury. Při startu systému rovněž umožňuje zmapovat si stávající databázi, porovnat ji s aktuálním stavem DAD a databázi následně aktualizovat. Celá aplikace je navržena tak, aby všude, kde je to možné využívala uložené procedury. Tyto jednoúčelové procedury pomáhají zvyšovat výkon aplikace.


Služby

Ačkoli aplikace běží jako služba a mohlo by se zdát, že by implementace služby měla být základní součástí, je z našeho pohledu chápána, jako součást podpůrná. Implementace služby umožňuje zakládat, mazat a řídit služby podle toho, kolik jednotlivých instancí v superserveru běží. Z důvodu omezení na straně OS Windows, kdy OS chce znát jednotlivé služby implementované superserverem již v okamžiku spuštění, není možné přidávat instance za běhu. Toto omezení sice není zásadní, ale MS by na tom měl zapracovat.


Souborové úložiště

Jednou z podpůrných součástí aplikace je souborové úložiště (úložiště příloh). Tato podpůrná součást zajišťuje, aby byl každý soubor v instanci právě jednou. Detekuje tedy shodné soubory a následně zajistí, aby bylo instancí používán pouze jeden a druhý (duplicitní) odebere. Dále také umožňuje organizovat soubory do více úložišť podle priority a zajišťovat, aby často užívané soubory byly uloženy v přístupnějším (rychlejším) úložišti než ty méně používané.


Webový klient

Pro komunikaci s okolním světem využívá aplikace svého vlastního http(s) klienta. Tento klient slouží ke komunikaci s webovými službami třetích stran. Při testech dosahoval násobně vyšší rychlosti otevření spojení než cURL. Tuto svou schopnost podporuje propracovaným cacheováním spojení, kdy po omezenou dobu udržuje otevřený socket, následně udržuje připravený socket pro opakované spojení, kdy bere v úvahu dříve zjištěné redirecty. Součástí webového klienta je rovněž DNS resolver, který udržuje cache dříve provedených resolve.

Výsledkem této kombinace je webový klient, který významně urychluje komunikaci s webovými servery třetích stran a to zejména v situacích, kdy dochází k opakovaným požadavkům na tentýž server. Tedy v situacích, které jsou běžné při datových výměnách, kdy si napřed stahujeme seznam věcí ke zpracování a následně je zpracováváme. Webový klient je rovněž interně využíván pro získávání OAuth2 ticketů.


Statistiky

Statistiky uchovávají mnoho informací o běhu všech součástí aplikace, jako jsou počty zpracovaných požadavků, objemy přenesených dat, počty přihlášených uživatelů a mnoho dalších. Mohou být používány k měření vytížení instance, ale především slouží k nastavování běhových parametrů konkrétní instance. Pro tyto účely se používají hodnoty z posledních 5 týdnů kumulované po jedné hodině. Instance je tak schopna měřit efektivitu používání cache a zajistit, že se v ní bude uchovávat právě to, co má největší pravděpodobnost opakovaného použití. Tato schopnost, společně s informacemi o spotřebě systémových prostředků umožňuje aplikaci se přizpůsobovat hardwarovým parametrům stroje i způsobu používání konkrétní instance uživateli.


Nastavení konceptu, ostatní

V aplikaci je začleněna řada dalších podpůrných systémů. K těm nejpoužívanějším patří v databázi uložená nastavení, která využívá webové rozhraní aplikace pro svou činnost. Dalším hojně využívaným podpůrným mechanismem je systém konceptů, kdy si klientská strana ukládá na server rozpracované dokumenty. Uživatel tak neztratí rozdělanou práci například v případě výpadku internetového připojení. Mezi další podpůrné funkce patří nástroj na tvorbu PDF, propracované kryptografické rozhraní, kompresor a dekompresor ZIP souborů, generátor UUID a mnoho dalších.


Architektura flexideo serveruKomunikaceObecná syntaxe požadavkůPřihlášení a odhlášení uživateleZápis více požadavků v jedné obálceNastavení plánovače úloh (validity, repeat aj.)Registrované požadavkyStatistikyVerze pro oblasti (hodnoty) intranet a comexNapojení vlastních aplikacíChybová hlášení v odpovědích