Byggstenar i distribuerade applikationer. Nollapproximationen

Byggstenar i distribuerade applikationer. Nollapproximationen

VÀrlden stÄr inte still. Framsteg skapar nya teknologiska utmaningar. I enlighet med de förÀndrade kraven mÄste ocksÄ arkitekturen för informationssystem evolutionera. Idag kommer vi att tala om hÀndelseorienterad arkitektur, konkurrens, parallellitet, samtidighet och hur man kan hantera allt detta pÄ ett harmoniskt sÀtt med Erlang.

Introduktion

Beroende pÄ storleken pÄ det planerade systemet och dess krav vÀljer vi som utvecklare sÀttet att utbyta information i systemet. I de flesta fall kan en arbetslösning för att organisera interaktion mellan tjÀnster vara en lösning med en broker, till exempel baserat pÄ RabbitMQ eller Kafka. Men ibland Àr hÀndelseflödet, SLA och nivÄn av kontroll över systemet sÄdana att en fÀrdig messaging-lösning inte passar. SjÀlvklart kan man komplicera systemet nÄgot genom att ta ansvar för transportnivÄn och bildandet av kluster, till exempel genom att anvÀnda ZeroMQ eller nanomsg. Men om systemet har tillrÀcklig bandbredd och kapacitet frÄn en standard Erlang-kluster, krÀver frÄgan om att lÀgga till en extra enhet noggrant övervÀgande och ekonomisk motivering.

Ämnet om reaktiva distribuerade applikationer Ă€r ganska omfattande. För att passa inom ramen för artikeln kommer dagens diskussion endast att omfatta homogena miljöer byggda pĂ„ Erlang/Elixir. Ekosystemet Erlang/OTP möjliggör implementering av reaktiv arkitektur med minimal arbetsinsats. Men i alla fall kommer vi att behöva ett lager för meddelandeutbyte.

Teoretisk grund

Designprocessen börjar med att faststĂ€lla mĂ„l och begrĂ€nsningar. Huvudsyftet ligger inte i att utveckla för utvecklandets skull. Vi behöver en sĂ€ker och skalbar verktyg som gör att vi kan skapa, och framför allt – utveckla moderna applikationer pĂ„ olika nivĂ„er: frĂ„n enskilda servrar som betjĂ€nar en liten publik, som kan utvecklas till kluster med 50-60 noder, till federationer av kluster. SĂ„ledes Ă€r huvudmĂ„let att maximera vinsten genom att minska kostnaderna för utveckling och Ă€gande av det slutliga systemet.

LÄt oss lyfta fram 4 huvudkrav för det slutliga systemet:

  • MedhĂ€ndelseorientering.
    Systemet Àr alltid redo att hantera ett flöde av hÀndelser och utföra nödvÀndiga ÄtgÀrder;
  • Mskala.
    Separata block kan skalas bÄde vertikalt och horisontellt. Hela systemet mÄste kunna vÀxa horisontellt i oÀndlighet;
  • Tillfelöverlevnad.
    Alla nivÄer och tjÀnster mÄste kunna ÄterhÀmta sig automatiskt vid fel;
  • Garanterad svarstid.
    Tid Àr vÀrdefullt och anvÀndare ska inte behöva vÀnta för lÀnge.

Kommer du ihÄg den gamla sagan om 'The little engine that could', Àven kÀnd som 'Puff-puff-tÄget'? För att det designade systemet framgÄngsrikt ska ta sig frÄn prototypstadiet till att vara progressivt, mÄste dess grund uppfylla minimi kraven. KUNDE.

Som ett infrastrukturellt verktyg och grund för alla tjÀnster lÀggs ytterligare en punkt till: anvÀndarvÀnlighet för programmerare.

HĂ€ndelseorientering

För att en applikation ska kunna vÀxa frÄn en servern till en kluster, mÄste dess arkitektur sÀkerstÀlla lÄg koppling. Detta krav uppfylls av den asynkrona modellen. HÀr tar avsÀndaren och mottagaren hand om den informativa belastningen av meddelandet och behöver inte oroa sig för överföring och routing inom systemet.

Skalbarhet

Skalbarhet och effektivitet i systemet gÄr hand i hand. Applikationens komponenter mÄste kunna anvÀnda alla tillgÀngliga resurser. Ju mer effektivt vi kan anvÀnda kraften och ju mer optimala vÄra bearbetningsmetoder Àr, desto mindre kostar vi för utrustning.

Inom en maskin skapar Erlang en högkonkurrensutsatt miljö. Balansen mellan konkurrens och parallellitet kan stÀllas in genom valet av antalet operativsystemstrÄdar som Àr tillgÀngliga för Erlang VM och antalet schemalÀggare som anvÀnder dessa trÄdar.
Erlang-processer har inget gemensamt tillstÄnd och arbetar i icke-blockerande lÀge. Detta ger en relativt lÄg latens och högre genomströmning jÀmfört med traditionella applikationer byggda pÄ blockerande synkronisering. Erlang-schemalÀggaren ansvarar för rÀttvis fördelning av CPU och IO, och avsaknaden av blockeringar gör att applikationen kan svara Àven under spikbelastningslÀgen eller vid fel.

