Bequem architektonescht Muster

Hey Habr!

Am Liicht vun den aktuellen Eventer wĂ©inst dem Coronavirus hunn eng Zuel vun Internetservicer ugefaang eng erhĂ©icht Belaaschtung ze krĂ©ien. Zum Beispill, Eng vun de UK Retail Ketten huet einfach seng Online Bestellung Site gestoppt., well et net genuch KapazitĂ©it war. An et ass net Ă«mmer mĂ©iglech e Server ze beschleunegen andeems se einfach mĂ©i mĂ€chteg AusrĂŒstung bĂ€idroen, awer Client Ufroe musse veraarbecht ginn (oder se ginn un d'Konkurrenten).

An dësem Artikel wÀert ech kuerz iwwer populÀr Praktiken schwÀtzen, déi Iech erlaben e séieren a Feeler-tolerante Service ze kreéieren. Wéi och ëmmer, aus de méiglechen Entwécklungsschemaen, hunn ech nëmmen déi ausgewielt déi am Moment sinn einfach ze benotzen. Fir all Element hutt Dir entweder fÀerdeg Bibliothéiken, oder Dir hutt d'Méiglechkeet de Problem mat enger Cloud Plattform ze léisen.

Horizontal Skala

Deen einfachsten a bekanntste Punkt. Konventionell sinn dĂ©i meescht ĂŒblech zwee Lastverdeelungsschemaen horizontal a vertikal Skala. Am Ă©ischte Fall Dir erlaabt Servicer parallel ze lafen, doduerch d'Laascht tĂ«scht hinnen ze verdeelen. An der zweeter Dir bestellt mĂ©i mĂ€chteg Serveren oder optimĂ©iert de Code.

Zum Beispill wÀert ech abstrakt Cloud Dateilagerung huelen, dat ass e puer Analog vun OwnCloud, OneDrive, a sou weider.

E Standardbild vun esou engem Circuit ass hei ënnen, awer et weist nëmmen d'Komplexitéit vum System. No allem musse mir d'Servicer iergendwéi synchroniséieren. Wat geschitt wann de Benotzer eng Datei vun der Tablet spÀichert an se dann vum Telefon wëllt gesinn?

Bequem architektonescht Muster
Den Ënnerscheed tĂ«scht den Approchen: an der vertikaler SkalĂ©ierung si mir bereet fir d'Kraaft vun de Wirbelen z'erhĂ©ijen, an an der horizontaler SkalĂ©ierung si mir bereet fir nei Wirbelen ze addĂ©ieren fir d'Laascht ze verdeelen.

CQRS

Kommando Query ResponsabilitĂ©it Segregatioun E zimlech wichtegt Muster, well et erlaabt verschidde Clienten net nĂ«mme mat verschiddene Servicer ze verbannen, awer och dĂ©iselwecht Event Streams ze krĂ©ien. Seng Virdeeler sinn net sou offensichtlech fir eng einfach Applikatioun, awer et ass extrem wichteg (an einfach) fir e beschĂ€ftegt Service. Seng Essenz: EntrĂ©eĂ«n an erausginn Datestroum dĂ€erfen net intersectĂ©ieren. Dat ass, Dir kĂ«nnt keng Ufro schĂ©cken an eng Äntwert erwaarden; amplaz schĂ©ckt Dir eng Ufro un de Service A, awer kritt eng Äntwert vum Service B.

Den éischte Bonus vun dëser Approche ass d'FÀegkeet d'Verbindung ze briechen (am breede Sënn vum Wuert) wÀrend eng laang Ufro ausféiert. Zum Beispill, loosst eis eng méi oder manner Standard Sequenz huelen:

  1. De Client huet eng Ufro un de Server geschéckt.
  2. De Server huet eng laang VeraarbechtungszÀit ugefaang.
  3. De Server huet dem Client mam Resultat geÀntwert.

Loosst eis virstellen datt am Punkt 2 d'Verbindung gebrach ass (oder d'Netzwierk nees ugeschloss ass, oder de Benotzer ass op eng aner SĂ€it gaang an d'Verbindung gebrach). An dĂ«sem Fall wĂ€ert et schwĂ©ier sinn fir de Server eng Äntwert un de Benotzer ze schĂ©cken mat Informatioun iwwer wat genee veraarbecht gouf. Mat CQRS wĂ€ert d'Sequenz liicht anescht sinn:

  1. De Client huet op Updates abonnéiert.
  2. De Client huet eng Ufro un de Server geschéckt.
  3. De Server huet geÀntwert "Ufro akzeptéiert."
  4. De Server huet mam Resultat duerch de Kanal vum Punkt "1" geÀntwert.

Bequem architektonescht Muster

WĂ©i Dir kĂ«nnt gesinn, ass de Schema e bĂ«sse mĂ©i komplex. Ausserdeem fehlt dĂ©i intuitiv Ufro-Äntwert Approche hei. WĂ©i och Ă«mmer, wĂ©i Dir gesitt, wĂ€ert eng Verbindungsbrek beim Veraarbechtung vun enger Ufro net zu engem Feeler fĂ©ieren. Ausserdeem, wann de Benotzer tatsĂ€chlech vu verschiddenen Apparater mam Service ugeschloss ass (zum Beispill vun engem Handy a vun engem Tablet), kĂ«nnt Dir sĂ©cher sinn datt d'Äntwert op bĂ©id Apparater kĂ«nnt.

Interessanterweis gëtt de Code fir d'Veraarbechtung vun erakommen Messagen déiselwecht (net 100%) souwuel fir Eventer déi vum Client selwer beaflosst goufen, wéi och fir aner Eventer, och déi vun anere Clienten.

WĂ©i och Ă«mmer, a Wierklechkeet krĂ©ie mir en zousĂ€tzleche Bonus wĂ©inst der Tatsaach datt unidirektional Flow an engem funktionnelle Stil gehandhabt ka ginn (mat RX an Ă€hnlech). An dĂ«st ass schonn e seriöse Plus, well am Wesentlechen d'Applikatioun komplett reaktiv gemaach ka ginn, an och eng funktionell Approche benotzt. Fir Fett Programmer kann dĂ«st dĂ€itlech spueren EntwĂ©cklung an ËnnerstĂ«tzung Ressourcen.

Wa mir dĂ«s Approche mat horizontaler Skala kombinĂ©ieren, da krĂ©ie mir als Bonus d'FĂ€egkeet fir Ufroen op ee Server ze schĂ©cken an Äntwerte vun engem aneren ze krĂ©ien. Sou kann de Client de Service wielen, dee fir him bequem ass, an de System bannen wĂ€ert Ă«mmer nach fĂ€eg sinn d'Evenementer korrekt ze veraarbechten.

Event Sourcing

Wéi Dir wësst, ass eng vun den Haaptmerkmale vun engem verdeelte System d'Feele vun enger gemeinsamer ZÀit, eng gemeinsam kritesch Sektioun. Fir ee Prozess kënnt Dir eng Synchroniséierung maachen (op déiselwecht Mutexes), an dÀr Dir sécher sidd datt keen aneren dëse Code ausféiert. Wéi och ëmmer, dëst ass geféierlech fir e verdeelt System, well et Overhead erfuerdert, a wÀert och all d'Schéinheet vun der Skala ëmbréngen - all Komponente waarden nach ëmmer op een.

Vun hei krĂ©ie mir e wichtege Fakt - e sĂ©ier verdeelt System kann net synchronisĂ©iert ginn, well da wĂ€erte mir d'Performance reduzĂ©ieren. Op der anerer SĂ€it brauche mir dacks eng gewĂ«sse Konsistenz tĂ«scht Komponenten. A fir dĂ«s kĂ«nnt Dir d'Approche benotzen mat eventuell Konsequenz, wou et garantĂ©iert ass, datt wann et keng Daten Ännerungen fir eng ZĂ€it no der leschter AktualisĂ©ierung opgetrueden ("schlussendlech"), all Ufroen de leschten aktualisĂ©iert WĂ€ert zrĂ©ck.

Et ass wichteg ze verstoen datt fir klassesch Datenbanken et zimlech oft benotzt gëtt staark Konsequenz, wou all Node déi selwecht Informatioun huet (dëst ass oft erreecht am Fall wou d'Transaktioun als etabléiert ass nëmmen no der zweeter Server reagéiert). Et ginn e puer Entspanungen hei wéinst den Isolatiounsniveauen, awer déi allgemeng Iddi bleift déiselwecht - Dir kënnt an enger komplett harmoniséierter Welt liewen.

Wéi och ëmmer, loosst eis zréck op déi ursprénglech Aufgab. Wann en Deel vum System kann mat gebaut ginn eventuell Konsequenz, da kënne mir de folgenden Diagramm konstruéieren.

Bequem architektonescht Muster

Wichteg Fonctiounen vun dëser Approche:

  • All erakommen Ufro gĂ«tt an enger Schlaang gesat.
  • Beim Veraarbechtung vun enger Ufro kann de Service och Aufgaben an aner Schlaangen setzen.
  • All erakommen Event huet en IdentifizĂ©ierer (wat fir Entduplikatioun nĂ©ideg ass).
  • D'Schlaang funktionĂ©iert ideologesch no dem Schema "nĂ«mmen addĂ©ieren". Dir kĂ«nnt Elementer net ewechhuelen oder se nei arrangĂ©ieren.
  • D'Schlaang funktionnĂ©iert nom FIFO Schema (entschĂ«llegt fir d'Tautologie). Wann Dir parallel AusfĂ©ierung maache musst, da sollt Dir op enger Etapp Objeten a verschidde Schlaangen rĂ©ckelen.

Loosst mech Iech drun erĂ«nneren datt mir de Fall vun der Online Dateilagerung berĂŒcksichtegen. An dĂ«sem Fall wĂ€ert de System esou ausgesinn:

Bequem architektonescht Muster

Et ass wichteg datt d'Servicer am Diagramm net onbedéngt e separaten Server bedeiten. Och de Prozess kann d'selwecht sinn. Eng aner Saach ass wichteg: ideologesch sinn dës Saache sou getrennt datt d'horizontale Skaléierung einfach applizéiert ka ginn.

A fir zwee Benotzer wÀert d'Diagramm esou ausgesinn (Servicer, déi fir verschidde Benotzer geduecht sinn, ginn a verschiddene Faarwen uginn):

Bequem architektonescht Muster

Bonus vun esou enger Kombinatioun:

  • Informatiounsveraarbechtungsservicer sinn getrennt. D'Schlaangen sinn och getrennt. Wa mir de Systemduerchgang musse erhĂ©ijen, da musse mir just mĂ©i Servicer op mĂ©i Server lancĂ©ieren.
  • Wa mir Informatioune vun engem Benotzer krĂ©ien, musse mir net waarden bis d'DonnĂ©eĂ«n komplett gespĂ€ichert sinn. Am GĂ©igendeel, mir brauche just "ok" ze Ă€ntweren an dann lues a lues ufĂ€nken ze schaffen. Zur selwechter ZĂ€it glatt d'Schlaang d'Peaks aus, well d'AddĂ©iere vun engem neien Objet sĂ©ier geschitt, an de Benotzer muss net op e komplette Pass duerch de ganzen Zyklus waarden.
  • Als Beispill hunn ech en Deduplikatiounsservice bĂ€igefĂŒĂŒgt, dee probĂ©iert identesch Dateien ze fusionĂ©ieren. Wann et an 1% vun de FĂ€ll laang funktionnĂ©iert, wĂ€ert de Client et kaum bemierken (kuckt hei uewen), wat e grousse Plus ass, well mir net mĂ©i verlaangt sinn XNUMX% Geschwindegkeet an zouverlĂ€sseg ze sinn.

Allerdéngs sinn d'Nodeeler direkt sichtbar:

  • Eise System huet seng strikt Konsequenz verluer. DĂ«st bedeit datt wann Dir zum Beispill verschidde Servicer abonnĂ©iert, da kĂ«nnt Dir theoretesch en anere Staat krĂ©ien (well ee vun de Servicer vlĂ€icht keng ZĂ€it huet fir eng Notifikatioun vun der interner Schlaang ze krĂ©ien). Als aner Konsequenz huet de System elo keng gemeinsam ZĂ€it. Dat ass, et ass onmĂ©iglech, zum Beispill, all Eventer einfach no ArrivĂ©e ZĂ€it ze sortĂ©ieren, well d'Auer tĂ«scht Serveren vlĂ€icht net synchron sinn (ausserdeem ass dĂ©iselwecht ZĂ€it op zwee Server eng Utopie).
  • Keng Eventer kĂ«nnen elo einfach zrĂ©ckgezunn ginn (wĂ©i et mat enger Datebank gemaach ka ginn). Amplaz musst Dir en neit Event derbĂ€i setzen - Kompensatioun Event, dĂ©i de leschte Staat op dĂ©i nĂ©ideg Ă€nnert. Als e Beispill aus engem Ă€hnleche BerĂ€ich: ouni d'Geschicht Ă«mzeschreiwen (wat an e puer FĂ€ll schlecht ass), kĂ«nnt Dir net eng Verpflichtung am Git zrĂ©ckrollen, awer Dir kĂ«nnt e spezielle maachen rollback engagĂ©ieren, wat am Fong just den ale Staat zrĂ©ckkĂ«nnt. WĂ©i och Ă«mmer, souwuel de falschen Engagement wĂ©i d'Rollback bleiwen an der Geschicht.
  • D'Dateschema kann vu VerĂ«ffentlechung op VerĂ«ffentlechung Ă€nneren, awer al Eventer kĂ«nnen net mĂ©i op den neie Standard aktualisĂ©iert ginn (well d'Evenementer am Prinzip net geĂ€nnert kĂ«nne ginn).

