BRS#
Meziprocesová komunikace

Aplikace pro rezervaci místenek v autobusových spojích je ze své podstaty typu server-klient, tedy má centrální úložiště dat, ke kterému přistupují operátoři na jednotlivých terminálech. Z toho plyne, že implementace musí řešit otázku komunikace mezi procesy. Operační systémy k tomu poskytují různé prostředky s různými vlastnostmi. Zmíníme alespoň některé:

  • TCP - komunikace mezi procesy jednoho počítače i různými počítači prakticky po celém světě. Široce rozšířeno na prakticky všech operačních systémech, může být potřeba upravit nastavení firewallu.
  • Zprávy - operační systémy mají přímo zabudovaný systém posílání zpráv (Microsoft Windows) nebo existují jiné podobné prostředky (D-Bus na Linuxu apod.). Komunikace probíhá mezi procesy jednoho počítače, podrobnosti jsou přirozeně implementačně závislé. Na Windows lze binární data přeposílat pomocí zpráv WM_COPYDATA mezi okny.
  • COM objekty - komunikace v rámci počítače (pro DCOM v rámci sítě Microsoft Windows).
  • Pojmenované roury - komunikace v rámci sítě Microsoft Windows nebo v rámci UNIXového počítače.
  • Unixové sockety - komunikace pomocí socketů v rámci jednoho počítače

V rámci projektu byly implementovány třídy pro komunikaci pomocí protokolu TCP.

Od místní databáze ke vzdálené

Databáze je reprezentována instancí třídy MemoryDb, požadavky se vyřizují přes rozhraní IQuery. Případné jiné implementace databáze v budoucnu musí používat stejné rozhraní, vnitřní struktura ale může být libovolná.

Terminálová část je vybavena vnitřní logikou, ale veškerou svou činnost vykonává pomocí elementárních příkazů, které poskytuje databázové rozhraní. V konfiguraci server-klient, kdy terminálová část je v jiném procesu (případně na zcela jiném počítači) je potřeba zajistit přenos požadavků z klienta na serverovou část a vrátit požadovaný výsledek dotazu.

Parametry dotazu stejně jako jeho výsledky jsou převedeny do binární podoby, která je nezávislá na způsobu přenosu informací mezi procesy. Převod do tohoto binárního formátu a zpět zajišťuje dvojice tříd - ClientProcess na klientské straně a ServerProcess na straně serveru. První z nich implementuje rozhraní IQuery, druhá pak zajišťuje volání odpovídající metody téhož rozhraní implementované databáze, což znázorňuje i následující obrázek.

RemoteDb.png
Přímé připojení databáze vs. databáze v jiném procesu.

Dvojice právě zmíněných sesterských tříd odstiňuje zbytek aplikací od detailů implementace meziprocesové komunikace (IPC) i odlišností vyplývajících z rozličných vlastností jednotlivých druhů transportu. Z hlediska klientského rozhraní je přenos dat mezi procesy naprosto transparentní. Výhodou je mj. skutečnost, že vlastní serverová aplikace může implementovat i přímo připojeného klienta, minimálně však je takové uspořádání výhodné při ladění a testování funkčnosti jak vlastní databáze, tak klientské části - v rámci jednoho procesu je vše přirozeně jednodušší.

Realizace komunikace

Již bylo zmíněno výše jako transportní protokol byl vybrán TCP.

Klientů může být přirozeně připojeno více najednou, celá serverová část pracuje ve vícevláknovém režimu.

Formát binárních dat

Parametry volání funkcí databázového rozhraní musí být pro přenos mezi procesy převedeny do binární podoby. To samé platí pro přenos návratových hodnot metod a parametrů opačným směrem.

Při volání funkce (statické metody třídy) se jednotlivé parametry ukládají za sebou dle těchto pravidel:

  • metoda - binární podoba typu int s hodnotou dle výčtového typu QueryCmd,
  • čísla - binární podoba vestavěného typu uint,
  • logické hodnoty - jako bool s hodnotou true a false,
  • BusInfo - binární podoba struktury (jedná se o agregát jednoduchých typů),
  • řetězce - pole znaků v UTF-8, délka je uint před samotnými daty,
  • struktury - složitější struktury obsahující např. instance tříd se přenášejí po jednotlivých položkách,
  • seznamy, fronty - nejprve se uvádí počet položek (jako uint) následovaný jednotlivýni položkami.

Pro návratové hodnoty platí prakticky totéž s tím, že místo čísla metody má první položka význam návratové hodnoty metody.

Zpracování chyb

Při vzdáleném volání databázových dotazů může docházet k chybám, jejich příčiny mohou být značně různorodé:

  • Volání databázového rozhraní z metod třídy ServerProcess selže, návratová hodnota je nenulová.
  • Třída ServerProcess nemá přiřazenu funkci pro zpracování data na aplikační vrstvě.
  • Chyby na transportní vrstvě - nedojde ke spojení, spojení je přerušeno, data se při transportu poškodí.

Chyby výše zmíněných typů jsou zachyceny ve třídě ClientApp. Pomocí uživatelkého rozhraní je vypsána odpovídající chybová hláška.