BRS#
Serverová aplikace

Hlavní části

Zásadní částí serverové aplikace je modul pro uložení veškerých dat a manipulaci s nimi (tedy vlastní databázi i databázový stroj). Dále musí server zajišťovat komunikaci s připojenými klienty - přijímat požadavky, předávat je ke zpracování databázovému modulu a výsledky předávat zpět klientům. Server je určen k činnosti bez obsluhy, přesto obsahuje minimální správcovské rozhraní pro provedení zálohy apod. Strukturu znázorňuje obrázek na hlavní stránce.

Aplikace je přeložena jako jediný spustitelný modul BRS#_server.exe. K správnému běhu je třeba mít nainstalovaný .NET framework nebo běhové prostředí Mono. Další podmínkou je knihovna kontajnerů a kolekcí C5 (http://www.itu.dk/research/c5/). K programu je standardně dodávána přeložená verze knihovny, ale je možno si stáhnout zdrojové soubory z GitHubu (https://github.com/sestoft/C5/) a provést vlastní kompilaci. Tuto knihovnu jsem využil proto, že standardní kolekce v jazyce C# neumožňují některé užitečné věci jako například získání následujícího prvku ve stromově uspořádané kolekci (např. Dictionary). Tato knihovna obsahuje kolekce, které všechny mé požadavky splňují. Je pro mě až s podivem, že nějaké takovéto knihovny nejsou součástí jazyka C#. Při splnění výše uvedených požadavků je možné tento program spustit na jakékoli platformě a operačním systému.

Databázový modul ukládá data do kolekcí, tedy data jsou umístěna přímo v operační paměti počítače. Toto řešení dnes prakticky není omezeno z hlediska rozsahu dat (stovky tisíc či miliony autobusových spojů se snadno uloží do operační paměti i běžného 32-bitového stroje) a přirozeně vykazuje vysokou rychlost zpracování. V reálném systému by na druhé straně bylo nutné uvážit problematiku konzistence databáze při selhání hardwaru a nalézt odpovídající řešení.

Veškerá činnost databáze je zapouzdřena ve třídě MemoryDb, v jejíž dokumentaci lze nalézt podrobnosti o zvolených kolekcích a struktuře databáze. S okolím interaguje databáze pomocí uživatelského rozhraní IQuery a správcovského rozhraní IAdmin. Databáze je uzpůsobena pro současný přístup více klientů, konzistence dat je zajištěna pomocí víceúrovňových zámků typu více čtení - jeden zápis (k tomu podrobněji zde).

Spojení s klienty je zajištěno pomocí meziprocesové komunikace po síťovém protokolu TCP. Celkové uspořádání včetně schematických obrázků i podrobnosti o implementaci lze nalézt na zvláštní stránce. Moduly pro příjem spojení od klienta jsou pro vysokou průchodnost řešeny jako vícevláknové.

Jednoduchý správcovský terminál implementovaný ve třídě ServerApp slouží k příjmu řídicích příkazů a jejich zpracování. Jedná se hlavně o provedení zálohy databáze, pozastavení a opětovné spuštění komunikačního modulu a zobrazení stavu databáze. Konkrétní příkazy jsou popsány níže, problematice zálohování je věnována tato stránka. Server je proveden jako konzolová aplikace, správcovský terminál je tedy velmi jednoduchý, což je však u takových aplikací obvyklé a rozhodně není na závadu.

Při spuštění serveru bez parametrů se nahraje databáze, která odpovídá poslednímu platnému stavu při posledním ukončení aplikace. Podrobnosti jsou vysvětleny zde.

Alternativou je spuštění způsobem, kdy se provede obnova databáze do stavu v okamžiku dříve provedené zálohy. To se provede uvedením parametru - názvu souboru se zálohou, např. tedy

mono BRS#_server.exe "/home/kilian/Documents/BRS_backups/brs_2013-12-16.backup"

Pokud soubor neexistuje, je porušen nebo nemá správný formát, je vytvořena prázdná databáze.

Konfigurace

Nastavení komunikačního modulu je řešeno pomocí externího konfiguračního souboru. Serverová aplikace předpokládá, že se příslušný soubor nalézá pod jménem brs_server.conf ve stejném adresáři jako vlastní aplikace. Jde o jednoduchý textový soubor, jeho formát bude zřejmý z následujícího příkladu

# Bus Reservation System
#
# konfigurace serverove aplikace
port=4567
# slozka, kde se uchovava zaloha databaze a journalu
# cesta muze byt relativni - zacinajici ./ nebo ../ (na Windows .\ ci ..\)
#   nebo absolutni - zacinajici / (na Windows X:\)
# cesta MUSI koncit znakem '/' (pripadne '\' na Windows)
datadir=./

Konfiguruje se pouze port, na kterém bude serverová aplikace čekat na spojení a adresář pro ukládání interních datových souborů. Řádky uvozené znakem # jsou komentáře a ignorují se.

V případě komunikace pomocí TCP protokolu může být potřeba povolit odpovídající pravidla na firewallu počítače, případně i na dalších aktivních prvcích sítě.

Položka datadir určuje složku, kam se ukládají interní datové soubory - záloha databáze a žurnálovací soubor (více o tomto zde). Obecně lze doporučit uvedení absolutní cesty, neboť nemusí být zřejmé, s jakým aktuálním adresářem byla aplikace spuštěna. Prázdný řetězec odpovídá aktuálnímu adresáři.

Popis příkazů

  • BACKUP
    Provedení kompletní zálohy databáze do externího souboru (více o této problematice, formátu dat atp. zde).
    Příklad:
    > BACKUP database.bac
    Backup succeeded - written 198475 B
    
    Parameters
    jménojméno souboru se zálohou
  • INFO
    Získání informací o databázi. V současné době jsou zobrazovány počty položek jednotlivých typů, tj. měst, jejich pomocných názvů (aliasů), plánů (druhů) autobusů a autobusů (autobusových linek), a informace o stavu serveru.
    Příklad:
    > INFO
    Communication server is running.
    Cities:   13
    Aliases:  18
    Plans:    5
    Buses:    164
    
  • START
    Opětovné spuštění komunikačního modulu poté, co byl zastaven příkazem STOP.
    Příklad:
    > START
    Servers started successfully.
    
  • STOP
    Zastavení komunikačního modulu. Server postupně zastavuje příjem komunikace od klientů, přičemž již otevřená sezení jsou dokončena (včetně odeslání odpovědi klientovi). Lze využít k tomu, aby záloha provedená před vypnutím serveru skutečně odrážela poslední stav, který již není ovlivněn žádným klientským dotazem.
    Příklad:
    > STOP
    Servers stopped successfully.
    
  • HELP
    Vypsání seznamu příkazů a stručné nápovědy ke každému z nich.
  • EXIT
    Regulerní ukončení serverové aplikace s tím, že jsou správně ukončena všechna případně otevřená spojení s klienty.