Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji

Ahoj kolegové.

Dnes vám nabízíme ke zvážení překlad článku Tugberka Ugurlua, který se zavázal nastínit v relativně malém objemu principy navrhování moderních softwarových systémů. Zde je to, co o sobě autor v souhrnu říká:

Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji
Protože je absolutně nemožné obsáhnout v habro článku tak kolosální téma, jako jsou architektonické vzory + designové vzory od roku 2019, doporučujeme nejen samotný text pana Uruglu, ale i četné odkazy, které do něj laskavě vložil. Pokud se vám to bude líbit, zveřejníme specializovanější text o návrhu distribuovaných systémů.

Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji

Fotografie Isaac Smith od Unsplash

Pokud jste nikdy nemuseli čelit takovým výzvám, jako je návrh softwarového systému od nuly, pak při zahájení takové práce někdy ani není jasné, kde začít. Věřím, že si nejprve musíte nakreslit hranice, abyste měli více či méně jistou představu o tom, co přesně budete navrhovat, a pak si vyhrnout rukávy a pracovat v rámci těchto hranic. Jako výchozí bod si můžete vzít produkt nebo službu (ideálně takovou, která se vám opravdu líbí) a vymyslet, jak ji implementovat. Možná vás překvapí, jak jednoduše tento produkt vypadá a jakou složitost ve skutečnosti obsahuje. Nezapomeň: jednoduché - obvykle složité, a to je v pořádku.

Myslím, že nejlepší rada, kterou mohu dát každému, kdo začíná navrhovat systém, je tato: nedělejte si žádné domněnky! Od samého začátku je potřeba upřesnit fakta známá o tomto systému a očekávání s ním spojená. Zde je několik dobrých otázek, které vám pomohou začít s návrhem:

  • Jaký je problém, který se snažíme vyřešit?
  • Jaký je nejvyšší počet uživatelů, kteří budou interagovat s naším systémem?
  • Jaké vzory zápisu a čtení dat budeme používat?
  • Jaké jsou očekávané případy selhání, jak je budeme řešit?
  • Jaká jsou očekávání ohledně konzistence a dostupnosti systému?
  • Musíte při práci zohledňovat nějaké požadavky související s externím ověřováním a regulací?
  • Jaké typy citlivých dat budeme ukládat?

To je jen pár otázek, které byly užitečné jak pro mě, tak pro týmy, ve kterých jsem se za léta profesionální činnosti podílel. Pokud znáte odpovědi na tyto otázky (a jakékoli další, které jsou relevantní pro kontext, ve kterém musíte pracovat), můžete se postupně ponořit do technických detailů problému.

Nastavte počáteční úroveň

Co zde myslím pod pojmem „základní linie“? Ve skutečnosti lze v dnešní době většinu problémů v softwarovém průmyslu „lze“ vyřešit pomocí existujících metod a technologií. Procházením této krajiny tedy získáte určitý náskok, když budete čelit problémům, které před vámi musel vyřešit někdo jiný. Nezapomeňte, že programy jsou psány pro řešení obchodních a uživatelských problémů, takže se snažíme problém vyřešit co nejpřímějším a nejjednodušším (z pohledu uživatele) způsobem. Proč je důležité si to pamatovat? Možná ve svém souřadnicovém systému rádi hledáte jedinečná řešení pro všechny problémy, protože si říkáte: „Co jsem to za programátora, když všude následuji vzory“? Ve skutečnosti, umění zde spočívá v rozhodování o tom, kde a co dělat. Každý z nás se samozřejmě musí čas od času potýkat s jedinečnými problémy, z nichž každý je skutečnou výzvou. Pokud je však naše počáteční úroveň jasně definovaná, pak víme, na co vynaložit svou energii: hledat hotové možnosti řešení problému, který je před námi, nebo jej dále studovat a hlouběji rozumět.

Myslím, že jsem vás dokázal přesvědčit, že pokud specialista sebevědomě chápe, co je architektonickou součástí některých úžasných softwarových systémů, pak budou tyto znalosti nepostradatelné pro zvládnutí umění architekta a vytvoření pevného základu v této oblasti.

Dobře, tak kde začít? U Donna Martina Na GitHubu existuje úložiště s názvem system-design-primer, ze kterého se můžete naučit navrhovat rozsáhlé systémy a také se připravit na pohovory na toto téma. Úložiště má sekci s příklady skutečné architektury, kde se zejména zvažuje, jak přistupují k návrhu svých systémů některé známé společnostinapř. Twitter, Uber atd.

Než však přejdeme k tomuto materiálu, podívejme se blíže na nejdůležitější architektonické výzvy, kterým v praxi čelíme. To je důležité, protože musíte specifikovat MNOHO aspektů tvrdohlavého a mnohostranného problému a ten pak řešit v rámci předpisů platných v daném systému. Jackson Gabbard, bývalý zaměstnanec Facebooku, napsal 50minutové video o rozhovorech s návrhem systémů, kde se podělil o vlastní zkušenosti z prověřování stovek uchazečů. I když se video silně zaměřuje na návrh velkého systému a kritéria úspěchu, která jsou důležitá při hledání kandidáta na takovou pozici, bude stále sloužit jako komplexní zdroj informací o tom, co je při navrhování systémů nejdůležitější. Také navrhuji souhrn tohle video.

Vybudujte si znalosti o ukládání a načítání dat

Vaše rozhodnutí o tom, jak budete data dlouhodobě ukládat a načítat, má obvykle zásadní dopad na výkon systému. Proto musíte nejprve porozumět očekávaným charakteristikám zápisu a čtení vašeho systému. Pak musíte být schopni vyhodnotit tyto ukazatele a učinit rozhodnutí na základě provedených hodnocení. Tuto práci však můžete efektivně zvládnout pouze tehdy, pokud rozumíte existujícím vzorcům ukládání dat. V zásadě to znamená solidní znalosti související s výběr databáze.

Databáze lze považovat za datové struktury, které jsou extrémně škálovatelné a odolné. Znalost datových struktur by vám proto měla být při výběru konkrétní databáze velmi užitečná. Například, Redestilát je server datové struktury, který podporuje různé typy hodnot. Umožňuje vám pracovat s datovými strukturami, jako jsou seznamy a množiny, a číst data pomocí známých algoritmů, např. LRU, organizování takové práce trvanlivým a vysoce přístupným stylem.

Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji

Fotografie Samuel Zeller od Unsplash

Jakmile dostatečně porozumíte různým vzorcům ukládání dat, přejděte ke studiu konzistence a dostupnosti dat. V první řadě musíte pochopit CAP věta alespoň v obecné rovině a poté tyto znalosti vypilovat bližším pohledem na zavedené vzory konzistence и přístupnost. Tímto způsobem získáte porozumění oboru a pochopíte, že čtení a zápis dat jsou ve skutečnosti dva velmi odlišné problémy, z nichž každý má své vlastní jedinečné výzvy. Vyzbrojeni několika vzory konzistence a dostupnosti můžete výrazně zvýšit výkon systému a zároveň zajistit hladký tok dat do vašich aplikací.

Na závěr rozhovoru o problémech s ukládáním dat bychom měli zmínit také ukládání do mezipaměti. Měl by běžet současně na klientovi a serveru? Jaká data budou ve vaší mezipaměti? A proč? Jak organizujete zneplatnění mezipaměti? Bude se to dělat pravidelně, v určitých intervalech? Pokud ano, jak často? Doporučuji začít studovat tato témata s další sekce výše zmíněný základ pro návrh systému.

Komunikační vzory

Systémy se skládají z různých komponent; mohou to být různé procesy běžící ve stejném fyzickém uzlu nebo různé stroje běžící na různých částech vaší sítě. Některé z těchto zdrojů ve vaší síti mohou být soukromé, ale jiné by měly být veřejné a přístupné spotřebitelům, kteří k nim mají přístup zvenčí.

Je nutné zajistit komunikaci těchto zdrojů mezi sebou a také výměnu informací mezi celým systémem a vnějším světem. V souvislosti s návrhem systémů zde opět stojíme před řadou nových a jedinečných výzev. Podívejme se, jak mohou být užitečné asynchronní toky úloh, a co pK dispozici jsou různé komunikační vzorce.

Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji

Fotografie Tony Stoddard od Unsplash

Při organizování komunikace s vnějším světem je to vždy velmi důležité zabezpečení, o jehož poskytování je také třeba se vážně starat a aktivně se o něj starat.

Přípojné rozvody

Nejsem si jistý, že zařazení tohoto tématu do samostatné sekce bude každému připadat oprávněné. Přesto zde tento pojem podrobně představím a domnívám se, že materiál v této části nejpřesněji vystihuje pojem „rozvody přípojek“.

Systémy jsou tvořeny správným propojením mnoha komponent a jejich vzájemná komunikace je často organizována na základě zavedených protokolů, například TCP a UDP. Tyto protokoly jako takové však často nepostačují ke splnění všech potřeb moderních systémů, které jsou často provozovány ve vysoké zátěži a jsou také značně závislé na potřebách uživatelů. Často je nutné najít způsoby, jak distribuovat připojení, aby se vyrovnaly s tak vysokým zatížením systému.

Tato distribuce je založena na dobře známém Domain Name System (DNS). Takový systém umožňuje transformace názvů domén, jako je vážená kruhová analýza a metody založené na latenci, které pomáhají distribuovat zátěž.

Vyvažování zátěže je zásadně důležitý a prakticky každý velký internetový systém, kterým se dnes zabýváme, se nachází za jedním nebo více load balancery. Nástroj pro vyrovnávání zátěže pomáhá distribuovat požadavky klientů mezi více dostupných instancí. Load balancery jsou hardwarové i softwarové, v praxi se však častěji musíte potýkat například s těmi softwarovými HAProxy и ELB. Reverzní proxy koncepčně také velmi podobné zátěžovým balancérům, i když existuje rozmezí mezi prvním a druhým zřetelné rozdíly. Tyto rozdíly je třeba vzít v úvahu při navrhování systému na základě vašich potřeb.

Měli byste také vědět o sítě pro doručování obsahu (CDN). CDN je globální distribuovaná síť proxy serverů, která dodává informace z uzlů, které jsou geograficky umístěny blíže konkrétnímu uživateli. CDN je vhodnější použít, pokud pracujete se statickými soubory napsanými v JavaScriptu, CSS a HTML. Kromě toho jsou dnes běžné cloudové služby, které zajišťují správce provozu, např. Azure Traffic Manager, což vám poskytuje globální distribuci a sníženou latenci při práci s dynamickým obsahem. Takové služby jsou však obvykle užitečné v případech, kdy musíte pracovat s bezstavovými webovými službami.

Pojďme se bavit o obchodní logice. Strukturování obchodní logiky, toků úkolů a komponent

Podařilo se nám tedy prodiskutovat různé infrastrukturní aspekty systému. S největší pravděpodobností uživatel ani nepřemýšlí o všech těchto prvcích vašeho systému a upřímně řečeno, vůbec se o ně nestará. Uživatel se zajímá o to, jaká je interakce s vaším systémem, čeho lze tímto způsobem dosáhnout a také jak systém provádí uživatelské příkazy, co a jak dělá s uživatelskými daty.

Jak název tohoto článku napovídá, chtěl jsem hovořit o architektuře softwaru a návrhu systému. V souladu s tím jsem neplánoval pokrýt vzory návrhu softwaru, které popisují, jak jsou softwarové komponenty vytvářeny. Čím více o tom však přemýšlím, tím více se mi zdá, že hranice mezi softwarovými designovými vzory a architektonickými vzory je velmi nejasná a tyto dva pojmy spolu úzce souvisí. Vezměme si příklad registrace akce (sourcing událostí). Jakmile si osvojíte tento architektonický vzor, ​​ovlivní téměř každý aspekt vašeho systému: dlouhodobé ukládání dat, úroveň konzistence přijaté ve vašem systému, tvar součástí v něm atd., atd. Proto jsem se rozhodl zmínit některé architektonické vzory, které se přímo týkají obchodní logiky. I když se tento článek bude muset omezit na jednoduchý seznam, doporučuji vám se s ním seznámit a přemýšlet o nápadech spojených s těmito vzory. Tady jsi:

Kolaborativní přístupy

Je extrémně nepravděpodobné, že se ocitnete na projektu jako účastník, který je výhradně zodpovědný za proces návrhu systému. Naopak, s největší pravděpodobností budete muset komunikovat s kolegy, kteří pracují v rámci vašeho úkolu i mimo něj. V tomto případě možná budete muset vyhodnotit vybraná technologická řešení s kolegy, identifikovat obchodní potřeby a pochopit, jak nejlépe paralelizovat úkoly.

Softwarová architektura a návrh systémů: Velký obrázek a průvodce zdroji

Fotografie Kaleidico od Unsplash

Prvním krokem je vyvinout přesné a sdílené pochopení toho, jaký je obchodní cíl, kterého se snažíte dosáhnout, a s jakými pohyblivými částmi se budete muset vypořádat. Zejména techniky skupinového modelování bouřlivé události (event storming) pomáhají tento proces výrazně urychlit a zvýšit vaše šance na úspěch. Tuto práci lze provést před nebo po nastínění hranice vašich služeba poté ji prohloubit, jak produkt zraje. Na základě úrovně konzistence, které zde bude dosaženo, můžete také formulovat společný jazyk pro omezený kontext, ve kterém pracujete. Když potřebujete mluvit o architektuře vašeho systému, může se vám to hodit model C4, navržený Simon Brown, zvláště když potřebujete pochopit, jak moc budete muset jít do detailů problému a vizualizovat věci, které chcete sdělit.

Pravděpodobně existuje další vyspělá technologie na toto téma, která není o nic méně užitečná než Domain Driven Design. Nicméně se tak nějak vracíme k chápání předmětné oblasti, tedy znalostí a zkušeností v oboru Návrh řízený doménou by vám mělo být užitečné.

Zdroj: www.habr.com

Přidat komentář