WĂ©i Dir gesitt, funktionnĂ©iert Event Sourcing gutt mat CQRS. Ausserdeem, e System mat effizienten a praktesche Schlaangen Ă«mzesetzen, awer ouni Datefloss ze trennen, ass scho schwĂ©ier an sech selwer, well Dir musst SynchronisĂ©ierungspunkte addĂ©ieren, dĂ©i de ganze positiven Effekt vun de Schlaangen neutralisĂ©ieren. Wann Dir bĂ©id Approche glĂ€ichzĂ€iteg applizĂ©iert, ass et nĂ©ideg de Programmcode liicht unzepassen. An eisem Fall, wann Dir eng Datei op de Server schĂ©ckt, kĂ«nnt d'Äntwert nĂ«mmen "ok", dat heescht nĂ«mmen datt "d'Operatioun fir d'Datei derbĂ€izefĂ©ieren gouf gespĂ€ichert." Formell heescht dat net datt d'DonnĂ©eĂ«n schonn op aneren Apparater verfĂŒgbar sinn (zum Beispill kann den Entduplikatiounsservice den Index nei opbauen). WĂ©i och Ă«mmer, no enger ZĂ€it kritt de Client eng Notifikatioun am Stil vun "Datei X gouf gespĂ€ichert."

Als Resultat vun:

  • D'Zuel vun de Dateie-Send-Status geet erop: amplaz vum klassesche "Datei geschĂ©ckt", krĂ©ie mir zwee: "d'Datei ass an d'Schlaang um Server bĂ€igefĂŒĂŒgt" an "d'Datei gouf an der SpĂ€ichere gespĂ€ichert." Dat lescht bedeit datt aner Apparater scho kĂ«nnen ufĂ€nken d'Datei ze krĂ©ien (ugepasst fir d'Tatsaach datt d'Schlaangen mat verschiddene Geschwindegkeete funktionnĂ©ieren).
  • WĂ©inst der Tatsaach datt d'Soumissiounsinformatioun elo duerch verschidde KanĂ€l kĂ«nnt, musse mir mat LĂ©isunge kommen fir den Veraarbechtungsstatus vun der Datei ze krĂ©ien. Als Konsequenz dovunner: Am GĂ©igesaz zu der klassescher Ufro-Äntwert, kann de Client wĂ€hrend der Veraarbechtung vun der Datei nei gestart ginn, awer de Status vun dĂ«ser Veraarbechtung selwer wĂ€ert richteg sinn. Ausserdeem funktionnĂ©iert dĂ«sen Artikel am Wesentlechen aus der KĂ«scht. Als Konsequenz: Mir sinn elo mĂ©i tolerant gĂ©int Echec.