I klustran finns det ocksÄ ett problem med resursutnyttjande. Det Àr viktigt att alla maskiner i klustret Àr jÀmnt belastade och att nÀtverket inte Àr överbelastat. TÀnk dig följande situation: anvÀndartrafik landar pÄ de inkommande lastbalanserarna (haproxy, nginx, etc.), och de fördelar sÄ jÀmnt som möjligt förfrÄgningar för behandling mellan en uppsÀttning tillgÀngliga backend-tjÀnster. Inom applikationsinfrastrukturen Àr tjÀnsten som tillhandahÄller det nödvÀndiga grÀnssnittet bara den sista milen och den behöver begÀra flera andra tjÀnster för att kunna svara pÄ den ursprungliga förfrÄgan. Internt begÀrningar krÀver ocksÄ routning och lastbalansering.
För att effektivt hantera dataflöden mÄste messaging tillhandahÄlla utvecklarna ett grÀnssnitt för att hantera routning och lastdistribution. Tack vare detta kan utvecklarna, med hjÀlp av mikrotjÀnst mönster (aggregator, proxy, kedja, gren, etc.), lösa bÄde standarduppgifter och sÀllan förekommande problem.

Ur ett affÀrsperspektiv Àr skalbarhet ett av verktygen för riskhantering. Det viktigaste Àr att tillfredsstÀlla kundernas krav genom att optimalt anvÀnda utrustningen:

  • Vid ökad utrustningskapacitet som ett resultat av framsteg. Den kommer inte att stĂ„ oanvĂ€nd pĂ„ grund av programvarans ofullkomlighet. Erlang skalar utmĂ€rkt vertikalt och kan alltid utnyttja alla CPU-kĂ€rnor och tillgĂ€ngligt minne;
  • I molnmiljöer kan vi hantera mĂ€ngden utrustning beroende pĂ„ nuvarande eller förvĂ€ntad belastning och garantera SLA.

Fel-tolerans

LÄt oss övervÀga tvÄ axiom: "FelkÀllor Àr oacceptabla" och "FelkÀllor kommer alltid att finnas". För verksamheten innebÀr programvarufel en förlust av pengar och, vad som Àr vÀrre, skada pÄ rykte. Genom att balansera möjliga förluster mot kostnaden för att utveckla felfri programvara kan man ofta hitta en kompromiss.

PÄ kort sikt sparar en arkitektur med inbyggd felresistens pengar pÄ att köpa fÀrdiga klusterlösningar. De Àr dyra, och de har ocksÄ sina fel.
PÄ lÄng sikt betalar sig en felresistent arkitektur flera gÄnger om kostnaderna för dess anvÀndning i alla utvecklingsstadier.
Messaging inom kodbasen Àr fortfarande under utveckling och möjliggör en detaljerad bearbetning av komponenternas interaktioner inom systemet. Detta förenklar uppgiften att reagera pÄ och hantera fel, eftersom alla berörda komponenter hanterar fel, och det slutliga systemet vet hur det automatiskt kan ÄtergÄ till ett normalt tillstÄnd efter ett fel by design.

Responsivitet

Oavsett fel ska applikationen svara pÄ förfrÄgningar och uppfylla SLA. Verkligheten Àr att mÀnniskor inte vill vÀnta, dÀrför mÄste verksamheten anpassa sig. Allt fler applikationer förvÀntas ha hög responsivitet.
Responsiva applikationer fungerar i en nÀra realtidsmiljö. Erlang VM fungerar i en mjuk realtidsmiljö. För vissa omrÄden, sÄsom aktiehandel, medicin och hantering av industriell utrustning, Àr en hÄrd realtidsmiljö viktigt.
Responsiva system förbÀttrar UX och Àr fördelaktiga för verksamheten.

PreliminÀrt resultat

NÀr jag planerade denna artikel ville jag dela med mig av erfarenheten av att skapa en meddelandeutbytesbroker och bygga komplexa system baserade pÄ den. Men den teoretiska och motivationsdelen blev ganska omfattande.
I den andra delen av artikeln kommer jag att berÀtta om nyanserna i implementeringen av utbytespunkter, meddelandeutbytesmönster och deras tillÀmpning.
I den tredje delen kommer vi att titta pÄ allmÀnna frÄgor kring organisationen av tjÀnster, rutten och lastbalansering. Vi kommer att diskutera den praktiska sidan av skalbarhet och systemens tillförlitlighet.

Slutet av första delen.

Foto @lucabravo.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster