Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji

Dobrý den, kolegové.

Dnes vám předkládáme překlad článku Tugberka Ugurlua, který se ve srovnatelně malém objemu pokouší přiblížit principy návrhu moderních softwarových systémů. Zde je to, co o sobě autor shrnuje:

Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji
Jelikož je naprosto nemožné obsáhnout v rychlém přehledu tak kolosální téma, jako jsou architektonické vzory + návrhové vzory k roku 2019, doporučujeme nejen samotný text pana Ugurlua, ale také mnohé odkazy, které v něm laskavě uvedl. Pokud se vám to bude líbit, zveřejníme i specializovanější text o návrhu distribuovaných systémů.

Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji

Fotografie Ayzeka Smitha z webu Unsplash

Pokud jste se nikdy nesetkali s takovými výzvami, jako je návrh softwarového systému od nuly, může být na začátku obtížné vědět, jak začít. Myslím, že prvním krokem je vytyčit hranice, abyste si mohli více méně jistě představit, co konkrétně se chystáte navrhnout, a poté si roll up sleeves a pracovat, aniž byste překročili tyto hranice. Jako výchozí bod můžete vzít nějaký produkt nebo službu (ideálně takovou, která se vám opravdu líbí) a podívat se na její implementaci. Možná vás překvapí, jak jednoduše tento produkt vypadá, a jaká obrovská složitost se v něm ve skutečnosti skrývá. Nezapomeňte: jednoduché je obvykle složité, a to je v pořádku.

Myslím, že nejlepší rada, kterou mohu dát těm, kteří se chystají navrhnout systém, zní: nedělejte žádné předpoklady! Od samého začátku je třeba konkretizovat fakta známá o tomto systému a s ním související očekávání. Zde je několik dobrých otázek, jejichž odpovědi vám pomohou začít s návrhem:

  • Jaký je problém, který se snažíme vyřešit?
  • Jaký je maximální 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í a jak se s nimi hodláme vypořádat?
  • Jaká očekávání jsou kladena na konzistenci a dostupnost systému?
  • Musíme při práci zohlednit nějaké požadavky týkající se externí kontroly a regulace?
  • Jaké druhy důvěrných údajů plánujeme uchovávat?

To jsou jen některé otázky, které byly užitečné jak mně, tak i týmům, ve kterých jsem měl tu čest pracovat za léta své profesionální kariéry. Pokud znáte odpovědi na tyto otázky (a na jakékoli další relevantní v kontextu, ve kterém pracujete), můžete postupně proniknout do technických detailů úkolu.

Stanovujeme počáteční úroveň

Co tím myslím pod "počáteční úrovní"? V dnešní době většinu problémů v softwarovém průmyslu "lze" vyřešit pomocí již existujících metod a technologií. Tímto způsobem, orientujíc se v tomto prostředí, získáváte určitý náskok, když se setkáváte s úkoly, které už někdo před vámi řešil. Nezapomínejte, že programy jsou psány za účelem řešení problémů podnikání a uživatelů, proto se snažíme vyřešit úkol co nejjednodušším a nejpřímějším způsobem (z pohledu uživatele). Proč je důležité to mít na paměti? Možná ve vašem systému souřadnic rádi hledáte pro všechny úkoly unikátní řešení, protože si myslíte, "jaký jsem programátor, když všude dodržuji vzory"? Ve skutečnosti umění spočívá v rozhodování o tom, kde a co dělat. Samozřejmě, každý z nás se čas od času setkává s unikátními problémy, z nichž každý je opravdovou výzvou. Nicméně, pokud je naše počáteční úroveň jasně definována, víme, na co zaměřit své síly: zda hledat již dostupné možnosti řešení daného úkolu, nebo se věnovat jeho dalšímu zkoumání a hlubšímu porozumění.

Myslím, že se mi podařilo vás přesvědčit, že pokud specialista spolehlivě rozumí architektonickým aspektům některých úžasných softwarových systémů, tyto znalosti budou nenahraditelné pro ovládnutí umění architekta a vybudování solidního základu v této oblasti.

Dobře, kde tedy začít? U Dony Martiny je repozitář na GitHubu s názvem system-design-primer, ze kterých se naučíte navrhovat rozsáhlé systémy a také se připravit na pohovory na toto téma. V repozitáři je sekce s příklady skutečných architektur, kde se konkrétně podíváme na to, jak některé dobře známé společnosti přistupují k návrhu svých systémů například Twitter, Uber atd.. Nicméně dříve, než se pustíme do tohoto materiálu, podívejme se blíže na nejdůležitější architektonické výzvy, kterým čelíme v praxi. To je důležité, protože je třeba konkretizovat MNOHO aspektů nepoddajného a mnohostranného problému a poté jej řešit v rámci regulace, která v daném systému platí.

Jackson Gabbard , bývalý zaměstnanec Facebooku, natočil50minutové video o pohovorech zaměřených na návrh systémů , kde se podělil o vlastní zkušenosti s hodnocením stovek uchazečů. I přesto, že se video výslovně věnuje návrhu velkých systémů a kritériím úspěšnosti, které jsou důležité při hledání tohoto typu pozice, bude to přesto vyčerpávajícím zdrojem o tom, co je při návrhu systémů nejdůležitější. Také nabízímshrnutí tohoto videa. Získávejte znalosti o ukládání a vyhledávání dat

Obecně platí, že vaše rozhodnutí o tom, jak dlouhodobě budete ukládat a vydávat svá data, má kritický vliv na výkon systému. Proto byste měli především rozumět očekávaným charakteristikám zápisu a čtení dat ve vašem systému. Poté je třeba být schopen hodnotit tyto parametry a provést volbu na základě provedených hodnocení. Nicméně efektivně tuto práci zvládnete pouze tehdy, pokud rozumíte existujícím vzorcům ukládání dat. V podstatě to zahrnuje důkladné znalosti týkající se

výběru databáze Databáze lze považovat za datové struktury, které mají výjimečnou škálovatelnost a trvanlivost. Proto by měly být znalosti datových struktur velmi užitečné i při výběru konkrétní databáze. Například,.

Databáze lze považovat za datové struktury, které se vyznačují výjimečnou škálovatelností a trvanlivostí. Proto by měly znalosti datových struktur být užitečné i při výběru konkrétní databáze. Například, Redis – je server strukturovaných dat, který podporuje různé typy hodnot. Umožňuje pracovat s datovými strukturami jako jsou seznamy a množiny, číst data pomocí obvyklých algoritmů, například, LRU, organizuje takovou práci v dlouhodobém a vysoce dostupném stylu.

Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji

Fotografie Samuel Zeller z webu Unsplash

Jakmile se dostatečně zorientujete v různých vzorech ukládání dat, přejděte k studiu konzistence a dostupnosti dat. Nejprve se budete muset naučit, CAP teorem , alespoň v obrysech, a poté si tyto znalosti prohloubit tím, že se podíváte na ustálené vzory konzistence a dostupnosti. Tak si rozšíříte obzory v této oblasti a pochopíte, že čtení a zápis dat jsou ve skutečnosti dvě velmi odlišné problémy, z nichž každé nese své vlastní výzvy. S několika vzory pro zajištění konzistence a dostupnosti budete moci výrazně zvýšit výkon systému, přičemž zajistíte kontinuitu dodávky dat do vašich aplikací.

Nakonec, když ukončujeme diskusi o otázkách ukládání dat, je třeba zmínit i o caching. Mělo by se to provádět současně na klientovi i na serveru? Jaká data budete mít ve vaší cache? A proč? Jak organizujete zneplatnění cache? Bude probíhat pravidelně, po určitém časovém intervalu? Pokud ano – jak často? Doporučuji začít prozkoumávat tato témata v následující části výše zmíněného abecedníku pro návrh systémů.

Komunikační vzory

Systémy se skládají z různých komponent; mohou to být různé procesy běžící uvnitř jednoho fyzického uzlu, stejně jako různé stroje působící v různých částech vaší sítě. Některé z těchto zdrojů uvnitř vaší sítě mohou být soukromé, ale jiné by měly být veřejné a otevřené pro spotřebitele, kteří se k nim obracejí zvenčí.

Je třeba zajistit komunikaci mezi těmito zdroji navzájem a také výměnu informací mezi celým systémem a vnějším světem. V kontextu návrhu systémů se zde opět setkáváme s sadou nových unikátních výzev. Zjistíme, jak mohou být užitečné asynchronní pracovní toky, a jaké rrozmanité komunikační vzory jsou k dispozici.

Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji

Fotografie Tony Stoddard z webu Unsplash

Při organizaci komunikace s vnějším světem je vždy velmi důležité bezpečnost, na což je také třeba přistupovat se vší vážností a aktivně se tím zabývat.

Distribuce připojení

Nejsem si jistý, zda se prezentace tohoto tématu jako samostatné sekce všem jeví jako oprávněná. Nicméně zde rozvedu tuto koncepci a považuji za nejpřesnější popis tohoto oddílu termín „distribuce připojení“ (connection distribution).

Systémy se formují správným propojením mnoha komponentů a jejich komunikace mezi sebou je často organizována na základě ustálených protokolů, jako jsou TCP a UDP. Tyto protokoly však často nestačí k uspokojení všech potřeb moderních systémů, které jsou často provozovány při vysokém zatížení a silně závisí na potřebách uživatelů. Často je nutné hledat způsoby distribuce připojení, abychom se vyrovnali s takovými vysokými zatíženími v systému.

Na základě takové distribuce leží dobře známý systém doménových jmen (DNS). Tento systém umožňuje převádět doménové jméno, jako například vážený cyklický algoritmus (weighted round robin) a metody na základě zpoždění, které pomáhají distribuovat zátěž.