Schied

Wéi uewen beschriwwen, feelen Eventsourcing Systemer strikt Konsistenz. Dëst bedeit datt mir verschidde SpÀichere benotze kënnen ouni Synchroniséierung tëscht hinnen. Eise Problem Approche, kënne mir:

  • Trennt Dateien no Typ. Zum Beispill kĂ«nne Biller / Videoe dekodĂ©iert ginn an e mĂ©i effizient Format ka gewielt ginn.
  • Trennt Konten no Land. WĂ©inst ville Gesetzer kann dĂ«st erfuerderlech sinn, awer dĂ«st Architekturschema bitt esou eng Chance automatesch

Bequem architektonescht Muster

Wann Dir wëllt Daten vun engem Stockage an en anert Transfermaart, da Standard Moyene sinn net méi genuch. Leider, an dësem Fall, musst Dir d'Schlaang stoppen, d'Migratioun maachen, an dann starten. Am allgemenge Fall kënnen d'Donnéeën net "on the fly" transferéiert ginn, awer wann d'Evenementschlaang komplett gespÀichert ass, an Dir hutt Schnappschëss vu fréiere SpÀicherzoustand, da kënne mir d'Evenementer wéi follegt widderhuelen:

  • An Event Source huet all Event sĂ€in eegenen IdentifizĂ©ierer (am Idealfall, net erofgoen). DĂ«st bedeit datt mir e Feld an d'SpĂ€ichere kĂ«nne addĂ©ieren - d'Id vum leschte veraarbechten Element.
  • Mir duplizĂ©ieren d'Schlaang sou datt all Eventer fir e puer onofhĂ€ngeg SpĂ€ichere veraarbecht kĂ«nne ginn (dĂ©i Ă©ischt ass deen an deem d'DonnĂ©eĂ«n scho gespĂ€ichert sinn, an dĂ©i zweet ass nei, awer nach Ă«mmer eidel). DĂ©i zweet Schlaang gĂ«tt natierlech nach net veraarbecht.
  • Mir starten dĂ©i zweet Schlaang (dat ass, mir fĂ€nken un d'Evenementer ze spillen).
  • Wann dĂ©i nei Schlaang relativ eidel ass (dat ass, den DuerchschnĂ«ttszĂ€itdifferenz tĂ«scht derbĂ€isetzen vun engem Element an zrĂ©ckzĂ©ien ass akzeptabel), kĂ«nnt Dir d'Lieser op dĂ©i nei SpĂ€ichere wiesselen.

Wéi Dir gesitt, hu mir keng strikt Konsequenz an eisem System, an nach ëmmer net. Et gëtt nëmmen eventuell Konsistenz, dat heescht eng Garantie datt d'Evenementer an der selwechter Uerdnung veraarbecht ginn (awer méiglecherweis mat verschiddene Verspéidungen). A mat dësem kënne mir relativ einfach Daten transferéieren ouni de System op déi aner SÀit vum Globus ze stoppen.

Also, weider eist Beispill iwwer Online SpÀichere fir Dateien, esou eng Architektur gëtt eis schonn eng Rei vu Bonus:

  • Mir kĂ«nnen Objekter mĂ©i no bei de Benotzer op eng dynamesch ManĂ©ier rĂ©ckelen. Op dĂ«s ManĂ©ier kĂ«nnt Dir d'QualitĂ©it vum Service verbesseren.
  • Mir kĂ«nnen e puer Daten bannent Firmen spĂ€icheren. Zum Beispill, Enterprise Benotzer erfuerderen dacks datt hir DonnĂ©eĂ«n a kontrollĂ©ierten Datezentren gespĂ€ichert ginn (fir Datenleckungen ze vermeiden). Duerch Sharding kĂ«nne mir dĂ«st einfach Ă«nnerstĂ«tzen. An d'Aufgab ass nach mĂ©i einfach wann de Client eng kompatibel Cloud huet (zum Beispill, Azure selwer gehost).
  • An dat Wichtegst ass datt mir dat net musse maachen. No allem, fir unzefĂ€nken, wiere mir ganz zefridden mat enger SpĂ€ichere fir all Konten (fir sĂ©ier ze schaffen). An de SchlĂ«ssel Fonktioun vun dĂ«sem System ass, datt obwuel et erweidert ass, an der Ă©ischter Etapp ass et relativ einfach. Dir musst just net direkt Code schreiwen deen mat enger Millioun getrennten onofhĂ€ngege Schlaangen funktionnĂ©iert, etc. Wann nĂ©ideg, kann dat an Zukunft gemaach ginn.

Static Content Hosting

Dëse Punkt kann zimmlech offensichtlech schéngen, awer et ass nach ëmmer néideg fir eng méi oder manner Standard gelueden Applikatioun. Seng Essenz ass einfach: all statesch Inhalt gëtt net vum selwechte Server verdeelt wou d'Applikatioun lÀit, mee vu speziellen déi speziell fir dës Aufgab gewidmet sinn. Als Resultat ginn dës Operatiounen méi séier gemaach (bedingt nginx servéiert Dateien méi séier a manner deier wéi e Java Server). Plus CDN Architektur (Inhalt Liwwerung Network) erlaabt eis eis Dateie méi no bei den Endbenotzer ze lokaliséieren, wat e positiven Effekt op d'Bequemlechkeet vum Service huet.

Dat einfachst a meescht Standard Beispill vu statesche Inhalt ass eng Rei vu Scripten a Biller fir eng WebsÀit. Alles ass einfach mat hinnen - si sinn am Viraus bekannt, da gëtt d'Archiv op CDN Server eropgelueden, vu wou se un d'Endbenotzer verdeelt ginn.

Wéi och ëmmer, a Wierklechkeet, fir statesch Inhalter, kënnt Dir eng Approche benotzen e bësse Àhnlech wéi d'Lambda Architektur. Komme mer zréck op eis Aufgab (Online Dateilagerung), an dÀr mir Dateien un d'Benotzer musse verdeelen. Déi einfachst Léisung ass e Service ze kreéieren dee fir all Benotzerufro all déi néideg Kontrollen mécht (Autorisatioun, asw.), an dann d'Datei direkt vun eisem SpÀicher eroflueden. Den Haaptnodeel vun dëser Approche ass datt statesch Inhalt (an e Fichier mat enger gewësser Versioun ass tatsÀchlech statesch Inhalt) vum selwechte Server verdeelt gëtt deen d'GeschÀftslogik enthÀlt. Amplaz kënnt Dir déi folgend Diagramm maachen:

  • De Server bitt eng Download URL. Et kann aus der Form file_id + SchlĂ«ssel sinn, wou SchlĂ«ssel eng mini-digital ËnnerschrĂ«ft ass, dĂ©i d'Recht gĂ«tt fir op d'Ressource fir dĂ©i nĂ€chst 24 Stonnen ze kommen.
  • D'Datei gĂ«tt duerch einfach nginx mat de folgenden Optiounen verdeelt:
    • Inhalt Caching. ZĂ«nter dĂ«sem Service kann op engem separaten Server lokalisĂ©iert ginn, hu mir eis eng Reserve fir d'Zukunft hannerlooss mat der FĂ€egkeet all dĂ©i lescht erofgeluede Dateien op Disk ze spĂ€icheren.
    • IwwerprĂ©ift de SchlĂ«ssel am Moment vun der Verbindung Kreatioun
  • Optional: Streaming Inhaltsveraarbechtung. Zum Beispill, wa mir all Dateien am Service komprimĂ©ieren, da kĂ«nne mir direkt an dĂ«sem Modul unzipping maachen. Als Konsequenz: IO Operatiounen ginn gemaach wou se gehĂ©ieren. En Archiver am Java wĂ€ert ganz einfach vill extra GedĂ€chtnis allocĂ©ieren, awer e Service mat GeschĂ€ftslogik Ă«mzeschreiwen an Rust / C ++ Konditioune kann och net effikass sinn. An eisem Fall gi verschidde Prozesser (oder souguer Servicer) benotzt, an dofir kĂ«nne mir ganz effektiv GeschĂ€ftslogik an IO Operatiounen trennen.

Bequem architektonescht Muster

Dëse Schema ass net ganz Àhnlech wéi statesch Inhalter ze verdeelen (well mir net de ganze statesche Package iergendwou eroplueden), awer a Wierklechkeet ass dës Approche genee beschÀftegt mat der Verdeelung vun onverÀnnerbaren Donnéeën. Ausserdeem kann dëst Schema op aner FÀll generaliséiert ginn, wou den Inhalt net einfach statesch ass, mee kann als Set vun onverÀnnerbaren an net-lÀsche Blocken duergestallt ginn (och wann se derbÀi kënne ginn).

Als en anert Beispill (fir VerstĂ€erkung): wann Dir mat Jenkins / TeamCity geschafft hutt, da wĂ«sst Dir datt bĂ©id LĂ©isungen am Java geschriwwe sinn. BĂ©id vun hinnen sinn e Java-Prozess dee souwuel d'Bauorkestratioun an d'Inhaltsmanagement handhabt. Besonnesch si hunn allebĂ©id Aufgaben wĂ©i "e Fichier / Dossier vum Server transferĂ©ieren." Als Beispill: d'Ausstellung vun Artefakte, d'Iwwerdroung vun de Quellcode (wann den Agent de Code net direkt vum Repository erofluet, awer de Server mĂ©cht et fir hien), Zougang zu Logbicher. All dĂ«s Aufgaben Ă«nnerscheeden sech an hirer IO Belaaschtung. Dat heescht, et stellt sech eraus datt de Server, deen fir komplex GeschĂ€ftslogik verantwortlech ass, glĂ€ichzĂ€iteg fĂ€eg ass, grouss DatenflĂ«ss duerch sech selwer ze drĂ©cken. A wat am meeschten interessant ass, ass datt sou eng Operatioun un deeselwechten nginx delegĂ©iert ka ginn no genau deemselwechte Schema (ausser datt den DateschlĂ«ssel op d'Ufro bĂ€igefĂŒĂŒgt gĂ«tt).

Wéi och ëmmer, wa mir an eise System zréckkommen, kréie mir en Àhnlechen Diagramm:

Bequem architektonescht Muster

WĂ©i Dir kĂ«nnt gesinn, ass de System radikal mĂ©i komplex ginn. Elo ass et net nĂ«mmen e Mini-Prozess deen Dateien lokal spĂ€ichert. Elo wat erfuerderlech ass net dĂ©i einfachst ËnnerstĂ«tzung, API Versiounskontroll, etc. Dofir, nodeems all d'Diagrammer gezeechent sinn, ass et am beschten am Detail ze evaluĂ©ieren ob d'ExtensibilitĂ©it d'KĂ€schte wĂ€ert ass. WĂ©i och Ă«mmer, wann Dir de System ausbaue wĂ«llt (och fir mat enger nach mĂ©i grousser Zuel vu Benotzer ze schaffen), da musst Dir fir Ă€hnlech LĂ©isunge goen. Awer, als Resultat ass de System architektonesch prett fir erhĂ©icht Belaaschtung (bal all Komponent ka fir horizontale Skala gekloont ginn). De System kann aktualisĂ©iert ginn ouni et ze stoppen (einfach e puer Operatioune ginn liicht verlangsamt).

WĂ©i ech am Ufank gesot hunn, hunn elo eng Rei vun Internetservicer ugefaang mĂ©i Belaaschtung ze krĂ©ien. An e puer vun hinnen hunn einfach ugefaang richteg ze schaffen. TatsĂ€chlech hunn d'Systemer genee de Moment gescheitert, wou d'GeschĂ€ft Sue verdĂ©nge sollt. Dat ass, amplaz vun der Liwwerung ausgestallt, anstatt de Clienten ze proposĂ©ieren "Är Liwwerung fir dĂ©i nĂ€chst MĂ©int ze plangen", sot de System einfach "Gitt op Är Konkurrenten." TatsĂ€chlech ass dĂ«st de PrĂ€is vun enger gerĂ©nger ProduktivitĂ©it: Verloschter wĂ€erte genee optrieden wann d'Beneficer hĂ©chst sinn.

Konklusioun

All dës Approche waren virdru bekannt. Deeselwechte VK huet laang d'Iddi vu Static Content Hosting benotzt fir Biller ze weisen. Vill Online Spiller benotzen de Sharding Schema fir Spiller a Regiounen opzedeelen oder Spillplazen ze trennen (wann d'Welt selwer eng ass). Event Sourcing Approche gëtt aktiv an der E-Mail benotzt. Déi meescht Handelsapplikatioune wou Daten dauernd opgeholl ginn, sinn tatsÀchlech op enger CQRS Approche gebaut fir d'Daten ze filteren déi kritt ginn. Gutt, horizontal Skala gouf a ville Servicer fir eng zimlech laang ZÀit benotzt.

WĂ©i och Ă«mmer, am wichtegsten sinn all dĂ«s Mustere ganz einfach ginn an modernen Uwendungen z'applizĂ©ieren (wann se natierlech passend sinn). D'Wolleke bidden direkt Sharding an horizontale SkalĂ©ieren, wat vill mĂ©i einfach ass wĂ©i verschidde dedizĂ©ierten Serveren a verschiddenen Datenzenteren selwer ze bestellen. CQRS ass vill mĂ©i einfach ginn, wann nĂ«mmen wĂ©inst der EntwĂ©cklung vu BibliothĂ©iken wĂ©i RX. Virun ongefĂ©ier 10 Joer konnt eng rar WebsĂ€it dĂ«st Ă«nnerstĂ«tzen. Event Sourcing ass och onheemlech einfach ze konfigurĂ©ieren dank fĂ€erdege Container mat Apache Kafka. Virun 10 Joer wier dat eng Innovatioun gewiescht, elo ass et allgemeng. Et ass d'selwecht mat Static Content Hosting: duerch mĂ©i praktesch Technologien (och d'Tatsaach datt et detaillĂ©iert Dokumentatioun an eng grouss Datebank vun Äntwerten gĂ«tt), ass dĂ«s Approche nach mĂ©i einfach ginn.

Als Resultat ass d'Ëmsetzung vun enger Rei vun zimlech komplexen architektonesche Musteren elo vill mĂ©i einfach ginn, wat heescht datt et besser ass am Viraus mĂ©i genau ze kucken. Wann an enger zĂ©ng Joer aler Applikatioun eng vun den uewe genannte LĂ©isungen opginn gouf wĂ©inst den hĂ©ije KĂ€schte vun der Implementatioun an der Operatioun, elo, an enger neier Applikatioun, oder no der Refactoring, kĂ«nnt Dir e Service erstellen deen schonn architektonesch souwuel erweiterbar ass ( wat d'Leeschtung ugeet) a prett fir nei Ufroe vu Clienten (zum Beispill fir persĂ©inlech DonnĂ©eĂ«n ze lokalisĂ©ieren).

An am wichtegsten: benotzt w.e.g. dĂ«s Approche net wann Dir eng einfach Applikatioun hutt. Jo, si si schĂ©in an interessant, awer fir e Site mat engem HĂ©ichpunkt vun 100 Leit, kĂ«nnt Dir dacks mat engem klassesche Monolith duerchgoen (op d'mannst op der Äussewelt, alles bannen kann a Moduler opgedeelt ginn, etc.).

Source: will.com

Setzt e Commentaire