{"id":95804,"date":"2020-10-03T13:42:27","date_gmt":"2020-10-03T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit"},"modified":"2020-10-03T13:42:27","modified_gmt":"2020-10-03T11:42:27","slug":"istoriya-arhitektury-dodo-is-rannij-monolit","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Historia architektury Dodo IS: wczesny monolit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Albo ka\u017cda nieszcz\u0119\u015bliwa firma z monolitem jest nieszcz\u0119\u015bliwa na sw\u00f3j spos\u00f3b.<\/p>\n<p>Rozw\u00f3j systemu Dodo IS rozpocz\u0105\u0142 si\u0119 od razu po za\u0142o\u017ceniu biznesu Dodo Pizzy \u2014 w 2011 roku. W jego podstawie le\u017ca\u0142a idea pe\u0142nej i ca\u0142kowitej cyfryzacji proces\u00f3w biznesowych, gdzie <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>w\u0142asnymi si\u0142ami<\/u><\/a><\/noindex>, co ju\u017c wtedy w 2011 roku budzi\u0142o wiele pyta\u0144 i sceptycyzmu. Ale oto ju\u017c od 9 lat idziemy t\u0105 drog\u0105 \u2014 z w\u0142asnym rozwi\u0105zaniem, kt\u00f3re zaczyna\u0142o si\u0119 od monolitu.<\/p>\n<p>Ten artyku\u0142 jest \u00abodpowiedzi\u0105\u00bb na pytania \u00abPo co przepisywa\u0107 architektur\u0119 i wprowadza\u0107 tak du\u017ce i d\u0142ugotrwa\u0142e zmiany?\u00bb do poprzedniego artyku\u0142u <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u00abHistoria architektury Dodo IS: droga back-office\u2019u\u00bb<\/u><\/a><\/noindex>. Zaczn\u0119 od tego, jak rozpocz\u0119\u0142a si\u0119 praca nad Dodo IS, jak wygl\u0105da\u0142a pierwotna architektura, jak powstawa\u0142y nowe modu\u0142y i z jakimi problemami musieli\u015bmy si\u0119 zmierzy\u0107, aby wprowadzi\u0107 istotne zmiany.<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Seria artyku\u0142\u00f3w \u201eCzym jest Dodo IS?\u201d opowie o:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Wczesny monolit w Dodo IS (2011-2015). (Jeste\u015b tutaj)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Droga zaplecza: oddzielne bazy i magistrala<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Droga cz\u0119\u015bci klienckiej: fasada nad baz\u0105 (2016-2017). (W trakcie\u2026)<\/p>\n<\/li>\n<li>\n<p>Historia prawdziwych mikroserwis\u00f3w. (2018-2019). (W trakcie\u2026)<\/p>\n<\/li>\n<li>\n<p>Zako\u0144czony podzia\u0142 monolitu i stabilizacja architektury. (W trakcie\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Pierwotna architektura<\/h3>\n<p>W 2011 roku architektura Dodo IS wygl\u0105da\u0142a tak:<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pierwszym modu\u0142em w architekturze by\u0142a obs\u0142uga zam\u00f3wie\u0144. Proces biznesowy by\u0142 nast\u0119puj\u0105cy:<\/p>\n<ul>\n<li>\n<p>klient dzwoni do pizzerii;<\/p>\n<\/li>\n<li>\n<p>s\u0142uchawk\u0119 podnosi mened\u017cer;<\/p>\n<\/li>\n<li>\n<p>przyjmuje zam\u00f3wienie przez telefon;<\/p>\n<\/li>\n<li>\n<p>r\u00f3wnocze\u015bnie wpisuje je w interfejsie przyj\u0119cia zam\u00f3wienia: uwzgl\u0119dnia informacje o kliencie, szczeg\u00f3\u0142y zam\u00f3wienia i adres dostawy.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Interfejs systemu informacyjnego wygl\u0105da\u0142 mniej wi\u0119cej tak\u2026<\/p>\n<p>Pierwsza wersja z pa\u017adziernika 2011:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f75cfa9779ba700bea78afc\" frameborder=\"0\" allowfullscreen><\/iframe><\/center>Nieco poprawiona w styczniu 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">System informacyjny Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Zasoby przeznaczone do opracowania pierwszego modu\u0142u obs\u0142ugi zam\u00f3wie\u0144 by\u0142y ograniczone. Trzeba by\u0142o zrobi\u0107 du\u017co, szybko i w ma\u0142ym sk\u0142adzie. Ma\u0142y sk\u0142ad \u2014 to 2 deweloper\u00f3w, kt\u00f3rzy po\u0142o\u017cyli fundament ca\u0142ego przysz\u0142ego systemu.<\/p>\n<p>Ich pierwsze rozwi\u0105zanie zdefiniowa\u0142o dalsz\u0105 przysz\u0142o\u015b\u0107 technologicznego stosu:<\/p>\n<ul>\n<li>\n<p>Backend na ASP.NET MVC, j\u0119zyk C#. Programi\u015bci byli specjalistami .NET, ten stos by\u0142 im znany i przyjemny. <\/p>\n<\/li>\n<li>\n<p>Frontend na Bootstrap i JQuery: interfejsy u\u017cytkownika na w\u0142asnych stylach i skryptach.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Baza danych MySQL: bez koszt\u00f3w licencji, \u0142atwa w u\u017cyciu.<\/p>\n<\/li>\n<li>\n<p>Serwery na Windows Server, poniewa\u017c .NET w\u00f3wczas dzia\u0142a\u0142 tylko na Windows (Mono nie wchodzi w gr\u0119).<\/p>\n<\/li>\n<\/ul>\n<p>Fizycznie wszystko to wyra\u017ca\u0142o si\u0119 w \u201ededyku u hostera\u201d.&nbsp;<\/p>\n<h4>Architektura aplikacji do obs\u0142ugi zam\u00f3wie\u0144<\/h4>\n<p>Wtedy ju\u017c wszyscy m\u00f3wili o mikroserwisach, a SOA by\u0142o stosowane przez oko\u0142o 5 lat w du\u017cych projektach, na przyk\u0142ad WCF zadebiutowa\u0142o w 2006 roku. Ale wtedy wybrano niezawodne i sprawdzone rozwi\u0105zanie.<\/p>\n<p>I oto jest.<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC to Razor, kt\u00f3ry na \u017c\u0105danie z formularza lub od klienta generuje stron\u0119 HTML z renderowaniem na serwerze. Na kliencie CSS i skrypty JS wy\u015bwietlaj\u0105 informacje i, w razie potrzeby, wykonuj\u0105 zapytania AJAX za pomoc\u0105 JQuery.<\/p>\n<p>\u017b\u0105dania na serwerze trafiaj\u0105 do klas *Controller, gdzie w metodzie przebiega przetwarzanie i generowanie ko\u0144cowej strony HTML. Kontrolery wykonuj\u0105 zapytania do warstwy logiki, zwanej *Services. Ka\u017cdy z serwis\u00f3w odpowiada\u0142 za jaki\u015b aspekt biznesu:<\/p>\n<ul>\n<li>\n<p>Na przyk\u0142ad, DepartmentStructureService dostarcza\u0142 informacji o pizzeriach i departamentach. Departament to zbi\u00f3r pizzerii zarz\u0105dzanych przez jednego franczyzobiorc\u0119.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService przyjmowa\u0142 i kalkulowa\u0142 sk\u0142ad zam\u00f3wienia.<\/p>\n<\/li>\n<li>\n<p>A SmsService wysy\u0142a\u0142 SMS, wywo\u0142uj\u0105c API do wysy\u0142ania SMS.<\/p>\n<\/li>\n<\/ul>\n<p>Serwisy przetwarza\u0142y dane z bazy, przechowywa\u0142y logik\u0119 biznesow\u0105. W ka\u017cdym serwisie znajdowa\u0142 si\u0119 jeden lub wi\u0119cej *Repository o odpowiednich nazwach. Zawiera\u0142y one zapytania do procedur sk\u0142adowanych w bazie oraz warstw\u0119 mapper\u00f3w. W procedurach sk\u0142adowych by\u0142a zawarta logika biznesowa, szczeg\u00f3lnie du\u017co w tych, kt\u00f3re generowa\u0142y dane raportowe. ORM nie by\u0142 u\u017cywany, wszyscy polegali na r\u0119cznie napisanym SQL.&nbsp;<\/p>\n<p>By\u0142a r\u00f3wnie\u017c warstwa modelu domenowego i wsp\u00f3lnych klas-helper\u00f3w, na przyk\u0142ad klasa Order, kt\u00f3ra przechowywa\u0142a zam\u00f3wienie. Tam tak\u017ce znajdowa\u0142 si\u0119 helper do przekszta\u0142cania wy\u015bwietlanego tekstu wed\u0142ug wybranej waluty.<\/p>\n<p>Wszystko to mo\u017cna przedstawi\u0107 w takiej modelu: <\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>\u015acie\u017cka zam\u00f3wienia<\/h4>\n<p>Rozwa\u017cmy uproszczon\u0105 pocz\u0105tkow\u0105 \u015bcie\u017ck\u0119 stworzenia takiego zam\u00f3wienia.<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pocz\u0105tkowo strona by\u0142a statyczna. Zawiera\u0142a ceny, a na g\u00f3rze znajdowa\u0142 si\u0119 numer telefonu oraz napis \"Chcesz pizz\u0119 - dzwo\u0144 pod numer i zam\u00f3w\". Aby z\u0142o\u017cy\u0107 zam\u00f3wienie, musimy wdro\u017cy\u0107 prosty flow:&nbsp;<\/p>\n<ul>\n<li>\n<p>Klient wchodzi na statyczn\u0105 stron\u0119 z cenami, wybiera produkty i dzwoni pod numer podany na stronie.<\/p>\n<\/li>\n<li>\n<p>Klient wymienia produkty, kt\u00f3re chce doda\u0107 do zam\u00f3wienia.<\/p>\n<\/li>\n<li>\n<p>Podaje sw\u00f3j adres i imi\u0119.<\/p>\n<\/li>\n<li>\n<p>Operator przyjmuje zam\u00f3wienie.<\/p>\n<\/li>\n<li>\n<p>Zam\u00f3wienie wy\u015bwietla si\u0119 w interfejsie przyj\u0119tych zam\u00f3wie\u0144.<\/p>\n<\/li>\n<\/ul>\n<p>Wszystko zaczyna si\u0119 od wy\u015bwietlenia menu. Zalogowany u\u017cytkownik-operator w danym momencie przyjmuje tylko jedno zam\u00f3wienie. Dlatego koszyk roboczy mo\u017ce by\u0107 przechowywany w jego sesji (sesja u\u017cytkownika jest przechowywana w pami\u0119ci). Tam znajduje si\u0119 obiekt Cart, w kt\u00f3rym s\u0105 produkty i informacje o kliencie.<\/p>\n<p>Klient wymienia produkt, operator naciska na <code>+<\/code> obok produktu, a na serwer wysy\u0142ane jest zapytanie. Informacje o produkcie s\u0105 pobierane z bazy danych i dodawane do koszyka.<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Uwaga<\/strong>. Tak, mo\u017cna nie pobiera\u0107 produktu z bazy, a przekaza\u0107 z frontendu. Ale dla przejrzysto\u015bci pokaza\u0142em dok\u0142adnie \u015bcie\u017ck\u0119 z bazy.&nbsp;<\/p>\n<p>Nast\u0119pnie wprowadzamy adres i imi\u0119 klienta.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Po naci\u015bni\u0119ciu \u201eUtw\u00f3rz zam\u00f3wienie\u201d:<\/p>\n<ul>\n<li>\n<p>Wysy\u0142amy zapytanie do OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Pobieramy Cart z sesji, tam znajduj\u0105 si\u0119 produkty w potrzebnej nam ilo\u015bci.<\/p>\n<\/li>\n<li>\n<p>Uzupe\u0142niamy Cart informacjami o kliencie i przekazujemy do metody AddOrder klasy ReceivingOrderService, gdzie zostaje zapisane w bazie.&nbsp;<\/p>\n<\/li>\n<li>\n<p>W bazie znajduj\u0105 si\u0119 tabele z zam\u00f3wieniem, sk\u0142adem zam\u00f3wienia, klientem i s\u0105 one ze sob\u0105 powi\u0105zane.<\/p>\n<\/li>\n<li>\n<p>Interfejs wy\u015bwietlania zam\u00f3wienia przechwytuje i pobiera ostatnie zam\u00f3wienia oraz je wy\u015bwietla.<\/p>\n<\/li>\n<\/ul>\n<h4>Nowe modu\u0142y<\/h4>\n<p>Przyj\u0119cie zam\u00f3wienia by\u0142o wa\u017cne i niezb\u0119dne. Nie mo\u017cna prowadzi\u0107 biznesu zwi\u0105zane z sprzeda\u017c\u0105 pizzy, je\u015bli nie ma mo\u017cliwo\u015bci przyj\u0119cia zam\u00f3wienia na sprzeda\u017c. Dlatego system zacz\u0105\u0142 rozwija\u0107 funkcjonalno\u015bci \u2014 od oko\u0142o 2012 do 2015 roku. W tym czasie pojawi\u0142o si\u0119 wiele r\u00f3\u017cnych blok\u00f3w systemu, kt\u00f3re b\u0119d\u0119 nazywa\u0107 <strong>modu\u0142ami<\/strong>, w przeciwie\u0144stwie do poj\u0119cia us\u0142ugi lub produktu.&nbsp;<\/p>\n<p>Modu\u0142 to zestaw funkcji, kt\u00f3re s\u0105 powi\u0105zane jak\u0105\u015b wsp\u00f3ln\u0105 cel\u0105 biznesow\u0105. Fizycznie wszystkie znajduj\u0105 si\u0119 w jednej aplikacji.<\/p>\n<p>Modu\u0142y mo\u017cna nazwa\u0107 blokami systemu. Przyk\u0142adowo, to modu\u0142 raport\u00f3w, interfejsy administracyjne, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>\u015bledzenie produkt\u00f3w w kuchni<\/u><\/a><\/noindex>, autoryzacja. To wszystko r\u00f3\u017cne interfejsy dla u\u017cytkownika, niekt\u00f3re maj\u0105 nawet r\u00f3\u017cne style wizualne. Wszystko w ramach jednej aplikacji, jednego dzia\u0142aj\u0105cego procesu.&nbsp;<\/p>\n<p>Technicznie modu\u0142y by\u0142y realizowane jako Area (taki pomys\u0142 pozosta\u0142 w <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/mvc\/controllers\/areas?view=aspnetcore-3.1\"><u>asp.net core<\/u><\/a><\/noindex>). By\u0142y oddzielne pliki dla frontendu, modeli oraz w\u0142asne klasy kontroler\u00f3w. W efekcie system przekszta\u0142ci\u0142 si\u0119 z takiego\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026w taki:<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Niekt\u00f3re modu\u0142y zosta\u0142y zaimplementowane jako oddzielne strony (projekt wykonywalny), z powodu ca\u0142kowicie odr\u0119bnych funkcjonalno\u015bci oraz cz\u0119\u015bciowo z powodu bardziej ukierunkowanego rozwoju. S\u0105 to:<\/p>\n<ul>\n<li>\n<p><strong>Strona<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>pierwsza wersja<\/u><\/a><\/noindex> strony dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Eksport<\/strong>: eksport raport\u00f3w z Dodo IS do 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 osobisty panel pracownika. Opracowany oddzielnie i ma w\u0142asny punkt wej\u015bcia oraz oddzielny design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 projekt do hostowania statyki. P\u00f3\u017aniej zrezygnowali\u015bmy z niego, przenosz\u0105c ca\u0142\u0105 statyk\u0119 na CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Pozosta\u0142e bloki znajdowa\u0142y si\u0119 w aplikacji BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Wyja\u015bnienie nazw:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Kasa restauracji.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfejsy dla roli \u201eMened\u017cer zmiany\u201d: bie\u017c\u0105ca statystyka sprzeda\u017cy pizzerii, mo\u017cliwo\u015b\u0107 dodania produkt\u00f3w do czarnej listy, zmiana zam\u00f3wienia.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfejsy dla r\u00f3l \u201eZarz\u0105dzaj\u0105cy pizzeri\u0105\u201d i \u201eFranczyzobiorca\u201d. Tutaj zbierane s\u0105 funkcje do konfiguracji pizzerii, jej promocji, zarz\u0105dzania pracownikami oraz raport\u00f3w.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfejsy dla telewizor\u00f3w i tablet\u00f3w wisz\u0105cych w pizzeriach. Na telewizorach wy\u015bwietlane jest menu, informacje reklamowe oraz status zam\u00f3wienia przy odbiorze.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Wykorzystano wsp\u00f3ln\u0105 warstw\u0119 us\u0142ug, wsp\u00f3lny blok klas domenowych Dodo.Core, a tak\u017ce wsp\u00f3ln\u0105 baz\u0119. Czasami mo\u017cna by\u0142o si\u0119 przemieszcza\u0107 pomi\u0119dzy nimi. W tym r\u00f3wnie\u017c z wsp\u00f3lnych us\u0142ug korzysta\u0142y oddzielne strony, takie jak dodopizza.ru czy personal.dodopizza.ru.<\/p>\n<p>Przy wprowadzaniu nowych modu\u0142\u00f3w starano si\u0119 jak najwi\u0119cej wykorzystywa\u0107 wcze\u015bniej stworzony kod us\u0142ug, procedur sk\u0142adowych i tabel w bazie.&nbsp;<\/p>\n<p>Aby lepiej zrozumie\u0107 zakres modu\u0142\u00f3w w systemie, oto schemat z 2012 roku z planami rozwoju:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Do 2015 roku wszystko, co na schemacie i jeszcze wi\u0119cej, by\u0142o wdro\u017cone w produkcji.<\/p>\n<ul>\n<li>\n<p>Przyjmowanie zam\u00f3wie\u0144 przerodzi\u0142o si\u0119 w oddzielny blok Centrum Kontaktowego, gdzie zam\u00f3wienia przyjmowane s\u0105 przez operatora.<\/p>\n<\/li>\n<li>\n<p>Pojawi\u0142y si\u0119 og\u00f3lnodost\u0119pne ekrany z menu i informacjami, wisz\u0105ce w pizzeriach.<\/p>\n<\/li>\n<li>\n<p>W kuchni znajduje si\u0119 modu\u0142, kt\u00f3ry automatycznie odtwarza komunikat g\u0142osowy \u201eNowa pizza\u201d po przyj\u0119ciu nowego zam\u00f3wienia oraz drukuje dokument dla kuriera. To znacznie upraszcza procesy w kuchni, pozwalaj\u0105c pracownikom skupi\u0107 si\u0119 na bardziej z\u0142o\u017conych operacjach.<\/p>\n<\/li>\n<li>\n<p>Blok dostaw sta\u0142 si\u0119 oddzieln\u0105 Kas\u0105 Dostaw, gdzie zam\u00f3wienie wydawane by\u0142o kurierowi, kt\u00f3ry wcze\u015bniej zg\u0142osi\u0142 si\u0119 do pracy. Jego czas pracy by\u0142 uwzgl\u0119dniany przy naliczaniu wynagrodzenia.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>R\u00f3wnolegle, od 2012 do 2015 roku, pojawi\u0142o si\u0119 ponad 10 programist\u00f3w, otwarto 35 pizzerii, rozwini\u0119to system w Rumunii i przygotowano do otwarcia punkt\u00f3w w USA. Programi\u015bci przestali zajmowa\u0107 si\u0119 wszystkimi zadaniami, zostali podzieleni na zespo\u0142y, z kt\u00f3rych ka\u017cdy specjalizowa\u0142 si\u0119 w swojej cz\u0119\u015bci systemu.&nbsp;<\/p>\n<h3>Problemy<\/h3>\n<p>W tym tak\u017ce z powodu architektury (ale nie tylko).<\/p>\n<h4>Chaos w bazie<\/h4>\n<p>Jedna baza \u2014 to wygodne. Mo\u017cna osi\u0105gn\u0105\u0107 sp\u00f3jno\u015b\u0107, a przy tym korzysta\u0107 z wbudowanych w relacyjne bazy narz\u0119dzi. Praca z ni\u0105 jest naturalna i wygodna, szczeg\u00f3lnie, je\u015bli jest ma\u0142o tabel i danych.<\/p>\n<p>Jednak w ci\u0105gu 4 lat rozwoju w bazie znalaz\u0142o si\u0119 oko\u0142o 600 tabel, 1500 procedur sk\u0142adowych, z kt\u00f3rych w wielu by\u0142a tak\u017ce logika. Niestety, procedury sk\u0142adowe nie przynosz\u0105 szczeg\u00f3lnych korzy\u015bci w pracy z MySQL. Nie s\u0105 one buforowane przez baz\u0119, a przechowywanie logiki w nich utrudnia rozw\u00f3j i debugowanie. Ponowne wykorzystanie kodu tak\u017ce jest trudne.<\/p>\n<p><strong>Na wielu tabelach brakowa\u0142o odpowiednich indeks\u00f3w.<\/strong>, gdzie\u015b z kolei by\u0142o ich zbyt wiele, co utrudnia\u0142o wstawianie. Nale\u017ca\u0142o zmodyfikowa\u0107 oko\u0142o 20 tabel \u2014 transakcja na utworzenie zam\u00f3wienia mog\u0142a trwa\u0107 oko\u0142o 3-5 sekund.&nbsp;<\/p>\n<p><strong>Dane w tabelach nie zawsze by\u0142y w najbardziej odpowiedniej formie.<\/strong>. Gdzie\u015b konieczna by\u0142a denormalizacja. Cz\u0119\u015b\u0107 regularnie otrzymywanych danych znajdowa\u0142a si\u0119 w kolumnie w postaci struktury XML, co wyd\u0142u\u017ca\u0142o czas wykonania, komplikowa\u0142o zapytania i utrudnia\u0142o rozw\u00f3j.<\/p>\n<p>Do tych samych tabel wykonywano bardzo <strong>zr\u00f3\u017cnicowane zapytania.<\/strong>. Szczeg\u00f3lnie ucierpia\u0142y popularne tabele, jak wspomniana tabela <em>orders<\/em> lub tabela <em>pizzeria.<\/em>By\u0142y one wykorzystywane do wy\u015bwietlania operacyjnych interfejs\u00f3w w kuchni, analizy. Strona r\u00f3wnie\u017c si\u0119ga\u0142a po nie (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), gdzie w ka\u017cdej chwili mog\u0142o nap\u0142yn\u0105\u0107 nagle wiele zapyta\u0144.&nbsp;<\/p>\n<p><strong>Dane nie by\u0142y zgrupowane<\/strong> i wiele oblicze\u0144 odbywa\u0142o si\u0119 na bie\u017c\u0105co w bazie. To powodowa\u0142o zb\u0119dne obliczenia i dodatkowe obci\u0105\u017cenie.&nbsp;<\/p>\n<p>Cz\u0119sto kod \u0142\u0105czy\u0142 si\u0119 z baz\u0105 wtedy, gdy nie powinien tego robi\u0107. Gdzie\u015b brakowa\u0142o operacji zbiorczych, gdzie\u015b inne zapytanie nale\u017ca\u0142oby rozdzieli\u0107 na kilka przez kod, aby przyspieszy\u0107 i zwi\u0119kszy\u0107 niezawodno\u015b\u0107.&nbsp;<\/p>\n<h4>Powi\u0105zania i skomplikowanie w kodzie<\/h4>\n<p><strong>Modu\u0142y, kt\u00f3re powinny odpowiada\u0107 za sw\u00f3j obszar biznesowy, nie robi\u0142y tego rzetelnie.<\/strong>Niekt\u00f3re z nich mia\u0142y powielanie funkcji dla r\u00f3l. Na przyk\u0142ad lokalny marketer, odpowiedzialny za aktywno\u015b\u0107 marketingow\u0105 sieci w swoim mie\u015bcie, musia\u0142 korzysta\u0107 zar\u00f3wno z interfejsu 'Administratora' (do wprowadzania akcji), jak i z interfejsu 'Menad\u017cera Biura' (do przegl\u0105dania wp\u0142ywu akcji na biznes). Oczywi\u015bcie, wewn\u0119trznie oba modu\u0142y korzysta\u0142y z jednego serwisu, kt\u00f3ry obs\u0142ugiwa\u0142 bonusowe promocje.<\/p>\n<p>Serwisy (klasy w ramach jednego monolitycznego du\u017cego projektu) mog\u0142y wywo\u0142ywa\u0107 si\u0119 nawzajem, aby wzbogaca\u0107 swoje dane.<\/p>\n<p>Z samymi klasami-modelami, kt\u00f3re przechowuj\u0105 dane, <strong>praca w kodzie przebiega\u0142a r\u00f3\u017cnie.<\/strong>. Gdzie\u015b by\u0142y konstruktory, przez kt\u00f3re mo\u017cna by\u0142o wskaza\u0107 obowi\u0105zkowe pola. Gdzie indziej odbywa\u0142o si\u0119 to przez publiczne w\u0142a\u015bciwo\u015bci. Oczywi\u015bcie pobieranie i przekszta\u0142canie danych z bazy by\u0142o zr\u00f3\u017cnicowane.&nbsp;<\/p>\n<p><strong>Logika by\u0142a albo w kontrolerach, albo w klasach serwis\u00f3w.<\/strong>&nbsp;<\/p>\n<p>To mog\u0142y by\u0107 drobne problemy, ale mocno spowalnia\u0142y rozw\u00f3j i obni\u017ca\u0142y jako\u015b\u0107, co prowadzi\u0142o do niestabilno\u015bci i b\u0142\u0119d\u00f3w.&nbsp;<\/p>\n<h4>Z\u0142o\u017cono\u015b\u0107 du\u017cego projektu<\/h4>\n<p><strong>Problemy pojawi\u0142y si\u0119 r\u00f3wnie\u017c w samej implementacji<\/strong>. Nale\u017ca\u0142o tworzy\u0107 r\u00f3\u017cne bloki systemu, a do tego r\u00f3wnolegle. Coraz trudniej by\u0142o pomie\u015bci\u0107 potrzeby ka\u017cdego komponentu w jednym kodzie. Nie by\u0142o \u0142atwo si\u0119 dogada\u0107 i zadowoli\u0107 wszystkie komponenty jednocze\u015bnie. Do tego dochodzi\u0142y ograniczenia technologiczne, szczeg\u00f3lnie dotycz\u0105ce bazy danych i front-endu. Nale\u017ca\u0142o zrezygnowa\u0107 z JQuery na rzecz framework\u00f3w wy\u017cszego poziomu, szczeg\u00f3lnie w odniesieniu do us\u0142ug klienta (strona internetowa).<\/p>\n<p><strong>W niekt\u00f3rych cz\u0119\u015bciach systemu mog\u0142yby by\u0107 u\u017cywane bazy bardziej odpowiednie do tego celu<\/strong>. Na przyk\u0142ad, p\u00f3\u017aniej mieli\u015bmy przypadek przej\u015bcia z Redis na CosmosDB do przechowywania koszyka zam\u00f3wienia.&nbsp;<\/p>\n<p>Zespo\u0142y i programi\u015bci, zajmuj\u0105cy si\u0119 swoj\u0105 dziedzin\u0105, wyra\u017anie pragn\u0119li wi\u0119kszej autonomii dla swoich us\u0142ug, zar\u00f3wno w zakresie rozwoju, jak i wdra\u017cania. Konflikty podczas scalania, problemy przy wydaniach. Je\u015bli dla 5 programist\u00f3w ten problem jest nieistotny, to przy 10, a tym bardziej przy planowanym wzro\u015bcie, sytuacja sta\u0142a si\u0119 powa\u017cniejsza. A przed nami by\u0142a rozw\u00f3j aplikacji mobilnej (startowa\u0142a w 2017, a w 2018 roku by\u0142o) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">du\u017cy spadek<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>R\u00f3\u017cne cz\u0119\u015bci systemu wymaga\u0142y r\u00f3\u017cnych wska\u017anik\u00f3w stabilno\u015bci<\/strong>, ale z powodu silnego powi\u0105zania systemu, nie mogli\u015bmy tego zapewni\u0107. B\u0142\u0105d przy opracowywaniu nowej funkcji w panelu admina, m\u00f3g\u0142by wp\u0142yn\u0105\u0107 na odbi\u00f3r zam\u00f3wienia na stronie, poniewa\u017c kod jest wsp\u00f3lny i wielokrotnie u\u017cywany, baza i dane tak\u017ce s\u0105 jedne.<\/p>\n<p>Prawdopodobnie mo\u017cna by\u0142oby i w ramach takiej monolityczno-modu\u0142owej architektury unika\u0107 tych b\u0142\u0119d\u00f3w i problem\u00f3w: wprowadzi\u0107 podzia\u0142 odpowiedzialno\u015bci, przeprowadza\u0107 refaktoryzacj\u0119 zar\u00f3wno kodu, jak i bazy danych, wyra\u017anie oddziela\u0107 warstwy od siebie, dba\u0107 o jako\u015b\u0107 ka\u017cdego dnia. Ale wybrane rozwi\u0105zania architektoniczne i skupienie na szybkim rozszerzaniu funkcjonalno\u015bci systemu doprowadzi\u0142y do problem\u00f3w ze stabilno\u015bci\u0105.<\/p>\n<h4>Jak blog Si\u0142a umys\u0142u wp\u0142yn\u0105\u0142 na kasy w restauracjach<\/h4>\n<p>Gdyby wzrost sieci pizzerii (i obci\u0105\u017cenia) trwa\u0142 w tym samym tempie, to po pewnym czasie spadki by\u0142yby ju\u017c tak du\u017ce, \u017ce system by si\u0119 nie podni\u00f3s\u0142. Dobrze ilustruje to problemy, z kt\u00f3rymi zacz\u0119li\u015bmy si\u0119 zmaga\u0107 w 2015 roku, taka oto historia.&nbsp;<\/p>\n<p>Na blogu \u201e<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Si\u0142a umys\u0142u<\/u><\/a><\/noindex>\u201d by\u0142 widget, kt\u00f3ry pokazywa\u0142 dane o przychodach za rok ca\u0142ej sieci. Widget korzysta\u0142 z publicznego API Dodo, kt\u00f3re dostarcza te dane. Teraz te statystyki s\u0105 dost\u0119pne na <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Widget by\u0142 wy\u015bwietlany na ka\u017cdej stronie i co 20 sekund wysy\u0142a\u0142 zapytania do api.dodopizza.ru i pyta\u0142:<\/p>\n<ul>\n<li>\n<p>liczb\u0119 pizzerii w sieci;<\/p>\n<\/li>\n<li>\n<p>ca\u0142kowite przychody sieci od pocz\u0105tku roku;<\/p>\n<\/li>\n<li>\n<p>przychody za dzisiaj.<\/p>\n<\/li>\n<\/ul>\n<p>Zapytanie o statystyki przychod\u00f3w sz\u0142o bezpo\u015brednio do bazy i zaczyna\u0142o zbiera\u0107 dane o zam\u00f3wieniach, agreguj\u0105c je na bie\u017c\u0105co i podaj\u0105c sum\u0119.&nbsp;<\/p>\n<p>Do tej samej tabeli zam\u00f3wie\u0144 trafia\u0142y kasy w restauracjach, kt\u00f3re zgrywa\u0142y list\u0119 przyj\u0119tych zam\u00f3wie\u0144 z dzisiaj, a nowe zam\u00f3wienia by\u0142y te\u017c dodawane do tej tabeli. Kasy wysy\u0142a\u0142y swoje zapytania co 5 sekund lub przy od\u015bwie\u017ceniu strony.<\/p>\n<p>Schemat wygl\u0105da\u0142 tak:<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pewnego jesiennego dnia, Fiodor Owczynnikow napisa\u0142 na swoim blogu d\u0142ugi i popularny artyku\u0142. Na bloga przysz\u0142o bardzo du\u017co ludzi, kt\u00f3rzy zacz\u0119li uwa\u017cnie wszystko czyta\u0107. Podczas gdy ka\u017cdy z przyby\u0142ych czyta\u0142 artyku\u0142, widget z przychodami dzia\u0142a\u0142 poprawnie i co 20 sekund wysy\u0142a\u0142 zapytania do API.<\/p>\n<p>API wywo\u0142ywa\u0142o procedur\u0119 sk\u0142adowan\u0105 do obliczenia sumy wszystkich zam\u00f3wie\u0144 od pocz\u0105tku roku we wszystkich pizzeriach sieci. Agregacja odbywa\u0142a si\u0119 na tabeli zam\u00f3wie\u0144, kt\u00f3ra jest bardzo popularna. Do niej si\u0119ga\u0142y wszystkie kasy wszystkich otwartych restauracji w danym czasie. Kasy przesta\u0142y odpowiada\u0107, zam\u00f3wienia nie by\u0142y przyjmowane. Nie by\u0142y te\u017c przyjmowane z strony internetowej, nie pojawia\u0142y si\u0119 w trackerze, mened\u017cer zmiany nie m\u00f3g\u0142 ich zobaczy\u0107 w swoim interfejsie.&nbsp;<\/p>\n<p>To nie jedyna historia. Na jesieni 2015 roku w ka\u017cd\u0105 pi\u0105tk\u0119 obci\u0105\u017cenie systemu by\u0142o krytyczne. Kilka razy wy\u0142\u0105czali\u015bmy publiczne API, a pewnego razu musieli\u015bmy nawet wy\u0142\u0105czy\u0107 stron\u0119, poniewa\u017c nic ju\u017c nie pomaga\u0142o. By\u0142a nawet lista us\u0142ug z kolejno\u015bci\u0105 wy\u0142\u0105czania przy powa\u017cnych obci\u0105\u017ceniach.<\/p>\n<p>Od tego momentu zaczyna si\u0119 nasza walka z obci\u0105\u017ceniami i stabilizacj\u0105 systemu (od jesieni 2015 do jesieni 2018). W\u0142a\u015bnie wtedy zdarzy\u0142o si\u0119 \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Wielkie upadki<\/u><\/a><\/noindex>Czasami zdarza\u0142y si\u0119 inne awarie, niekt\u00f3re by\u0142y do\u015b\u0107 dotkliwe, ale og\u00f3lny okres niestabilno\u015bci mo\u017cna ju\u017c uzna\u0107 za za nami.<\/p>\n<h4>Nag\u0142y wzrost biznesu<\/h4>\n<p>Dlaczego nie mo\u017cna by\u0142o \"od razu dobrze zrobi\u0107\"? Wystarczy spojrze\u0107 na nast\u0119puj\u0105ce wykresy.<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>W latach 2014-2015 otworzyli\u015bmy oddzia\u0142 w Rumunii, a tak\u017ce przygotowywali\u015bmy otwarcie w Stanach Zjednoczonych.<\/p>\n<p>Sie\u0107 ros\u0142a w bardzo szybkim tempie, otwierano nowe kraje, pojawia\u0142y si\u0119 nowe formaty pizzerii, na przyk\u0142ad pizzeria na food courcie. Wszystko to wymaga\u0142o znacznej uwagi skierowanej na rozw\u00f3j funkcji Dodo IS. Bez tych wszystkich funkcji, bez \u015bledzenia w kuchni, bez uwzgl\u0119dniania produkt\u00f3w i strat w systemie, bez wy\u015bwietlania realizacji zam\u00f3wienia na food courcie, ma\u0142o prawdopodobne jest, \u017ce teraz dyskutowaliby\u015bmy o \"poprawnej\" architekturze i \"w\u0142a\u015bciwym\" podej\u015bciu do rozwoju.<\/p>\n<p>Innym przeszkod\u0105 w terminowym przegl\u0105dzie architektury i w og\u00f3le zwr\u00f3ceniu uwagi na problemy techniczne by\u0142 kryzys z 2014 roku. Tego typu rzeczy mocno uderzaj\u0105 w mo\u017cliwo\u015bci wzrostu zespo\u0142\u00f3w, szczeg\u00f3lnie w przypadku m\u0142odego biznesu, jakim by\u0142a Dodo Pizza.<\/p>\n<h3>Szybkie rozwi\u0105zania, kt\u00f3re pomog\u0142y<\/h3>\n<p>Problemy wymaga\u0142y rozwi\u0105zania. Mo\u017cna je zasadniczo podzieli\u0107 na dwie grupy:<\/p>\n<ul>\n<li>\n<p>Szybkie, kt\u00f3re gasz\u0105 po\u017car i daj\u0105 niewielki zapas wytrzyma\u0142o\u015bci oraz pozwalaj\u0105 na zmiany.<\/p>\n<\/li>\n<li>\n<p>Systemowe i, w zwi\u0105zku z tym, czasoch\u0142onne. Reengineering szeregu modu\u0142\u00f3w, podzia\u0142 monolitycznej architektury na odr\u0119bne us\u0142ugi (wi\u0119kszo\u015b\u0107 z nich to raczej nie mikro, a bardziej makro us\u0142ugi i o tym jest <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>raport Andrieja Moriewskiego<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Sucha lista szybkich zmian jest nast\u0119puj\u0105ca:<\/p>\n<h4>Skalowanie bazy master<\/h4>\n<p>Oczywi\u015bcie pierwszym krokiem w walce z obci\u0105\u017ceniem jest zwi\u0119kszenie mocy serwera. To zosta\u0142o zrobione dla bazy master oraz serwer\u00f3w webowych. Niestety, mo\u017cliwe jest to jedynie do pewnego momentu, p\u00f3\u017aniej staje si\u0119 to zbyt kosztowne.<\/p>\n<p>Od 2014 roku przeszli\u015bmy na Azure, na ten temat pisali\u015bmy r\u00f3wnie\u017c w tamtym czasie w artykule \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Jak Dodo Pizza dostarcza pizz\u0119 dzi\u0119ki chmurze Microsoft Azure<\/a><\/noindex>\". Ale po serii zwi\u0119ksze\u0144 serwera pod baz\u0119 utkn\u0119li\u015bmy w kwestii koszt\u00f3w.&nbsp;<\/p>\n<h4>Repliki bazy do odczytu<\/h4>\n<p>Stworzyli\u015bmy dwie repliki bazy:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>do zapyta\u0144 baz danych<\/strong>. Stosowane s\u0105 do odczytu s\u0142ownik\u00f3w, takich jak miasta, ulice, pizzerie, produkty (powoli zmieniaj\u0105ca si\u0119 domena), oraz w tych interfejsach, gdzie dozwolona jest niewielka zw\u0142oka. By\u0142o ich 2, zapewniali\u015bmy ich dost\u0119pno\u015b\u0107 tak samo jak bazie master.<\/p>\n<p><strong>ReadReplica dla zapyta\u0144 o raporty<\/strong>. Ta baza mia\u0142a ni\u017csz\u0105 dost\u0119pno\u015b\u0107, ale wszystkie raporty korzysta\u0142y z niej. Niech maj\u0105 trudne zapytania dotycz\u0105ce ogromnych przelicze\u0144 danych, ale nie wp\u0142ywaj\u0105 na g\u0142\u00f3wn\u0105 baz\u0119 i interfejsy operacyjne.&nbsp;<\/p>\n<h4>Cache w kodzie<\/h4>\n<p>Nie by\u0142o \u017cadnych cache'\u00f3w w kodzie (w og\u00f3le). Prowadzi\u0142o to do dodatkowych, nie zawsze potrzebnych, zapyta\u0144 do obci\u0105\u017conej bazy. Cache by\u0142y pocz\u0105tkowo zar\u00f3wno w pami\u0119ci, jak i na zewn\u0119trznej us\u0142udze cache, by\u0142 to Redis. Wszystko by\u0142o uniewa\u017cniane w okre\u015blonym czasie, a ustawienia by\u0142y podane w kodzie.<\/p>\n<h4>Kilka serwer\u00f3w dla backendu<\/h4>\n<p>Backend aplikacji r\u00f3wnie\u017c nale\u017ca\u0142o skalowa\u0107, aby wytrzyma\u0107 zwi\u0119kszone obci\u0105\u017cenia. Trzeba by\u0142o zrobi\u0107 klaster z jednego serwera iis. Przenie\u015bli\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>sesj\u0119 aplikacji<\/u><\/a><\/noindex> z pami\u0119ci na RedisCache, co pozwoli\u0142o stworzy\u0107 kilka serwer\u00f3w, stoj\u0105cych za prostym load balancerem z round robin. Na pocz\u0105tku u\u017cywano tego samego Redisa, co dla cache'y, potem rozdzielono na kilka.&nbsp;<\/p>\n<p>W efekcie architektura sta\u0142a si\u0119 bardziej skomplikowana\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historia architektury Dodo IS: wczesny monolit\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026ale uda\u0142o si\u0119 z\u0142agodzi\u0107 cz\u0119\u015b\u0107 napi\u0119cia.<\/p>\n<p>A dalej trzeba by\u0142o przeprojektowa\u0107 obci\u0105\u017cone komponenty, co tak\u017ce zrobili\u015bmy. O tym opowiemy w nast\u0119pnej cz\u0119\u015bci.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/521614\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0438 \u0442\u043e\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0446\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0442\u043e\u0433\u0434\u0430 \u0432 2011 \u0433\u043e\u0434\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0446\u0438\u0437\u043c\u0430. \u041d\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 9 \u043b\u0435\u0442 \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95804","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\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\/pl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\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-10-03T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:27+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\udd47Historia architektury Dodo IS: wczesny monolit | ProHoster","description":"Lub ka\u017cda nieszcz\u0119\u015bliwa firma z monolitem jest nieszcz\u0119\u015bliwa na sw\u00f3j spos\u00f3b. Rozw\u00f3j systemu Dodo IS rozpocz\u0105\u0142 si\u0119 r\u00f3wnocze\u015bnie z biznesem Dodo Pizza \u2014 w 2011 roku.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","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-10-03T11:42:27+00:00","article:modified_time":"2020-10-03T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95804","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 10:57:47","updated":"2022-09-28 00:34:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}