Vyvažování zátěže je zásadně důležité a prakticky každý velký systém na internetu, se kterým se dnes musíme potýkat, je umístěn za jedním nebo několika vyvažovači zátěže. Vyvažovače zátěže pomáhají distribuovat klientské požadavky mezi mnoha dostupnými instancemi. Vyvažovače zátěže mohou být jak hardwarové, tak softwarové, ale v praxi se častěji setkáváme se softwarovými, například s Dále klientský dotaz vcházel do HAProxy, které řešilo následující úkoly: a ELB. Zpětné proxy konceptuálně se také velmi podobají vyvažovačům zátěže, i když mezi nimi existuje řada výrazných rozdílů. Tyto rozdíly je nutné zohlednit při navrhování systému podle vašich potřeb.

Také je třeba vědět o sítích pro doručování obsahu (CDN). CDN je globální distribuovaná síť proxy serverů, která doručuje informace z těch uzlů, které jsou geograficky umístěny blíže k konkrétnímu uživateli. Sítě CDN se doporučuje používat, pokud pracujete se statickými soubory napsanými v JavaScriptu, CSS a HTML. Dnes jsou také oblíbené cloudové služby, které poskytují správce provozu, například Azure Traffic Manager, které vám zajišťují globální distribuci a snížené latence při práci s dynamickým obsahem. Tyto služby jsou však obvykle užitečné v případech, kdy musíte pracovat s webovými službami bez uchovávání stavu.

Pojďme hovořit o business logice. Strukturování business logiky, pracovních toků a komponenty

Takže jsme stihli probrat různé infrastrukturní aspekty systému. Je pravděpodobné, že uživatel si ani neuvědomuje všechny tyto prvky vašeho systému a upřímně řečeno, vůbec si s nimi nedělá starosti. Uživatel se zajímá o to, jaké to je interagovat s vaším systémem, co všechno je možné udělat, když se chováte tímto způsobem, a také jakým způsobem systém vykonává uživatelské příkazy, co a jak dělá s uživatelskými daty.

Jak je z názvu tohoto článku jasné, hodlal jsem hovořit o softwarové architektuře a návrhu systémů. Proto jsem neplánoval pokrýt návrhové vzory softwaru, které popisují, jak jsou vytvářeny softwarové komponenty. Nicméně čím více o tom přemýšlím, tím víc se mi zdá, že hranice mezi návrhovými vzory softwaru a architektonickými vzory je velmi rozmazaná a tyto dvě koncepty jsou úzce propojeny. Vezměme si například sledování událostí (event sourcing). Jakmile si osvojíte tento architektonický vzor, ovlivní to prakticky všechny aspekty vašeho systému: dlouhodobé uchovávání dat, úroveň konzistence, přijímanou ve vašem systému, siluetu komponentů v něm atd. Proto jsem se rozhodl zmínit některé architektonické vzory, které se přímo týkají business logiky. I když se v tomto článku musím omezit na jednoduchý seznam, doporučuji vám se s ním seznámit a zamyslet se nad myšlenkami souvisejícími s těmito vzory. Tady, prosím:

Kolaborativní přístupy

Je velmi nepravděpodobné, že se na projektu ocitnete jako ten účastník, který sám odpovídá za proces návrhu systému. Naopak, pravděpodobně budete muset spolupracovat s kolegy, kteří pracují jak v rámci vašeho úkolu, tak i mimo něj. V takovém případě může být potřeba posoudit zvolené technologické řešení společně s kolegy, vyčlenit obchodní potřeby a pochopit, jak nejlépe paralelizovat úkoly.

Softwarové architektura a návrh systémů: celkový přehled a průvodce zdroji

Fotografie Kaleidico z webu Unsplash

Nejdříve je potřeba vypracovat přesné a obecně uznávané představy o tom, jaký je obchodní cíl, který se snažíte dosáhnout, a s jakými pohyblivými prvky budete muset pracovat. Techniky skupinového modelování, konkrétně event storming (event storming) výrazně urychlují tento proces a zvyšují vaše šance na úspěch. Tohoto úkolu se můžete ujmout předtím, nebo poté, co vymezíte hranice vašich služeb, a pak ho prohlubovat, jak produkt zraje. Na základě úrovně shody, která zde bude dosažena, můžete také formulovat jednotný jazyk pro omezený kontext, v němž pracujete. Když bude potřeba hovořit o architektuře vašeho systému, může se vám hodit C4 model, navržený Simonem Brownem, zvlášť když je potřeba pochopit, jak hluboko se musíte ponořit do detailů problému, vizualizací věcí, které chcete sdělit.

Pravděpodobně existuje i jiná vyspělá technologie v této oblasti, která je stejně užitečná jako předmětově orientované navrhování. Přesto se nějakým způsobem vždy vracíme k porozumění předmětu, a proto se znalosti a zkušenosti v oblasti předmětově orientovaného navrhování budou vám určitě hodit.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster