{"id":80035,"date":"2020-05-02T13:42:54","date_gmt":"2020-05-02T11:42:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny"},"modified":"2020-05-02T13:42:54","modified_gmt":"2020-05-02T11:42:54","slug":"udobnye-arhitekturnye-patterny","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","title":{"rendered":"Modelet arkitekturore t\u00eb p\u00ebrshtatshme","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje, Habr!<\/p>\n<p><\/p>\n<p>N\u00eb drit\u00ebn e ngjarjeve aktuale p\u00ebr shkak t\u00eb koronavirusit, disa sh\u00ebrbime n\u00eb internet kan\u00eb filluar t\u00eb p\u00ebrballen me ngarkesa t\u00eb shtuar. P\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.independent.co.uk\/life-style\/gadgets-and-tech\/news\/coronavirus-ocado-down-app-website-stockpiling-food-online-delivery-a9402216.html\">nj\u00eb nga rrjetet tregtare n\u00eb Britanin\u00eb e Madhe thjesht e ndali faqen me porosit\u00eb online<\/a><\/noindex>, sepse nuk kishte mjaft kapacitete. Dhe jo gjithmon\u00eb \u00ebsht\u00eb e mundur t\u00eb shpejtohet serveri thjesht duke shtuar pajisje m\u00eb t\u00eb fuqishme, megjithat\u00eb k\u00ebrkesat e klient\u00ebve duhet t\u00eb p\u00ebrpunohen (ose ata do t\u00eb ikin tek konkurrencat).<\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb artikull do t'ju tregoj shkurtimisht p\u00ebr praktikat e njohura q\u00eb do t\u00eb lejojn\u00eb krijimin e nj\u00eb sh\u00ebrbimi t\u00eb shpejt\u00eb dhe t\u00eb q\u00ebndruesh\u00ebm. Megjithat\u00eb, nga format e mundshme t\u00eb zhvillimit kam p\u00ebrzgjedhur vet\u00ebm ato me t\u00eb cilat <strong>\u00ebsht\u00eb leht\u00eb t\u00eb p\u00ebrdoren<\/strong>. P\u00ebr \u00e7do pik\u00eb, ju tashm\u00eb keni biblioteka t\u00eb gatshme ose keni mund\u00ebsin\u00eb t\u00eb zgjidhni problemin p\u00ebrmes nj\u00eb platforme n\u00eb re.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"gorizontalnoe-masshtabirovanie\">Shkall\u00ebzim horizontal<\/h1>\n<p><\/p>\n<p>Nj\u00eb nga pikat m\u00eb t\u00eb thjeshta dhe t\u00eb njohura. N\u00eb m\u00ebnyr\u00eb kategorizuese, zakonisht ndodhin dy skema t\u00eb shp\u00ebrndarjes s\u00eb ngarkes\u00ebs\u2014shkall\u00ebzimi horizontal dhe vertikal. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%93%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">N\u00eb rastin e par\u00eb<\/a><\/noindex> ju lejoni sh\u00ebrbimet t\u00eb punojn\u00eb paralelisht, duke shp\u00ebrndar\u00eb k\u00ebshtu ngarkes\u00ebn midis tyre. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">N\u00eb t\u00eb dytin<\/a><\/noindex> ju porositni servera m\u00eb t\u00eb fuqish\u00ebm ose optimizoni kodin.<\/p>\n<p><\/p>\n<p>P\u00ebr shembull, do t\u00eb marr nj\u00eb ruajtje t\u00eb till\u00eb abstrakte t\u00eb skedar\u00ebve n\u00eb re, pra nj\u00eb analog t\u00eb OwnCloud, OneDrive dhe k\u00ebshtu me radh\u00eb.<\/p>\n<p><\/p>\n<p>Imazhi standard i nj\u00eb skeme t\u00eb till\u00eb \u00ebsht\u00eb m\u00eb posht\u00eb, megjithat\u00eb ajo tregon vet\u00ebm kompleksitetin e sistemit. Sepse duhet t\u00eb sinkronizojm\u00eb ndonj\u00ebher\u00eb sh\u00ebrbimet. \u00c7far\u00eb do t\u00eb ndodh\u00eb n\u00ebse nj\u00eb p\u00ebrdorues ruan nj\u00eb skedar nga tableti dhe m\u00eb pas d\u00ebshiron ta shikoj\u00eb at\u00eb nga telefoni?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/7512c6d8783f5e0a38cc0861b01e54c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDallimi midis qasjeve: n\u00eb shkall\u00ebzimin vertikal ne jemi t\u00eb gatsh\u00ebm t\u00eb rrisim fuqin\u00eb e nyjeve, nd\u00ebrsa n\u00eb at\u00eb horizontal\u2014t\u00eb shtojm\u00eb nyje t\u00eb reja p\u00ebr t\u00eb shp\u00ebrndar\u00eb ngarkes\u00ebn.<\/p>\n<p><\/p>\n<h1 id=\"cqrs\">CQRS<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/CQRS.html\">Command Query Responsibility Segregation<\/a><\/noindex> \u00ebsht\u00eb nj\u00eb model mjaft i r\u00ebnd\u00ebsish\u00ebm, pasi ndihmon klient\u00ebt e ndrysh\u00ebm t\u00eb lidhen me sh\u00ebrbime t\u00eb ndryshme dhe gjithashtu t\u00eb marrin t\u00eb nj\u00ebjtat rrjedha ngjarjesh. Avantazhet e tij nuk jan\u00eb aq t\u00eb dukshme p\u00ebr nj\u00eb aplikacion t\u00eb thjesht\u00eb, megjithat\u00eb ai \u00ebsht\u00eb jasht\u00ebzakonisht i r\u00ebnd\u00ebsish\u00ebm (dhe i thjesht\u00eb) p\u00ebr nj\u00eb sh\u00ebrbim t\u00eb ngarkuar. Pika e tij thelb\u00ebsore: rrjedhat hyr\u00ebse dhe dal\u00ebse t\u00eb t\u00eb dh\u00ebnave nuk duhet t\u00eb nd\u00ebrthuren. K\u00ebshtu q\u00eb nuk mund t\u00eb d\u00ebrgoni nj\u00eb k\u00ebrkes\u00eb dhe t\u00eb prisni nj\u00eb p\u00ebrgjigje, p\u00ebrkundrazi, ju d\u00ebrgoni nj\u00eb k\u00ebrkes\u00eb n\u00eb sh\u00ebrbimin A, por merrni p\u00ebrgjigjen n\u00eb sh\u00ebrbimin B.<\/p>\n<p><\/p>\n<p>Bonusi i par\u00eb i k\u00ebtij qasje \u00ebsht\u00eb mund\u00ebsia e nd\u00ebrprerjes s\u00eb lidhjes (n\u00eb kuptimin e gjer\u00eb t\u00eb k\u00ebsaj fjale) gjat\u00eb realizimit t\u00eb nj\u00eb k\u00ebrkese t\u00eb gjat\u00eb. Si nj\u00eb shembull, le t\u00eb marrim nj\u00eb sekuenc\u00eb m\u00eb shum\u00eb-m\u00eb pak standarde:<\/p>\n<p><\/p>\n<ol>\n<li>Klienti d\u00ebrgoi nj\u00eb k\u00ebrkes\u00eb n\u00eb server.<\/li>\n<li>Serveri filloi p\u00ebrpunimin e gjat\u00eb.<\/li>\n<li>Serveri iu p\u00ebrgjigj klientit me rezultatin.<\/li>\n<\/ol>\n<p><\/p>\n<p>Imagjinoni se n\u00eb pik\u00ebn 2 ndodhi nj\u00eb nd\u00ebrprerje e lidhjes (ose rrjeti u rivendos, ose p\u00ebrdoruesi kaloi n\u00eb nj\u00eb faqe tjet\u00ebr, duke nd\u00ebrprer\u00eb lidhjen). N\u00eb k\u00ebt\u00eb rast, serverit do t\u2019i jet\u00eb e v\u00ebshtir\u00eb t\u00eb d\u00ebrgoj\u00eb nj\u00eb p\u00ebrgjigje p\u00ebrdoruesit me informacionin se \u00e7far\u00eb u procesua. Duke aplikuar CQRS, sekuenca do t\u00eb jet\u00eb pak m\u00eb ndryshe:<\/p>\n<p><\/p>\n<ol>\n<li>Klienti u regjistrua p\u00ebr p\u00ebrdit\u00ebsime.<\/li>\n<li>Klienti d\u00ebrgoi nj\u00eb k\u00ebrkes\u00eb n\u00eb server.<\/li>\n<li>Serveri iu p\u00ebrgjigj: \"k\u00ebrkesa u pranua\".<\/li>\n<li>Serveri iu p\u00ebrgjigj me rezultatin n\u00ebp\u00ebrmjet kanalit t\u00eb pik\u00ebs \"1\".<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/8a00ea93eecc7cc0754122857c5f90d0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si\u00e7 shihet, skema \u00ebsht\u00eb pak m\u00eb e komplikuar. M\u00eb shum\u00eb se kaq, qasja intuitive k\u00ebrkes\u00eb-p\u00ebrgjigje k\u00ebtu mungon. Megjithat\u00eb, si\u00e7 shihet, nd\u00ebrprerja e lidhjes gjat\u00eb p\u00ebrpunimit t\u00eb k\u00ebrkes\u00ebs nuk do t\u00eb shkaktoj\u00eb nj\u00eb gabim. P\u00ebr m\u00eb tep\u00ebr, n\u00ebse p\u00ebrdoruesi \u00ebsht\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb i lidhur me sh\u00ebrbimin nga disa pajisje (p\u00ebr shembull, nga telefoni celular dhe nga tableta), \u00ebsht\u00eb e mundur t\u00eb b\u00ebhet q\u00eb p\u00ebrgjigja t\u00eb vij\u00eb n\u00eb t\u00eb dy pajisjet.<\/p>\n<p><\/p>\n<p>E ve\u00e7anta \u00ebsht\u00eb se kodi p\u00ebr p\u00ebrpunimin e mesazheve t\u00eb ardhshme b\u00ebhet i nj\u00ebjt\u00eb (jo 100%) si p\u00ebr ngjarjet q\u00eb ndikon vet\u00eb klienti, ashtu edhe p\u00ebr ngjarjet e tjera, duke p\u00ebrfshir\u00eb ato nga klient\u00eb t\u00eb tjer\u00eb.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, n\u00eb realitet, ne marrim bonuset e tjera q\u00eb lidhen me faktin se rrjedha nj\u00ebkah\u00ebshe mund t\u00eb p\u00ebrpunohet n\u00eb stilin funksional (duke p\u00ebrdorur RX dhe analoge). Dhe kjo \u00ebsht\u00eb nj\u00eb p\u00ebrfitim serioz, sepse n\u00eb thelb aplikacioni mund t\u00eb b\u00ebhet plot\u00ebsisht reaktiv, madje duke p\u00ebrdorur qasjen funksionale. P\u00ebr programet e m\u00ebdha, kjo mund t\u00eb kursej\u00eb ndjesh\u00ebm burimet p\u00ebr zhvillim dhe mb\u00ebshtetje.<\/p>\n<p><\/p>\n<p>N\u00ebse e bashkojm\u00eb k\u00ebt\u00eb qasje me shkall\u00ebzimin horizontal, at\u00ebher\u00eb kemi mund\u00ebsin\u00eb p\u00ebr t\u00eb d\u00ebrguar k\u00ebrkesa n\u00eb nj\u00eb server, nd\u00ebrsa t\u00eb marrim p\u00ebrgjigje nga nj\u00eb tjet\u00ebr. K\u00ebshtu, klienti mund t\u00eb zgjedh\u00eb sh\u00ebrbimin q\u00eb i p\u00ebrshtatet m\u00eb mir\u00eb, nd\u00ebrsa sistemi brenda do t\u00eb jet\u00eb ende n\u00eb gjendje t\u00eb procesoj\u00eb ngjarjet n\u00eb m\u00ebnyr\u00eb korrekte.<\/p>\n<p><\/p>\n<h1 id=\"event-sourcing\">Event Sourcing<\/h1>\n<p><\/p>\n<p>Si keni, nj\u00eb nga karakteristikat kryesore t\u00eb nj\u00eb sistemi t\u00eb shp\u00ebrndar\u00eb \u00ebsht\u00eb mungesa e nj\u00eb kohe t\u00eb p\u00ebrbashk\u00ebt, nj\u00eb seksioni kritik t\u00eb p\u00ebrbashk\u00ebt. P\u00ebr nj\u00eb proces, mund t\u00eb b\u00ebni sinkronizimin (n\u00eb t\u00eb nj\u00ebjtat mutex), brenda t\u00eb cilit jeni t\u00eb sigurt se askush tjet\u00ebr nuk po ekzekuton k\u00ebt\u00eb kod. Megjithat\u00eb, p\u00ebr nj\u00eb sistem t\u00eb shp\u00ebrndar\u00eb, di\u00e7ka e till\u00eb \u00ebsht\u00eb e rrezikshme, pasi do t\u00eb k\u00ebrkohen kostot shtes\u00eb, dhe gjithashtu do t\u00eb d\u00ebmtohet e gjith\u00eb bukuria e shkall\u00ebzimit - gjithsesi t\u00eb gjith\u00eb komponent\u00ebt do t\u00eb pretendojn\u00eb nj\u00eb gj\u00eb.<\/p>\n<p><\/p>\n<p>Nga k\u00ebtu marrim nj\u00eb fakt t\u00eb r\u00ebnd\u00ebsish\u00ebm - nj\u00eb sistem t\u00eb shp\u00ebrndar\u00eb t\u00eb shpejt\u00eb nuk mund t\u00eb sinkronizohet, sepse ndryshe do t\u00eb zvog\u00eblojm\u00eb performanc\u00ebn. Nga ana tjet\u00ebr, shpesh na nevojitet nj\u00eb konsistenc\u00eb e caktuar e komponent\u00ebve. Dhe p\u00ebr k\u00ebt\u00eb mund t\u00eb p\u00ebrdorim qasjen me <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">konsistenc\u00eb eventuale<\/a><\/noindex>, ku garanton se n\u00eb munges\u00eb t\u00eb ndryshimeve t\u00eb t\u00eb dh\u00ebnave p\u00ebrmes nj\u00eb periudhe t\u00eb caktuar kohe pas p\u00ebrdit\u00ebsimit t\u00eb fundit (\u201cn\u00eb fund t\u00eb fundit\u201d) t\u00eb gjith\u00eb k\u00ebrkesat do t\u00eb kthejn\u00eb vler\u00ebn e fundit t\u00eb p\u00ebrdit\u00ebsuar.<\/p>\n<p><\/p>\n<p>\u00cbsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb kuptohet se p\u00ebr bazat e t\u00eb dh\u00ebnave klasike aplikohet mjaft shpesh <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Consistency_model#Strict_consistency\">konsistenca e rrept\u00eb<\/a><\/noindex>, ku \u00e7do nyje zot\u00ebron t\u00eb nj\u00ebjtat informacione (kjo shpesh arrihet kur nj\u00eb transaksion konsiderohet i vendosur vet\u00ebm pas p\u00ebrgjigjes nga serveri i dyt\u00eb). K\u00ebtu ka disa leht\u00ebsira p\u00ebr shkak t\u00eb niveleve t\u00eb izolimit, megjithat\u00eb thelbi i p\u00ebrgjithsh\u00ebm mbetet i nj\u00ebjt\u00eb - mund t\u00eb jetoni n\u00eb nj\u00eb bot\u00eb plot\u00ebsisht t\u00eb konsoliduar.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, le t\u00eb kthehemi n\u00eb detyr\u00ebn fillestare. N\u00ebse nj\u00eb pjes\u00eb e sistemit mund t\u00eb nd\u00ebrtohet me <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">konsistenc\u00eb eventuale<\/a><\/noindex>, at\u00ebher\u00eb mund t\u00eb nd\u00ebrtojm\u00eb skem\u00ebn e m\u00ebposhtme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/33c80be6bc33bd897ca9b9e5525f9ae8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Karakteristikat e r\u00ebnd\u00ebsishme t\u00eb k\u00ebtij Qasjeje:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c7do k\u00ebrkes\u00eb hyr\u00ebse vendoset n\u00eb nj\u00eb radh\u00eb.<\/li>\n<li>N\u00eb procesin e p\u00ebrpunimit t\u00eb k\u00ebrkes\u00ebs, sh\u00ebrbimi gjithashtu mund t\u00eb vendos\u00eb detyra n\u00eb radh\u00eb t\u00eb tjera.<\/li>\n<li>\u00c7do ngjarje hyr\u00ebse ka nj\u00eb identifikues (i cili \u00ebsht\u00eb i nevojsh\u00ebm p\u00ebr deduplication).<\/li>\n<li>Radh\u00ebs punon ideologjikisht sipas skem\u00ebs &quot;vet\u00ebm shto&quot;. Elementet nuk mund t\u00eb fshihen ose t\u00eb zhvendosen nga ajo.<\/li>\n<li>Radh\u00eb punon sipas skem\u00ebs FIFO (ndjes\u00eb p\u00ebr tautologjin\u00eb). N\u00ebse \u00ebsht\u00eb e nevojshme t\u00eb b\u00ebhet ekzekutim paralel, at\u00ebher\u00eb n\u00eb nj\u00eb nga fazat duhen transferuar objektet n\u00eb radh\u00eb t\u00eb ndryshme.<\/li>\n<\/ul>\n<p><\/p>\n<p>T\u00eb kujtoj se po shqyrtojm\u00eb rastin e nj\u00eb ruajtjeje online t\u00eb skedar\u00ebve. N\u00eb k\u00ebt\u00eb rast, sistemi do t\u00eb duket, p\u00ebraf\u00ebrsisht, k\u00ebshtu:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/b95efb29545dcde1db9432d12d00a1b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cbsht\u00eb e r\u00ebnd\u00ebsishme q\u00eb sh\u00ebrbimet n\u00eb Diagram jan\u00eb t\u00eb domosdoshme p\u00ebr t'u kuptuar si server\u00eb t\u00eb ndar\u00eb. Edhe procesi mund t\u00eb jet\u00eb i nj\u00ebjt\u00eb. E r\u00ebnd\u00ebsishme \u00ebsht\u00eb q\u00eb ideologjikisht k\u00ebto gj\u00ebra jan\u00eb ndar\u00eb n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb, q\u00eb t\u00eb mund t\u00eb aplikohet leht\u00eb shkall\u00ebzimi horizontal.<\/p>\n<p><\/p>\n<p>Dhe p\u00ebr dy p\u00ebrdorues, skema do t\u00eb duket k\u00ebshtu (sh\u00ebrbimet q\u00eb jan\u00eb p\u00ebr p\u00ebrdorues t\u00eb ndrysh\u00ebm jan\u00eb treguar me ngjyra t\u00eb ndryshme):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/4c4aadc8b9dd505c3ad743e69fee4fae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bonus\u00ebt nga nj\u00eb kombinim t\u00eb till\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>Sh\u00ebrbimet e p\u00ebrpunimit t\u00eb informacionit jan\u00eb t\u00eb ndara. Radh\u00ebt gjithashtu jan\u00eb t\u00eb ndara. N\u00ebse na nevojitet t\u00eb rrisim kapacitetin e sistemit, at\u00ebher\u00eb mjafton t\u00eb nisni m\u00eb shum\u00eb sh\u00ebrbime n\u00eb num\u00ebr m\u00eb t\u00eb madh server\u00ebsh.<\/li>\n<li>Kur marrim informacion nga p\u00ebrdoruesi, nuk \u00ebsht\u00eb e domosdoshme q\u00eb t\u00eb presim ruajtjen e plot\u00eb t\u00eb t\u00eb dh\u00ebnave. P\u00ebrkundrazi, na mjafton t\u00eb p\u00ebrgjigjemi me 'ok', dhe pastaj fillojm\u00eb gradualisht pun\u00ebn. Po ashtu, radha zbut kulmin, pasi shtimi i nj\u00eb objekti t\u00eb ri ndodh shpejt, dhe p\u00ebrdoruesi nuk duhet t\u00eb pres\u00eb nj\u00eb kalim t\u00eb plot\u00eb p\u00ebrmes gjith\u00eb ciklit.<\/li>\n<li>Si nj\u00eb shembull, kam shtuar sh\u00ebrbimin e deduplikimit, i cili p\u00ebrpiqet t\u00eb bashkoj\u00eb skedar\u00ebt e nj\u00ebjt\u00eb. N\u00ebse ai punon p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb n\u00eb 1% t\u00eb rasteve, klienti s'ka p\u00ebr ta v\u00ebn\u00eb re at\u00eb (shih m\u00eb sip\u00ebr), q\u00eb \u00ebsht\u00eb nj\u00eb avantazh i madh, pasi nuk k\u00ebrkohet nga ne nj\u00eb shpejt\u00ebsi dhe q\u00ebndrushm\u00ebri nj\u00ebqind p\u00ebrqind.<\/li>\n<\/ul>\n<p><\/p>\n<p>Megjithat\u00eb, menj\u00ebher\u00eb duken edhe disavantazhet:<\/p>\n<p><\/p>\n<ul>\n<li>Sistemi yn\u00eb ka humbur marr\u00ebveshjen e estrik\u0442\u0456\u0432\u00eb. Kjo do t\u00eb thot\u00eb, p\u00ebr shembull, se n\u00ebse regjistrohemi n\u00eb sh\u00ebrbime t\u00eb ndryshme, teorikisht mund t\u00eb marrim nj\u00eb gjendje t\u00eb ndryshme (pasi nj\u00eb nga sh\u00ebrbimet mund t\u00eb mos arrij\u00eb t'i pranoj\u00eb njoftimin nga radha e brendshme). Si nj\u00eb pasoj\u00eb tjet\u00ebr, sistemi tani nuk ka nj\u00eb koh\u00eb t\u00eb p\u00ebrgjithshme. Do t\u00eb thot\u00eb se nuk \u00ebsht\u00eb e mundur, p\u00ebr shembull, t\u00eb renditni t\u00eb gjitha ngjarjet vet\u00ebm sipas koh\u00ebs s\u00eb mb\u00ebrritjes, pasi or\u00ebt midis server\u00ebve mund t\u00eb mos jen\u00eb sinkronike (m\u00eb shum\u00eb, nj\u00eb koh\u00eb e nj\u00ebjt\u00eb n\u00eb dy servera \u00ebsht\u00eb nj\u00eb utopi).<\/li>\n<li>Asnj\u00eb ngjarje nuk mund t\u00eb rikthehet thjesht tani (si\u00e7 do t\u00eb mund t\u00eb b\u00ebhej me nj\u00eb baz\u00eb t\u00eb dh\u00ebnash). N\u00eb vend t\u00eb k\u00ebsaj, \u00ebsht\u00eb e nevojshme ta shtoni nj\u00eb ngjarje t\u00eb re \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49451237\/compensating-events-on-cqrs-es-architecture\">ngjarje kompensimi<\/a><\/noindex>, e cila do ta ndryshoj\u00eb gjendjen e fundit n\u00eb at\u00eb q\u00eb nevojitet. Si nj\u00eb shembull nga nj\u00eb fush\u00eb e ngjashme: pa rip\u00ebrs\u00ebritjen e historis\u00eb (\u00e7far\u00eb \u00ebsht\u00eb e k\u00ebqij n\u00eb disa raste) n\u00eb git, nuk mund t\u00eb rikthehet nj\u00eb commit, megjithat\u00eb mund t\u00eb b\u00ebhet nj\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/docs\/git-revert\">commit rikthimi<\/a><\/noindex>, i cili n\u00eb thelb do ta rikthej\u00eb gjendjen e vjet\u00ebr. Megjithat\u00eb, historia do t\u00eb ruaj\u00eb si komitin e gabuar ashtu edhe rollback-un.<\/li>\n<li>Schemat e t\u00eb dh\u00ebnave mund t\u00eb ndryshojn\u00eb nga nj\u00eb publikim n\u00eb tjetrin, megjithat\u00eb ngjarjet e vjetra tani nuk mund t\u00eb p\u00ebrdit\u00ebsohen n\u00eb standardin e ri (sepse ngjarjet n\u00eb parim nuk mund t\u00eb ndryshohen).<\/li>\n<\/ul>\n<p><\/p>\n<p>Si\u00e7 duket, Event Sourcing p\u00ebrputhet plot\u00ebsisht me CQRS. P\u00ebr m\u00eb tep\u00ebr, implementimi i nj\u00eb sistemi me radh\u00eb efektive dhe t\u00eb rehatshme, por pa ndarjen e rrjedhave t\u00eb t\u00eb dh\u00ebnave, \u00ebsht\u00eb vet\u00eb nj\u00eb sfid\u00eb, pasi do t\u00eb ket\u00eb nevoj\u00eb p\u00ebr shtimin e pikave t\u00eb sinkronizimit, t\u00eb cilat do t\u00eb neutralizojn\u00eb t\u00eb gjith\u00eb efektin pozitiv t\u00eb radh\u00ebve. Duke aplikuar t\u00eb dy qasjet nj\u00ebkoh\u00ebsisht, \u00ebsht\u00eb e nevojshme t\u00eb b\u00ebhen disa rregullime t\u00eb vogla n\u00eb kodin e programit. N\u00eb rastin ton\u00eb, kur d\u00ebrgohet nj\u00eb skedar n\u00eb server, p\u00ebrgjigja \u00ebsht\u00eb vet\u00ebm \"ok\", q\u00eb do t\u00eb thot\u00eb se \"operacioni i shtimit t\u00eb skedarit \u00ebsht\u00eb ruajtur\". Formalisht, kjo nuk do t\u00eb thot\u00eb se t\u00eb dh\u00ebnat jan\u00eb tashm\u00eb t\u00eb aksesueshme n\u00eb pajisje t\u00eb tjera (p\u00ebr shembull, sh\u00ebrbimi i deduplikimit mund t\u00eb rind\u00ebrtoj\u00eb indeksin). Megjithat\u00eb, pas nj\u00eb kohe, klientit do t'i vij\u00eb nj\u00eb njoftim n\u00eb stilin \"skedari X \u00ebsht\u00eb ruajtur.\"<\/p>\n<p><\/p>\n<p>Si rezultat:<\/p>\n<p><\/p>\n<ul>\n<li>Numri i status\u00ebve t\u00eb d\u00ebrges\u00ebs s\u00eb skedar\u00ebve rritet: p\u00ebrve\u00e7 \"skedari \u00ebsht\u00eb d\u00ebrguar\" klasik, tani marrim dy: \"skedari \u00ebsht\u00eb shtuar n\u00eb radh\u00eb n\u00eb server\" dhe \"skedari \u00ebsht\u00eb ruajtur n\u00eb ruajtje\". E fundit do t\u00eb thot\u00eb se pajisje t\u00eb tjera mund t\u00eb fillojn\u00eb t\u00eb marrin skedarin (me p\u00ebrjashtim t\u00eb faktit q\u00eb radh\u00ebt punojn\u00eb me shpejt\u00ebsi t\u00eb ndryshme).<\/li>\n<li>P\u00ebr shkak se informacioni rreth d\u00ebrges\u00ebs tani vjen p\u00ebrmes kanaleve t\u00eb ndryshme, na nevojitet t\u00eb gjejm\u00eb zgjidhje p\u00ebr t\u00eb marr\u00eb statusin e p\u00ebrpunimit t\u00eb skedarit. Si rezultat i k\u00ebsaj: ndryshe nga request-response klasik, klienti mund t\u00eb riaktivizohet gjat\u00eb p\u00ebrpunimit t\u00eb skedarit, megjithat\u00eb statusi i p\u00ebrpunimit do t\u00eb jet\u00eb i sakt\u00eb. Dhe ky pik\u00eb funksionon, n\u00eb thelb, nga fabrika. Si pasoj\u00eb: tani jemi m\u00eb tolerant ndaj d\u00ebshtimeve.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sharding\">Sharding<\/h1>\n<p><\/p>\n<p>Si\u00e7 u p\u00ebrmend m\u00eb sip\u00ebr, n\u00eb sistemet me event sourcing mungon konsistenca e rrept\u00eb. K\u00ebshtu, mund t\u00eb p\u00ebrdorim disa depo pa ndonj\u00eb sinkronizim midis tyre. Duke u afruar me detyr\u00ebn ton\u00eb, ne mund:<\/p>\n<p><\/p>\n<ul>\n<li>T\u00eb ndajm\u00eb skedar\u00ebt sipas tipave. P\u00ebr shembull, imazhet\/video mund t\u00eb dekodohen dhe t\u00eb zgjidhet nj\u00eb format m\u00eb efikas.<\/li>\n<li>T\u00eb ndara llogarit\u00eb sipas vendeve. P\u00ebr shkak t\u00eb shum\u00eb ligjeve, kjo mund t\u00eb jet\u00eb e nevojshme, megjithat\u00eb, kjo struktur\u00eb arkitekturore jep mund\u00ebsin\u00eb p\u00ebr ta b\u00ebr\u00eb automatikisht.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/dd310df700bc39c014d0105a3425fece.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse d\u00ebshironi t\u00eb transferoni t\u00eb dh\u00ebnat nga nj\u00eb depo n\u00eb nj\u00eb tjet\u00ebr, at\u00ebher\u00eb k\u00ebtu standardet nuk mjaftojn\u00eb. Fatkeq\u00ebsisht, n\u00eb k\u00ebt\u00eb rast \u00ebsht\u00eb e nevojshme t\u00eb ndaloni radh\u00ebn, t\u00eb b\u00ebni migrimin, dhe pastaj ta nisni p\u00ebrs\u00ebri. N\u00eb p\u00ebrgjith\u00ebsi, t\u00eb dh\u00ebnat nuk mund t\u00eb transferohen \"n\u00eb flak\u00eb\", megjithat\u00eb, n\u00ebse radh\u00ebt e ngjarjeve ruhen plot\u00ebsisht dhe ju keni kopje t\u00eb gjendjeve t\u00eb m\u00ebparshme t\u00eb depozitave, at\u00ebher\u00eb ne mund t\u00eb rip\u00ebrjetojm\u00eb ngjarjet si m\u00eb posht\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00eb Event Source \u00e7do ngjarje ka identifikuesin e saj (idealisht \u2013 q\u00eb nuk zvog\u00eblohet). Pra, n\u00eb depozit\u00eb ne mund t\u00eb shtojm\u00eb nj\u00eb fush\u00eb \u2013 id e elementit t\u00eb fundit t\u00eb p\u00ebrpunuar.<\/li>\n<li>Dubloni radh\u00ebn, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb gjitha ngjarjet t\u00eb mund t\u00eb p\u00ebrpunohen p\u00ebr disa depo t\u00eb pavarura (e para \u00ebsht\u00eb ajo, n\u00eb t\u00eb cil\u00ebn tashm\u00eb ruhen t\u00eb dh\u00ebnat, dhe e dyta \u00ebsht\u00eb e re, megjithat\u00eb p\u00ebr momentin e zbraz\u00ebt). Radh\u00eb e dyt\u00eb, natyrisht, p\u00ebr koh\u00ebn e tanishme nuk p\u00ebrpunoset.<\/li>\n<li>Nisim radh\u00ebn e dyt\u00eb (dometh\u00ebn\u00eb fillojm\u00eb rip\u00ebrjetimin e ngjarjeve).<\/li>\n<li>Kur radh\u00eb e re t\u00eb jet\u00eb relativisht e zbraz\u00ebt (dmth. diferenca mes mesatare kohore midis shtimit t\u00eb nj\u00eb elementi dhe nxjerrjes s\u00eb tij do t\u00eb jet\u00eb e pranueshme), mund t\u00eb fillojm\u00eb t\u00eb kalojm\u00eb lexuesit n\u00eb depozita t\u00eb re.<\/li>\n<\/ul>\n<p><\/p>\n<p>Si\u00e7 shihet, sistemi yn\u00eb si nuk kishte as nuk ka nj\u00eb konsistenc\u00eb t\u00eb rrept\u00eb. Ka vet\u00ebm eventual constistency, dometh\u00ebn\u00eb garancia q\u00eb ngjarjet p\u00ebrpunohen n\u00eb t\u00eb nj\u00ebjtin rend (megjithat\u00eb, ndoshta, me vonesa t\u00eb ndryshme). Dhe, duke e p\u00ebrdorur k\u00ebt\u00eb, ne mund ta transferojm\u00eb relativisht leht\u00ebsisht t\u00eb dh\u00ebnat pa ndaluar sistemin n\u00eb an\u00ebn tjet\u00ebr t\u00eb globit.<\/p>\n<p><\/p>\n<p>K\u00ebshtu, duke vazhduar shembullin ton\u00eb p\u00ebr depozitimin online t\u00eb skedar\u00ebve, nj\u00eb arkitektur\u00eb e till\u00eb tashm\u00eb na jep disa p\u00ebrfitime:<\/p>\n<p><\/p>\n<ul>\n<li>Ne mund t\u00eb l\u00ebvizim objektet m\u00eb af\u00ebr p\u00ebrdoruesve, duke e b\u00ebr\u00eb k\u00ebt\u00eb n\u00eb m\u00ebnyr\u00eb dinamike. K\u00ebshtu, mund t\u00eb p\u00ebrmir\u00ebsojm\u00eb cil\u00ebsin\u00eb e sh\u00ebrbimit. <\/li>\n<li>Ne mund t\u00eb ruajm\u00eb pjes\u00ebn e t\u00eb dh\u00ebnave brenda kompanive. P\u00ebr shembull, p\u00ebrdoruesit Enterprise shpesh k\u00ebrkojn\u00eb q\u00eb t\u00eb dh\u00ebnat e tyre t\u00eb ruhen n\u00eb qendrat e t\u00eb dh\u00ebnave t\u00eb kontrolluara (p\u00ebr t\u00eb shmangur rrjedhjen e t\u00eb dh\u00ebnave). Fal\u00eb sharding, ne mund ta mb\u00ebshtesim leht\u00ebsisht k\u00ebt\u00eb. Dhe detyra b\u00ebhet edhe m\u00eb e thjesht\u00eb n\u00ebse klienti ka nj\u00eb cloud t\u00eb p\u00ebrputhsh\u00ebm (p\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-gb\/azure-stack\/asdk\/asdk-what-is?view=azs-1910\">Azure self hosted<\/a><\/noindex>).<\/li>\n<li>Dhe gj\u00ebja m\u00eb e r\u00ebnd\u00ebsishme \u00ebsht\u00eb se ne nuk e kemi obligimin t\u00eb b\u00ebjm\u00eb k\u00ebt\u00eb. N\u00eb fillim, nj\u00eb depo do t\u00eb ishte e mjaftueshme p\u00ebr t\u00eb gjitha llogarit\u00eb (q\u00eb t\u00eb fillojm\u00eb t\u00eb punojm\u00eb m\u00eb shpejt). Dhe ve\u00e7oria ky\u00e7e e k\u00ebtij sistemi \u2014 ndon\u00ebse \u00ebsht\u00eb e zgjerueshme, n\u00eb fillim \u00ebsht\u00eb mjaft e thjesht\u00eb. Thjesht nuk duhet t\u00eb shkruajm\u00eb menj\u00ebher\u00eb kodin q\u00eb punon me nj\u00eb milion radh\u00eb t\u00eb pavarura, etj. N\u00ebse \u00ebsht\u00eb e nevojshme, mund ta b\u00ebjm\u00eb k\u00ebt\u00eb n\u00eb t\u00eb ardhmen.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"static-content-hosting\">Hostimi i P\u00ebrmbajtjes Statike<\/h1>\n<p><\/p>\n<p>Ky punkt mund t\u00eb duket krejt\u00ebsisht i qart\u00eb, por prap\u00eb \u00ebsht\u00eb e nevojshme p\u00ebr nj\u00eb aplikacion t\u00eb ngarkuar m\u00eb shum\u00eb-m\u00eb pak standard. Thelbi i tij \u00ebsht\u00eb i thjesht\u00eb: i gjith\u00eb p\u00ebrmbajtja statike shp\u00ebrndahet jo nga at\u00eb server q\u00eb ndodhet aplikacioni, por nga server\u00eb t\u00eb ve\u00e7uar vet\u00ebm p\u00ebr k\u00ebt\u00eb q\u00ebllim. Si pasoj\u00eb, k\u00ebto operacione kryhen m\u00eb shpejt (nj\u00eb nginx i zakonsh\u00ebm dor\u00ebzon skedar\u00ebt m\u00eb shpejt dhe m\u00eb me pak kosto se nj\u00eb server Java). Plus, arkitektura CDN (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Content_delivery_network\">Rrjeti i Shp\u00ebrndarjes s\u00eb P\u00ebrmbajtjes<\/a><\/noindex>) na lejon t\u00eb vendosim skedar\u00ebt tan\u00eb m\u00eb af\u00ebr p\u00ebrdoruesve p\u00ebrfundimtar\u00eb, gj\u00eb q\u00eb ndihmon n\u00eb p\u00ebrmir\u00ebsimin e komfortit t\u00eb pun\u00ebs me sh\u00ebrbimin.<\/p>\n<p><\/p>\n<p>Shembulli m\u00eb i thjesht\u00eb dhe standard i p\u00ebrmbajtjes statike \u00ebsht\u00eb nj\u00eb grup skenesh dhe imazhesh p\u00ebr nj\u00eb faqe. Me to gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb \u2014 ato jan\u00eb t\u00eb njohura m\u00eb par\u00eb, pastaj arkivi ngarkohet n\u00eb server\u00ebt CDN, nga ku shp\u00ebrndahen p\u00ebr p\u00ebrdoruesit p\u00ebrfundimtar\u00eb.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, n\u00eb praktik\u00eb, p\u00ebr p\u00ebrmbajtjen statike mund t\u00eb aplikojm\u00eb nj\u00eb qasje q\u00eb \u00ebsht\u00eb di\u00e7ka e ngjashme me arkitektur\u00ebn lambda. Le t\u00eb kthehemi n\u00eb detyr\u00ebn ton\u00eb (depo online e skedar\u00ebve), n\u00eb t\u00eb cil\u00ebn na nevojitet t\u00eb shp\u00ebrndajm\u00eb skedar\u00ebt p\u00ebr p\u00ebrdoruesit. Zgjidhja m\u00eb e thjesht\u00eb \u00ebsht\u00eb t\u00eb krijojm\u00eb nj\u00eb sh\u00ebrbim, i cili p\u00ebr \u00e7do k\u00ebrkes\u00eb t\u00eb p\u00ebrdoruesit b\u00ebn t\u00eb gjitha kontrollimet e nevojshme (autorizimi, etj.), dhe m\u00eb pas shkarkon skedarin drejtp\u00ebrdrejt nga depoja jon\u00eb. Disavantazhi kryesor i k\u00ebsaj qasje \u00ebsht\u00eb se p\u00ebrmbajtja statike (dhe skedari me nj\u00eb version t\u00eb caktuar, n\u00eb thelb, \u00ebsht\u00eb p\u00ebrmbajtje statike) shp\u00ebrndahet nga t\u00eb nj\u00ebjtin server q\u00eb p\u00ebrmban logjik\u00ebn biznesore. N\u00eb vend t\u00eb k\u00ebsaj, mund t\u00eb krijohet skema e m\u00ebposhtme:<\/p>\n<p><\/p>\n<ul>\n<li>Serveri l\u00ebshon nj\u00eb URL p\u00ebr shkarkim. Ajo mund t\u00eb jet\u00eb forma file_id + key, ku key \u00ebsht\u00eb nj\u00eb n\u00ebnshkrim i vog\u00ebl numerik, q\u00eb i jep t\u00eb drejt\u00ebn p\u00ebr akses n\u00eb burimin p\u00ebr 24 or\u00ebt e ardhshme.<\/li>\n<li>Shp\u00ebrndarja e skedarit merret nga nj\u00eb nginx i thjesht\u00eb me opsionet e m\u00ebposhtme:\n<ul>\n<li>Caching of content. Since this service may be located on a separate server, we have left ourselves a buffer for the future with the possibility of storing all the recently downloaded files on the disk.<\/li>\n<li>Key verification at the moment of establishing a connection<\/li>\n<\/ul>\n<\/li>\n<li>Optional: streaming content processing. For example, if we compress all files in the service, we can perform unarchiving directly in this module. As a result: IO operations are done where they belong. A Java archiver can easily consume a lot of excess memory, but rewriting the service with business logic in conditional Rust\/C++ may also prove ineffective. In our case, different processes (or even services) are used, so we can quite effectively separate business logic from IO operations.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/4dead07d5824938e09b986192ccc8f5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Such a scheme does not resemble static content delivery very closely (as we do not unload the entire static package somewhere), however, in reality, this approach does indeed deal with the distribution of immutable data. Moreover, this scheme can be generalized to other cases where content is not just static but may be represented as a set of immutable and non-deletable blocks (although they can be added).<\/p>\n<p><\/p>\n<p>Si nj\u00eb shembull tjet\u00ebr (p\u00ebr t\u00eb forcuar): n\u00ebse keni punuar me Jenkins\/TeamCity, e dini q\u00eb t\u00eb dy zgjidhjet jan\u00eb t\u00eb shkruara n\u00eb Java. T\u00eb dyja jan\u00eb procese Java q\u00eb merret me orkestrimin e build-eve dhe menaxhimin e p\u00ebrmbajtjes. Sakt\u00ebsisht, ata kan\u00eb detyra si &quot;transfero skedarin\/folderin nga serveri&quot;. Si shembull: dor\u00ebzimi i artefakteve, transferimi i kodit burimor (kur agjenti nuk e shkarkon kodin drejtp\u00ebrdrejt nga repositori, por serveri e b\u00ebn k\u00ebt\u00eb p\u00ebr t\u00eb), akses n\u00eb loge. T\u00eb gjitha k\u00ebto detyra ndryshojn\u00eb n\u00eb ngarkes\u00ebn e IO-s\u00eb. K\u00ebshtu, del se serveri, i cili \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr logjik\u00ebn e komplikuar t\u00eb biznesit, gjithashtu duhet t\u00eb jet\u00eb n\u00eb gjendje t\u00eb kaloj\u00eb n\u00eb m\u00ebnyr\u00eb efektive rrjedha t\u00eb m\u00ebdha t\u00eb t\u00eb dh\u00ebnave. Dhe gj\u00ebja m\u00eb interesante \u00ebsht\u00eb se nj\u00eb operacion t\u00eb till\u00eb mund ta delegoni po ashtu te nginx n\u00eb t\u00eb nj\u00ebjt\u00ebn skem\u00eb (p\u00ebrve\u00e7se n\u00eb k\u00ebrkes\u00eb duhet shtuar \u00e7el\u00ebsi i t\u00eb dh\u00ebnave).<\/p>\n<p><\/p>\n<p>However, if we return to our system, the scheme looks like this:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelet arkitekturore t\u00eb p\u00ebrshtatshme\" src=\"\/wp-content\/uploads\/2020\/05\/97cfbf5daaa6678a9eecc3169692f0fc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si\u00e7 duket, sistemi \u00ebsht\u00eb komplikuar radikalisht. Tani nuk \u00ebsht\u00eb thjesht nj\u00eb mini-proces q\u00eb ruan skedar\u00ebt lokalish. Tani k\u00ebrkohet mb\u00ebshtetje e d\u00ebshmuar, kontrolle p\u00ebr versionet e API etj. Prandaj, pasi t\u00eb gjitha diagramet jan\u00eb b\u00ebr\u00eb, m\u00eb mir\u00eb \u00ebsht\u00eb t\u00eb vler\u00ebsohet me kujdes n\u00ebse p\u00ebrballueshm\u00ebria e k\u00ebtyre kostove \u00ebsht\u00eb e arsyeshme. Megjithat\u00eb, n\u00ebse d\u00ebshironi t\u00eb keni mund\u00ebsin\u00eb p\u00ebr t\u00eb zgjeruar sistemin (p\u00ebrfshir\u00eb p\u00ebr t\u00eb punuar me nj\u00eb num\u00ebr edhe m\u00eb t\u00eb madh p\u00ebrdoruesish), do t'ju duhet t\u00eb pranoni zgjidhje t\u00eb tilla. Si rezultat, sistemi arkitektonik \u00ebsht\u00eb i gatsh\u00ebm p\u00ebr rritjen e ngarkes\u00ebs (praktikisht \u00e7do komponent mund t\u00eb klonohet p\u00ebr shkall\u00ebzim horizontal). Sistemi mund t\u00eb p\u00ebrdit\u00ebsohet pa u ndaluar (thjesht, disa operacione do t\u00eb ngadal\u00ebsohen paksa).<\/p>\n<p><\/p>\n<p>Si\u00e7 kam th\u00ebn\u00eb n\u00eb fillim, nj\u00eb num\u00ebr sh\u00ebrbimesh n\u00eb internet tani kan\u00eb filluar t\u00eb p\u00ebrballen me nj\u00eb ngarkes\u00eb t\u00eb rritur. Disa prej tyre thjesht kan\u00eb filluar t\u00eb ndihen t\u00eb paefektsh\u00ebm. N\u00eb thelb, sistemet kan\u00eb d\u00ebshtuar sakt\u00ebsisht n\u00eb at\u00eb moment kur biznesi do t\u00eb duhej t\u00eb b\u00ebnte para. Pra, n\u00eb vend q\u00eb t\u00eb ofronin nj\u00eb shp\u00ebrndarje t\u00eb vonuar, n\u00eb vend q\u00eb t\u00eb ofronin klient\u00ebve 'planifikoni shp\u00ebrndarjen p\u00ebr muajt e af\u00ebrt', sistemi thjesht tha 'shkoni te konkurent\u00ebt'. Kjo \u00ebsht\u00eb \u00e7mimi i performanc\u00ebs s\u00eb ul\u00ebt: humbjet do t\u00eb ndodhin sakt\u00ebsisht kur fitimi do t\u00eb ishte m\u00eb i lart\u00eb.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">P\u00ebrfundim<\/h1>\n<p><\/p>\n<p>T\u00eb gjitha k\u00ebto qasje ishin t\u00eb njohura edhe m\u00eb par\u00eb. Edhe VK p\u00ebrdor prej koh\u00ebsh iden\u00eb e Static Content Hosting p\u00ebr shp\u00ebrndarjen e imazheve. Nj\u00eb mori loj\u00ebrash online p\u00ebrdorin skem\u00ebn e Sharding p\u00ebr t\u00eb ndar\u00eb lojtar\u00ebt sipas rajoneve ose p\u00ebr t\u00eb ndar\u00eb lokacionet e loj\u00ebrave (n\u00ebse bota \u00ebsht\u00eb e vetme). Qasja Event Sourcing p\u00ebrdoret n\u00eb m\u00ebnyr\u00eb aktive n\u00eb email. Shumica e aplikacioneve p\u00ebr tregtar\u00ebt, ku t\u00eb dh\u00ebnat vijn\u00eb vazhdimisht, n\u00eb t\u00eb v\u00ebrtet\u00eb jan\u00eb nd\u00ebrtuar mbi qasjen CQRS, p\u00ebr t\u00eb pasur mund\u00ebsin\u00eb t\u00eb filtrojn\u00eb t\u00eb dh\u00ebnat q\u00eb mb\u00ebrrijn\u00eb. Po ashtu, shkall\u00ebzimi horizontal p\u00ebrdoret prej nj\u00eb kohe t\u00eb gjat\u00eb n\u00eb shum\u00eb sh\u00ebrbime.<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, ajo q\u00eb \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishmja, t\u00eb gjith\u00eb k\u00ebta modele tani jan\u00eb shum\u00eb t\u00eb leht\u00eb p\u00ebr t'u zbatuar n\u00eb aplikacionet moderne (n\u00ebse ato jan\u00eb t\u00eb p\u00ebrshtatshme, sigurisht). Rezerbat ofrojn\u00eb Sharding dhe horizontale t\u00eb shkall\u00ebzueshm\u00ebris\u00eb menj\u00ebher\u00eb, q\u00eb \u00ebsht\u00eb shum\u00eb m\u00eb e leht\u00eb se sa t\u00eb porositesh server\u00eb t\u00eb ndrysh\u00ebm t\u00eb dedikuar n\u00eb qendrat e t\u00eb dh\u00ebnave t\u00eb ndryshme vet\u00eb. CQRS \u00ebsht\u00eb b\u00ebr\u00eb shum\u00eb m\u00eb e leht\u00eb, ndoshta p\u00ebr shkak t\u00eb zhvillimit t\u00eb bibliotekave, si RX. Disa vite m\u00eb par\u00eb, nj\u00eb website i rrall\u00eb do t\u00eb ishte n\u00eb gjendje t\u00eb p\u00ebrkrah\u00eb di\u00e7ka t\u00eb till\u00eb. Event Sourcing konfigurimi gjithashtu \u00ebsht\u00eb jashtzakonisht i leht\u00eb fal\u00eb kontenier\u00ebve t\u00eb gatsh\u00ebm me Apache Kafka. Disa vite m\u00eb par\u00eb kjo do t\u00eb ishte nj\u00eb inovacion, tani \u00ebsht\u00eb nj\u00eb praktik\u00eb e zakonshme. Po ashtu ndodh me Static Content Hosting: p\u00ebr shkak t\u00eb teknologjive m\u00eb t\u00eb p\u00ebrshtatshme (p\u00ebrfshir\u00eb faktin se ka dokumentacion t\u00eb detajuar dhe nj\u00eb baz\u00eb t\u00eb madhe p\u00ebrgjigjesh), nj\u00eb qasje e till\u00eb \u00ebsht\u00eb b\u00ebr\u00eb edhe m\u00eb e thjesht\u00eb.<\/p>\n<p><\/p>\n<p>Si p\u00ebrfundim, implementimi i nj\u00eb s\u00ebr\u00eb modeli arkitektonik\u00ebsh mjaft t\u00eb nd\u00ebrlikuar tani ka b\u00ebr\u00eb shum\u00eb m\u00eb t\u00eb leht\u00eb, dhe k\u00ebshtu \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb shikohet nga af\u00ebr. N\u00ebse n\u00eb nj\u00eb aplikacion t\u00eb dhjet\u00ebvje\u00e7ar, \u00ebsht\u00eb hequr nj\u00eb nga zgjidhjet e m\u00ebsip\u00ebrme p\u00ebr shkak t\u00eb kostos s\u00eb lart\u00eb t\u00eb implementimit dhe mbajtjes, tani, n\u00eb nj\u00eb aplikacion t\u00eb ri, ose pas refaktorizimit, mund t\u00eb krijohet nj\u00eb sh\u00ebrbim q\u00eb do t\u00eb jet\u00eb arkitektonikisht i shkall\u00ebzuesh\u00ebm (nga pik\u00ebpamja e performanc\u00ebs), si dhe i gatsh\u00ebm p\u00ebr k\u00ebrkesa t\u00eb reja nga klient\u00ebt (p\u00ebr shembull, p\u00ebr lokalizimin e t\u00eb dh\u00ebnave personale).<\/p>\n<p><\/p>\n<p>Dhe ajo q\u00eb \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishme: ju lutemi, mos i p\u00ebrdorni k\u00ebto qasje n\u00ebse keni nj\u00eb aplikacion t\u00eb thjesht\u00eb. Po, ato jan\u00eb t\u00eb bukura dhe interesante, megjithat\u00eb p\u00ebr nj\u00eb faqe interneti me nj\u00eb vizit\u00eb maksimale prej 100 personash shpesh \u00ebsht\u00eb e mjaftueshme t\u00eb p\u00ebrdoret nj\u00eb monolit klasik (t\u00eb pakt\u00ebn nga jasht\u00eb, brenda gjith\u00e7ka mund t\u00eb ndahet n\u00eb module e k\u00ebshtu me radh\u00eb).<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dbtc\/blog\/499758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Modele arkitektonike t\u00eb p\u00ebrshtatshme | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr! N\u00eb drit\u00ebn e ngjarjeve aktuale p\u00ebr shkak t\u00eb coronavirusit, nj\u00eb s\u00ebr\u00eb sh\u00ebrbesh n\u00eb internet ka filluar t\u00eb p\u00ebrjetoj\u00eb nj\u00eb rritje t\u00eb ngarkes\u00ebs.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-02T11:42:54+00:00","article:modified_time":"2020-05-02T11:42:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80035","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:26:40","updated":"2022-09-28 01:38:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/80035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=80035"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/80035\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/80036"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=80035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=80035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=80035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}