SPHINX
SPHINX is een design pattern gebaseerd op gedistribueerde processen met real-time communicatie van XML-datagrammen over UDP multicast netwerken. Ter ondersteuning hiervan is het SPHINX-Tool ontwikkeld. Dit is een JAVA executable jar voor het managen van het SPHINX data verkeer.
Hieronder is een screenshot van het tool afgebeeld.
Het tool biedt een userinterface, waarmee het mogelijk is om UDP multicast dataverkeer in een gedistribueerd systeem real-time te monitoren. Daarnaast kun je ook datagrammen injecteren en daarmee het systeem stimuleren. Het datamodel is gebaseerd op XML en is daardoor éénvoudig op te zetten en uit te breiden.
Nu kun je je natuurlijk vragen: Waarom zou ik een gedistribueerd systeem willen bouwen?
Een systeem wordt vaak monolithisch gebouwd door het zogenaamd stapelen van functionaliteit, de zogenaamde stack. Een goed voorbeeld hiervan is een traditioneel java programma:
- De onderste laag is een JAVA-VM
- daarboven draait een infrastructuur laag (vaak bestaande uit data persistentie en data communicatie),
- daarboven draait een domein generieke laag (algemene functionaliteit om bijvoorbeeld database tabellen te bewerken of bijvoorbeeld netwerkcommunicatie te doen)
- daarboven wordt vaak een taak specifieke laag gebouwd (specifiek aansturing van de generieke laag voor de gewenste toepassing)
- daarboven heb je de presentatie laag
Je kunt je voorstellen dat het steeds stapelen van functionaliteiten tot een wolkenkrabber van functies leidt.
Het is afwachten, wanneer het moment komt dat je niet meer in staat bent om nog een functie toe te voegen, zonder dat de stapel instort. In de praktijk betekent dit, dat je (te) veel effort moet steken om instabiliteitsproblemen op te lossen (en dat dit zelfs niet meer lukt).
Een alternatief om dit te voorkomen komt uit de defensie industrie. Een marine fregat, onderzeeër, tank of vliegtuig moet op zijn systeem kunnen vertrouwen. Eén fout in het systeem heeft catastrofale gevolgen en kan zelfs fataal zijn voor de gebruiker. Deze systemen draaien vaak 24/7 en moeten 100% stabiel zijn. Om dit te realiseren wordt geen gebruik gemaakt van 1 grote stack (stapel) van functies, maar van meerdere kleinere (hooguit 3) stacks.
Door de stacks met elkaar te laten samenwerken volgens een efficiënte militaire hierarchie (chain of command), kan een hoge complexiteit van functies worden gerealiseerd, zonder dat het systeem instabiel wordt.
Als een fout optreedt, dan valt hooguit een deel van het systeem uit. Het geheel zal, met afgezwakte functionaliteit (degraded), blijven werken. Door de gedistribueerde architectuur kunnen ontwikkelaars vervolgens het falende gedeelte repareren, terwijl het systeem operationeel blijft. Dit wordt ook wel een fout-tolerant systeem genoemd. Bij een fout-tolerant systeem wordt er in de basis rekening meegehouden, dat er systeemfouten optreden. In plaats van veel tijd steken in het voorkomen van fouten, wordt er nu veel tijd gestoken in het opvangen en netjes afhandelen van fouten.
Het samenwerken van deze kleinere stacks geschiedt (net als bij mensen) d.m.v. communicatie. Om te communiceren heb je een taal en een woordenschat nodig. Dit wordt in de software het datamodel genoemd. Om het domeinspecifieke datamodel te maken en grip te houden op de communicatie is SPHINX bedacht. SPHINX is een, op XML gebaseerd, designpattern, die de designer in staat stelt om een complex gedistribueerd systeem te realiseren en beheersbaar te houden. Als designer hoef je je alleen nog maar bezig te houden met de domein-, taak- en presentatielaag.
Met SPHINX kun je zelfs bepaalde stacks op een Windows PC draaien en andere weer op een Linux Raspberry Pi (de juiste hardware voor de juiste toepassing). Afhankelijk van de gewenste functionaliteit kun je zelfs bepaalde stacks in C schrijven en andere in PYTHON of JAVA (de juiste taal voor de juiste functie). Kritieke delen kun je éénvoudig redundant en geografisch gedistribueerd uitvoeren, om de availability en stability nog verder te verhogen (de juiste uitvoering op de juiste plek).
De sky is de limit!
SPHINX-Tool is geschreven in JAVA en volledig open-source. De broncode en kickstart toepassingsvoorbeelden zijn te vinden onder: