{"id":8402,"date":"2019-10-22T16:32:14","date_gmt":"2019-10-22T14:32:14","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=8402"},"modified":"2025-05-07T11:09:14","modified_gmt":"2025-05-07T09:09:14","slug":"architektury-rozproszone-bez-marketingu","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/architektury-rozproszone-bez-marketingu\/","title":{"rendered":"Architektury rozproszone bez marketingu"},"content":{"rendered":"\n<p>Architektury nowoczesnych aplikacji opanowa\u0142y trendy i marketing do tego stopnia, \u017ce konferencje czy meetupy techniczne cz\u0119sto zdaj\u0105 si\u0119 przypomina\u0107 pokazy mody. <\/p>\n\n\n\n<p>Niezale\u017cnie od tego, czym i w jakiej skali si\u0119 zajmujemy, inspiruj\u0105 nas &#8222;wielcy projektanci&#8221; &#8211; ogromne firmy o mi\u0119dzynarodowym zasi\u0119gu, kt\u00f3re ka\u017cdego dnia musza si\u0119 mierzy\u0107 z milionami \u017c\u0105dnych ich us\u0142ug u\u017cytkownik\u00f3w. Takie rozwi\u0105zania z g\u00f3ry skazane s\u0105 na architektury rozproszone (jak np. <em>mikrous\u0142ugi<\/em>), ze wzgl\u0119du przede wszystkim na mo\u017cliwo\u015b\u0107 elastycznego skalowania. Ich prezentacje pe\u0142ne s\u0105 potkni\u0119\u0107 i pora\u017cek, stopniowo przekuwanych w spektakularne sukcesy.<\/p>\n\n\n\n<p>W naszej bran\u017cy, specjali\u015bci chc\u0105 wykorzystywa\u0107 na co dzie\u0144 najnowsze technologie, oferowa\u0107 swoim klientom nowoczesne rozwi\u0105zania, a klienci zamawia\u0107 systemy, kt\u00f3re pod\u0105\u017caj\u0105 z duchem czasu &#8211; to zrozumia\u0142e. Na nasze wsp\u00f3lne nieszcz\u0119\u015bcie, nie zawsze pami\u0119tamy, \u017ce <strong>wyb\u00f3r architektury niesie za sob\u0105 konsekwencje<\/strong>, a <strong>tworzenie system\u00f3w rozproszonych<\/strong>, nawet w 2019 roku, <strong>wci\u0105\u017c jest trudne<\/strong>. Dlatego, na tegorocznej konferencji <a href=\"https:\/\/pozitive.tech\/\" rel=\"nofollow\" >Pozitive technologies<\/a> postanowi\u0142em opowiedzie\u0107 o tej drugiej, nieco przemilczanej stronie takich architektur. Zapominaj\u0105c na chwil\u0119 o ich popularno\u015bci i niew\u0105tpliwych zaletach, wy\u0142ania si\u0119 bowiem rzeczywisto\u015b\u0107 bardziej przypominaj\u0105ca pe\u0142n\u0105 zagro\u017ce\u0144 d\u017cungl\u0119, ni\u017c rajski ogr\u00f3d. Ten wpis b\u0119dzie nie tyle kompletnym kursem przetrwania, co ostrze\u017ceniem o tym, co czyha na nas w rozproszonym \u015bwiecie &#8211; zanim na YouTube pojawi si\u0119 nagranie z mojego wyst\u0105pienia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Przepraszam, co\u015b mnie rozproszy\u0142o&#8230;<\/h2>\n\n\n\n<p>Z praktycznego punktu widzenia, <strong>definicja systemu rozproszonego jest prosta<\/strong> &#8211; to <strong>zbi\u00f3r niezale\u017cnych komponent\u00f3w<\/strong> (us\u0142ug, modu\u0142\u00f3w, funkcji, itd.), kt\u00f3re mog\u0105 znajdowa\u0107 si\u0119 na zupe\u0142nie innych maszynach, <strong>komunikuj\u0105cych si\u0119 ze sob\u0105 poprzez sie\u0107<\/strong>. W teorii, awaria jednego z nich nie wp\u0142ywa dzi\u0119ki temu na pozosta\u0142e, a ka\u017cdy z komponent\u00f3w mo\u017ce by\u0107 skalowany niezale\u017cnie (poprzez zwi\u0119kszanie liczby jego instancji). Po drugiej stronie, mamy &#8222;klasyczne&#8221; <strong>podej\u015bcie monolityczne<\/strong> &#8211; aplikacj\u0119, kt\u00f3ra stanowi <strong>jedn\u0105 ca\u0142o\u015b\u0107<\/strong>, kt\u00f3ra w przypadku awarii jest ca\u0142kowicie niedost\u0119pna i <strong>uruchamiana<\/strong> jest <strong>na pojedynczej maszynie<\/strong>. A skaluje si\u0119, delikatnie m\u00f3wi\u0105c, do\u015b\u0107 niekorzystnie. W takim zestawieniu, mo\u017ce si\u0119 wydawa\u0107, \u017ce monolity nie maj\u0105 \u017cadnych szans w starciu z nowoczesno\u015bci\u0105&#8230;<\/p>\n\n\n\n<p>Problemy rozproszonego \u015bwiata to jednak cz\u0119sto kwestie, kt\u00f3re przy pracy nad monolitami nie przysz\u0142yby nam nawet do g\u0142owy. Przyk\u0142adowo, je\u015bli jedna cz\u0119\u015b\u0107 monolitycznej aplikacji musi skorzysta\u0107 z funkcji oferowanej przez drug\u0105, to takie wywo\u0142anie mo\u017ce si\u0119 zero-jedynkowo uda\u0107 w ca\u0142o\u015bci lub nie, a czas potrzebny na sam\u0105 komunikacj\u0119 jest w\u0142a\u015bciwie nieistotny z wydajno\u015bciowego punktu widzenia. W \u015bwiecie rozproszonym, gdy us\u0142uga\/funkcja (zale\u017cnie od implementacji) wywo\u0142uje inn\u0105, sytuacja drastycznie si\u0119 komplikuje, a czas wywo\u0142ania odgrywa istotn\u0105 rol\u0119. Wszystko to przez jeden, bagatelizowany szczeg\u00f3\u0142 &#8211; <strong>komunikacja odbywa si\u0119 poprzez sie\u0107, a ta jest zaskakuj\u0105co zawodna<\/strong>. W przypadku wywo\u0142a\u0144 sieciowych w\u0142a\u015bciwie mo\u017cemy zapomnie\u0107 o zero-jedynkowo\u015bci, a prawo Murphy&#8217;ego staje si\u0119 nasz\u0105 codzienno\u015bci\u0105.<\/p>\n\n\n\n<p>Rozwa\u017cmy nast\u0119puj\u0105cy przyk\u0142ad komunikacji synchronicznej:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/architektury-rozproszone-bez-marketingu\/network_call_synchronous\/\" rel=\"attachment wp-att-8411\"><img decoding=\"async\" width=\"746\" height=\"166\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/10\/network_call_synchronous.png\" alt=\"\" class=\"wp-image-8411\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/10\/network_call_synchronous.png 746w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/10\/network_call_synchronous-300x67.png 300w\" sizes=\"(max-width: 746px) 100vw, 746px\" \/><\/a><\/figure>\n\n\n\n<p>Nawet w tak prostej sytuacji:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>B<\/em> mo\u017ce przyj\u0105\u0107 \u017c\u0105danie, przetworzy\u0107 je, ale nie uda si\u0119 odes\u0142a\u0107 odpowiedzi (<em>A<\/em> wie jedynie, \u017ce &#8222;co\u015b posz\u0142o nie tak&#8221;)<\/li>\n\n\n\n<li><em>A<\/em> mo\u017ce czeka\u0107 na przetworzenie \u017c\u0105dania tak d\u0142ugo, a\u017c uzna je za zako\u0144czone niepowodzeniem (gdy <em>B<\/em> chwil\u0119 p\u00f3\u017aniej zacznie je jednak przetwarza\u0107)<\/li>\n\n\n\n<li><em>A<\/em> tu\u017c po wys\u0142aniu \u017c\u0105dania (ale przed otrzymaniem odpowiedzi) straci komunikacj\u0119 z sieci\u0105 (nigdy nie dowie si\u0119, czy <em>B<\/em> odpowiedzia\u0142).<\/li>\n<\/ul>\n\n\n\n<p>Skoro tego rodzaju problemy wyst\u0119puj\u0105 tak cz\u0119sto, pojawia si\u0119 pytanie: czy w takim razie wszystkie systemy tego typu nie powinny by\u0107 na to przygotowane? Odpowied\u017a jest prosta &#8211; tak, powinny. Niestety do\u015bwiadczenie pokazuje, \u017ce <strong>zawodno\u015b\u0107 sieci jest najcz\u0119\u015bciej ignorowanym problemem w tego typu rozwi\u0105zaniach<\/strong>. Przynajmniej do czasu, gdy takie systemy zostaj\u0105 wreszcie uruchomione produkcyjnie i udost\u0119pnione prawdziwym u\u017cytkownikom&#8230;<\/p>\n\n\n\n<p>A co w sytuacji, gdy wywo\u0142anie <em>B<\/em> zmienia stan systemu &#8211; np. poprzez aktualizacj\u0119 jakiej\u015b bazy danych?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sp\u00f3jno\u015b\u0107 danych<\/h2>\n\n\n\n<p>Lata pracy z aplikacjami monolitycznymi, w kt\u00f3rych korzystamy na dodatek g\u0142\u00f3wnie tylko z jednego \u017ar\u00f3d\u0142a (bazy) danych, przyzwyczai\u0142y nas do tego, \u017ce semantyk\u0119 transakcyjno\u015bci &#8211; rozumian\u0105 jako wykonanie &#8222;wszystko albo nic&#8221; &#8211; dostajemy niemal za darmo. Je\u015bli wi\u0119c nasz proces biznesowy sk\u0142ada si\u0119 z wielu krok\u00f3w zmieniaj\u0105cych stan (np. zaksi\u0119gowanie p\u0142atno\u015bci, stworzenie zam\u00f3wienia, wystawienie faktury, itp.) to w przypadku b\u0142\u0119du na kt\u00f3rymkolwiek etapie oczekujemy, \u017ce anulowane zostan\u0105 wszystkie z nich. W ten spos\u00f3b osi\u0105gamy sp\u00f3jno\u015b\u0107 danych rozumian\u0105 z perspektywy biznesowej poprawno\u015bci.<\/p>\n\n\n\n<p>W\u0142asno\u015bci te, z jakiego\u015b powodu, mylnie przyj\u0119\u0142o si\u0119 \u0142\u0105czy\u0107 jedynie z relacyjnymi bazami danych (<a href=\"https:\/\/pl.wikipedia.org\/wiki\/ACID\" rel=\"nofollow\" >ACID<\/a>), a wiele os\u00f3b do dzi\u015b zawzi\u0119cie wierzy, \u017ce ich transakcyjno\u015b\u0107 jest swego rodzaju &#8222;panaceum na b\u0142\u0119dy&#8221;, bez kt\u00f3rego nie mo\u017ce si\u0119 oby\u0107 \u017caden &#8222;powa\u017cny&#8221; system klasy enterprise. Niestety, nawet ona sta\u0142a si\u0119, moim zdaniem, ofiar\u0105 swojego sukcesu i marketingu &#8211; notorycznie jest nadu\u017cywana i stosowana do\u015b\u0107 lekkomy\u015blnie. Zainteresowanych tematem (lub linczem na mojej osobie, za tak nonszalanckie zdeptanie bazodanowych \u015bwi\u0119to\u015bci ?) odsy\u0142am do \u015bwietnej <a href=\"https:\/\/youtu.be\/5ZjhNTM8XU8\" rel=\"nofollow\" >prezentacji Martina Kleppmanna<\/a>.<\/p>\n\n\n\n<p>W \u015bwiecie rozproszonym, problem semantyki transakcyjno\u015bci jeste\u015bmy zmuszeni rozwi\u0105za\u0107 na nowo. Jednym z najpopularniejszych na to sposob\u00f3w jest zastosowanie wzorca <a href=\"https:\/\/microservices.io\/patterns\/data\/saga.html\" rel=\"nofollow\" >Saga<\/a>. W zale\u017cno\u015bci od wybranego wariantu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>implementujemy &#8222;zarz\u0105dc\u0119&#8221; procesu, kt\u00f3ry jest odpowiedzialny za nadzorowanie jego przebiegu i wykonywanie akcji kompensacyjnych lub ponawiania w przypadku b\u0142\u0119du (<em>orchestration<\/em>)<\/li>\n\n\n\n<li>implementujemy proces jako sekwencj\u0119 asynchronicznych zdarze\u0144 (<em>events<\/em>), gdzie ka\u017cda akcja mo\u017ce zako\u0144czy\u0107 si\u0119 sukcesem lub niepowodzeniem, a elementy naszego systemu nas\u0142uchuj\u0105 na informacje o b\u0142\u0119dach wykonuj\u0105c w reakcji na nie dzia\u0142ania kompensacyjne (<em>choreography<\/em>).<\/li>\n<\/ul>\n\n\n\n<p>Poprawne i efektywne implementowanie transakcyjno\u015bci w rozproszonym \u015bwiecie to jednak do\u015b\u0107 obszerny temat, kt\u00f3ry wykracza poza zakres tego wpisu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak znikaj\u0105 pieni\u0105dze?<\/h2>\n\n\n\n<p>Systemy rozproszone s\u0105 te\u017c niepor\u00f3wnywalnie bardziej skomplikowane pod wzgl\u0119dem \u015bledzenia proces\u00f3w przez nie wykonywanych. Nawet <strong>je\u015bli poszczeg\u00f3lne elementy systemu<\/strong> (us\u0142ugi\/funkcje) <strong>s\u0105 szczeg\u00f3\u0142owo monitorowane<\/strong> i skrupulatnie dokumentuj\u0105 wszystkie zdarzenia w swoich logach, <strong>to nie gwarantuje to w \u017caden spos\u00f3b przejrzysto\u015bci wykona\u0144 na poziomie proces\u00f3w biznesowych<\/strong>, kt\u00f3re przechodz\u0105 teraz przez wiele modu\u0142\u00f3w. Jak to mo\u017cliwe? Okazuje si\u0119, \u017ce przest\u0119pcy t\u0119 przypad\u0142o\u015b\u0107 zrozumieli i wykorzystali ju\u017c jaki\u015b czas temu. Uzyskuj\u0105c nieautoryzowany dost\u0119p do czyjej\u015b bankowo\u015bci internetowej musz\u0105 w jaki\u015b spos\u00f3b przela\u0107 \u015brodki na w\u0142asne rachunki &#8211; i to najlepiej tak, by nie da\u0107 si\u0119 z\u0142apa\u0107. Pojedynczy przelew (do jednego banku) by\u0142by zbyt prosty do namierzenia, dlatego ca\u0142o\u015b\u0107 kwoty dzielona jest na wiele ma\u0142ych kaskadowych transakcji przechodz\u0105cych przez r\u00f3\u017cne banki i konta (najcz\u0119\u015bciej r\u00f3wnie\u017c przej\u0119te lub za\u0142o\u017cone na tzw. &#8222;s\u0142up\u00f3w&#8221;). Tak wi\u0119c cho\u0107 systemy bankowe zobligowane s\u0105 do dok\u0142adnego monitorowania wszystkich transakcji, to analiza dzia\u0142a\u0144 obejmuj\u0105cych wiele z nich jednocze\u015bnie jest czasoch\u0142onna i trudna. W rozproszonych aplikacjach, bez odpowiedniego monitoringu systemu, szukanie b\u0142\u0119d\u00f3w przypomina tak\u0105 prac\u0119 \u015bledczych &#8211; zar\u00f3wno ze wzgl\u0119du na poziom skomplikowania jak i presj\u0119 czasow\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>\u015awiat system\u00f3w rozproszonych oferuje nam ogromne mo\u017cliwo\u015bci jednocze\u015bnie zmuszaj\u0105c do radzenia sobie z wieloma, cz\u0119sto trudnymi do rozwi\u0105zania problemami. Czy to znaczy, \u017ce nie powinni\u015bmy budowa\u0107 tego rodzaju aplikacji? Zdecydowanie nie! Wa\u017cne jest jednak, by mie\u0107 \u015bwiadomo\u015b\u0107 z jakimi zagro\u017ceniami przyjdzie si\u0119 mierzy\u0107 oraz posiada\u0107 w swoim arsenale narz\u0119dzia i sposoby na ich neutralizowanie. Tak jak w przypadku wi\u0119kszo\u015bci wzorc\u00f3w czy technologii, dok\u0142adne ich zrozumienie jest kluczowe dla efektywno\u015bci oprogramowania, kt\u00f3re wytwarzamy. I to nawet wtedy, gdy s\u0142yszmy od innych g\u0142\u00f3wnie o korzy\u015bciach p\u0142yn\u0105cych z ich wykorzystywania.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;8402&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.6&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.6\\\/5 ( votes: 9)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Architektury rozproszone bez marketingu&quot;,&quot;width&quot;:&quot;127.9&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 127.9px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.6\/5 ( votes: 9)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Architektury nowoczesnych aplikacji opanowa\u0142y trendy i marketing do tego stopnia, \u017ce konferencje czy meetupy techniczne cz\u0119sto zdaj\u0105 si\u0119 przypomina\u0107 pokazy &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/architektury-rozproszone-bez-marketingu\/\">Continued<\/a><\/p>\n","protected":false},"author":227,"featured_media":8430,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[560,856,61],"class_list":["post-8402","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-architektura-it","tag-mikrouslugi","tag-systemy-rozproszone"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/10\/architektury.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8402"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/227"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=8402"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8402\/revisions"}],"predecessor-version":[{"id":24926,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8402\/revisions\/24926"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/8430"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=8402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=8402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=8402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}