Architektonické přístupy | Technologický blog

26.02.2021

TECHNOLOGICKÉ BLOGY Z PROSTŘEDÍ ANASOFTU

V dnešní části technologického blogu budeme hovořit s jedním z návrhářů společnosti ANASOFT, Martinom Vozárom. Ten má více než dvacetileté zkušenosti s vývojem aplikací na míru od těch malých až po velké enterprise řešení. Řeč bude o distribuovaném přístupu k tvorbě aplikací a jeho specifikách.

Pokud bys měl distribuovaný přístup k vývoji aplikací přiblížit čtenářům, co by si měli pod tím představit?

Každý, kdo někdy programoval, pozná snahu, mít všechnu funkcionalitu v jedné aplikaci. Je to přirozené.

S programováním člověk začíná od malých aplikací, kdy vyvíjí všechno sám a jakýkoliv jiný přístup než jedna aplikace ani není žádoucí. Pouze by to věci komplikovalo. 

S narůstající složitostí řešení ale přibývá i počet vývojářů, kteří se na něm podílí, a také potřeba nebo vhodnost realizovat je jinak.

Jako příklad mohu uvést jednu aplikaci, kterou jsme nedávno realizovali pro našeho klienta. Úlohou bylo zpracovat obrovský objem údajů z velkého systému, a následně je do uvedeného systému vrátit zpět.

Jak jste v tomto případě postupovali a proč?

Pro lepší představu je důležité uvědomit si, co všechno taková aplikace potřebuje dělat. V prvé řadě potřebuje z externího systému získat údaje na zpracování. Tyto si potřebuje uložit do vlastní lokální databáze a následně nad nimi spustit pracovní procesy, ke kterým se váže i uživatelské rozhraní, kterým obsluha systém ovládá. A následně je potřebné zpracované údaje vrátit zpět do systému, z kterého pochází.

Z povahy aplikace vyplývá, že dělá množství odlišných operací. Integrační resp. interface-ové operace jako získání dat z externího systému a jejich vrácení zpět, backendové operace související s lokálním uložením a zpracováním údajů a frontendové operace uživatelského rozhraní pro zadávání pokynů obsluhy a prezentování výsledků.

A to si vyžaduje distribuovaný přístup?

Nevyžaduje, ale v tomto případě to byla jedna z možností a ukázala se jako dobrá. Samozřejmě, bylo by možné technické řešení, kterým by vznikla jedna velká monolitická aplikace. V tomto případě jsme se však rozhodli vytvořit několik samostatných aplikací, z kterých každá plnila velmi specifickou úlohu. Jednotlivé aplikace tak mezi sebou fungovali na základě jakýchsi signálů.

Můžeš uvést konkrétnější příklad?

Například aplikace, která je zodpovědná za zpětné odeslání údajů do původního velkého systému funguje tak, že v pravidelných intervalech sleduje obsah dohodnutého adresáře, a pokud v něm najde soubory v dohodnutém formátu, zpracuje je a odešle do původního systému. Takovýto přístup má několik výhod.

Bylo by možné technické řešení, kterým by vznikla jedna velká monolitická aplikace. V tomto případě jsme se však rozhodli vytvořit několik samostatných aplikací, ze kterých každá plnila velmi specifickou úlohu. Jednotlivé aplikace tak mezi sebou fungovali na základě jakýchsi signálů.

Které jsou ty nejdůležitější?

Začíná to už při samotném vývoji. 

Takto samostatně navrhnutá aplikace se dá implementovat nezávisle od zbytku systému. Může na ní pracovat vývojář, který nepotřebuje znát žádné další části systému.

Stačí mu vědět, že má sledovat obsah adresáře a jakým způsobem údaje zpracovat a přenést do externího systému. Umožňuje to tedy paralelní vývoj nad celým řešením.

Další výhodou je, že kód takových řešení zůstává poměrně čistý a dobře čitelný. Aplikace na zpracování souborů se zabývá pouze tím, co je její náplní a ostatní části systému, ostatní aplikace, se o vstupně-výstupní operace a napojení na okolní systémy nemusí vůbec zajímat.

Takový přístup zjednodušuje údržbu celého systému a také hledání chyb. Pokud například neprocházejí výsledná data zpět do externího systému, je logické začít hledat chybu právě v aplikaci, která odpovídá za jejich přenos.

V případě, že externí systém neběží, ovlivňuje to právě jen tuto jednu aplikaci a ostatní části systému mohou běžet nezávisle dál. Navíc pokud se najde chyba v aplikaci, která předává data do externího systému, stačí opravit kód právě této jedné aplikace a tuto přetestovat a nasadit. Ostatní části systému, ostatní dílčí aplikace, zůstávají beze změny.

Za zmínku také stojí vyšší souběžnost vývojářských prací a možnost využívat více specifické odbornosti vývojářů. Ne každému vývojáři stejně dobře sedí každý druh vývojářské práce. Někdo se lépe uplatní při tvorbě uživatelského rozhraní, a někdo naopak při databázových operacích či rozhraních mezi různými systémy. Vývoj jedné velké aplikace by znamenal, že různí vývojáři sdílejí společný kód a musí se v něm alespoň v základu orientovat. I v částech, které se jejich práce netýkají. Při samostatných aplikacích má každý své vlastní "hřiště" a důležité je pouze správně nastavit propojení jednotlivých částí řešení.

V případě, že externí systém neběží, ovlivňuje to právě jen tuto jednu aplikaci a ostatní části systému mohou běžet nezávisle dál. Navíc pokud se najde chyba v aplikaci, která předává data do externího systému, stačí opravit kód právě této jedné aplikace a tuto přetestovat a nasadit.

 

 

 

Děkuji za rozhovor

 

Rozhovor zpracoval  Boris Rybár / Manažer týmu softwarového vývoje

Má takový distribuovaný přístup i svá negativa?

 

Jako všechny přístupy i tento má svá specifika a záměrně to nenazývám negativa.

V první řadě je velmi důležitý správný návrh celého řešení, aby ve výsledku vše spolu hrálo tak jak má. Takže si to vyžaduje trochu více času při přípravě, ale pro řešení podobného typu je to nutné.

Důležitou věcí je také nastavení správných standardů vývoje napříč všemi aplikacemi a na různých úrovních. Kromě jmenných konvencí hraje při takovéto architektuře důležitou roli správně logování. Přestože jsou jednotlivé aplikace samostatné a samostatně i logují aktivity, které provádějí, netřeba zapomínat, že plní nějakou společnou roli.

V případě, že se celý proces někde zasekne, je důležité vědět efektivně dohledat, kde došlo k prvotnímu problému a jak se ten následně šířil celým systémem. Proto je důležité mít nastavení logování tak, aby pokud možno jednotlivé aplikace logovali na společné místo a kromě logování specifik dané aplikace logovali i nějaký byznys atribut, řekněme číslo události, který je společný napříč celým systémem.

Pokud si představíme například distribuovaný systém pro zpracování faktur, pak jednotlivé části systému by měly logovat mj číslo faktury, se kterou operaci provádějí. Uvedeným způsobem je pak možné chybu hledat rychle v centrálním logu a rozpoznat souvislosti týkající se stejné operace (faktury) napříč celým systémem.