{"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\/cs\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Historie architektury Dodo IS: ran\u00fd monolit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nebo ka\u017ed\u00e1 ne\u0161\u0165astn\u00e1 firma s monolitem je ne\u0161\u0165astn\u00e1 po sv\u00e9m.<\/p>\n<p>V\u00fdvoj syst\u00e9mu Dodo IS za\u010dal hned, jak za\u010dal byznys Dodo Pizzy \u2014 v roce 2011. Z\u00e1kladem byla my\u0161lenka \u00fapln\u00e9 a tot\u00e1ln\u00ed digitalizace obchodn\u00edch proces\u016f, p\u0159i\u010dem\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>vlastn\u00edmi silami<\/u><\/a><\/noindex>, co\u017e u\u017e tehdy v roce 2011 vyvol\u00e1valo spoustu ot\u00e1zek a skepticismu. Ale te\u010f u\u017e 9 let jdeme touto cestou \u2014 s vlastn\u00edm v\u00fdvojem, kter\u00fd za\u010d\u00ednal s monolitem.<\/p>\n<p>Tento \u010dl\u00e1nek je \"odpov\u011bd\u00ed\" na ot\u00e1zky \"Pro\u010d p\u0159epracov\u00e1vat architekturu a prov\u00e1d\u011bt tak rozs\u00e1hl\u00e9 a dlouh\u00e9 zm\u011bny?\" na p\u0159edchoz\u00ed \u010dl\u00e1nek <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\"Historie architektury Dodo IS: cesta back office\".<\/u><\/a><\/noindex>Za\u010dnu t\u00edm, jak za\u010d\u00ednal v\u00fdvoj Dodo IS, jak vypadala p\u016fvodn\u00ed architektura, jak vznikaly nov\u00e9 moduly a kv\u016fli jak\u00fdm probl\u00e9m\u016fm bylo nutn\u00e9 prov\u00e1d\u011bt rozs\u00e1hl\u00e9 zm\u011bny.<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>S\u00e9rie \u010dl\u00e1nk\u016f \"Co je Dodo IS?\" pov\u00ed o:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>P\u0159edn\u00ed monolit v Dodo IS (2011-2015). (Jste zde)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Cesta back office: odd\u011blen\u00e9 datab\u00e1ze a sb\u011brnice<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Cesta klientsk\u00e9 \u010d\u00e1sti: fas\u00e1da nad datab\u00e1z\u00ed (2016-2017). (Prob\u00edh\u00e1\u2026)<\/p>\n<\/li>\n<li>\n<p>Historie skute\u010dn\u00fdch mikroslu\u017eeb. (2018-2019). (Prob\u00edh\u00e1\u2026)<\/p>\n<\/li>\n<li>\n<p>Dokon\u010den\u00e9 rozd\u011blen\u00ed monolitu a stabilizace architektury. (Prob\u00edh\u00e1\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>P\u016fvodn\u00ed architektura<\/h3>\n<p>V roce 2011 vypadala architektura Dodo IS takto:<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Prvn\u00ed modul v architektu\u0159e \u2014 p\u0159\u00edjem objedn\u00e1vek. Obchodn\u00ed proces byl n\u00e1sleduj\u00edc\u00ed:<\/p>\n<ul>\n<li>\n<p>z\u00e1kazn\u00edk vol\u00e1 do pizzerie;<\/p>\n<\/li>\n<li>\n<p>telefon zved\u00e1 mana\u017eer;<\/p>\n<\/li>\n<li>\n<p>p\u0159ij\u00edm\u00e1 objedn\u00e1vku po telefonu;<\/p>\n<\/li>\n<li>\n<p>sou\u010dasn\u011b ji zad\u00e1v\u00e1 do rozhran\u00ed pro p\u0159\u00edjem objedn\u00e1vek: bere se v \u00favahu informace o z\u00e1kazn\u00edkovi, \u00fadaje o objedn\u00e1vce, adresa doru\u010den\u00ed.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Rozhran\u00ed informa\u010dn\u00edho syst\u00e9mu vypadalo p\u0159ibli\u017en\u011b takto...<\/p>\n<p>Prvn\u00ed verze z \u0159\u00edjna 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>Trochu vylep\u0161en\u00e1 v lednu 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Informa\u010dn\u00ed syst\u00e9m Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Zdroje pro v\u00fdvoj prvn\u00edho modulu p\u0159\u00edjmu objedn\u00e1vek byly omezen\u00e9. Bylo t\u0159eba ud\u011blat hodn\u011b, rychle a s mal\u00fdm t\u00fdmem. Mal\u00fd t\u00fdm \u2014 to jsou 2 v\u00fdvoj\u00e1\u0159i, kte\u0159\u00ed polo\u017eili z\u00e1klad cel\u00e9 budouc\u00ed soustavy.<\/p>\n<p>Jejich prvn\u00ed rozhodnut\u00ed ur\u010dilo dal\u0161\u00ed osud technologick\u00e9ho stacku:<\/p>\n<ul>\n<li>\n<p>Backend na ASP.NET MVC, jazyk C#. V\u00fdvoj\u00e1\u0159i byli .NET specialist\u00e9, tento stack jim byl zn\u00e1m\u00fd a p\u0159\u00edjemn\u00fd. <\/p>\n<\/li>\n<li>\n<p>Frontend na Bootstrap a JQuery: u\u017eivatelsk\u00e1 rozhran\u00ed na vlastn\u00edch stylech a skriptech.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Datab\u00e1ze MySQL: bez n\u00e1klad\u016f na licence, jednoduch\u00e1 na pou\u017e\u00edv\u00e1n\u00ed.<\/p>\n<\/li>\n<li>\n<p>Servery na Windows Server, proto\u017ee .NET tehdy mohl b\u00fdt pouze pod Windows (Mono nebudeme diskutovat).<\/p>\n<\/li>\n<\/ul>\n<p>Fyzicky to v\u0161echno vyjad\u0159ovalo \u201ededikovan\u00fd server u poskytovatele hostingu\u201c.&nbsp;<\/p>\n<h4>Architektura aplikace pro p\u0159\u00edjem objedn\u00e1vek<\/h4>\n<p>Tehdy u\u017e v\u0161ichni mluvili o mikroservis\u00e1ch, zat\u00edmco SOA se p\u011bt let vyu\u017e\u00edvalo ve velk\u00fdch projektech, nap\u0159\u00edklad WCF bylo vyd\u00e1no v roce 2006. Ale tehdy se zvolilo spolehliv\u00e9 a vyzkou\u0161en\u00e9 \u0159e\u0161en\u00ed.<\/p>\n<p>A je to tady.<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC je Razor, kter\u00fd na z\u00e1klad\u011b po\u017eadavku z formul\u00e1\u0159e nebo od klienta generuje HTML str\u00e1nku s vykreslen\u00edm na serveru. Na klientovi ji\u017e CSS a JS skripty zobrazuj\u00ed informace a v p\u0159\u00edpad\u011b pot\u0159eby prov\u00e1d\u011bj\u00ed AJAX po\u017eadavky pomoc\u00ed JQuery.<\/p>\n<p>Po\u017eadavky na serveru p\u0159ich\u00e1zej\u00ed do t\u0159\u00edd *Controller, kde se v metod\u011b prov\u00e1d\u00ed zpracov\u00e1n\u00ed a generov\u00e1n\u00ed fin\u00e1ln\u00ed HTML str\u00e1nky. Kontrol\u00e9ry prov\u00e1d\u011bj\u00ed po\u017eadavky na logiku, naz\u00fdvanou *Services. Ka\u017ed\u00e1 z t\u011bchto slu\u017eeb byla zodpov\u011bdn\u00e1 za n\u011bjak\u00fd aspekt podnik\u00e1n\u00ed:<\/p>\n<ul>\n<li>\n<p>Nap\u0159\u00edklad DepartmentStructureService poskytoval informace o pizzeri\u00edch a odd\u011blen\u00edch. Odd\u011blen\u00ed je skupina pizzeri\u00ed pod spr\u00e1vcem jednoho fran\u0161\u00edzanta.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService p\u0159ij\u00edmal a po\u010d\u00edtal slo\u017een\u00ed objedn\u00e1vky.<\/p>\n<\/li>\n<li>\n<p>A SmsService odes\u00edlal SMS, volal API slu\u017eby pro odes\u00edl\u00e1n\u00ed SMS.<\/p>\n<\/li>\n<\/ul>\n<p>Slu\u017eby zpracov\u00e1valy data z datab\u00e1ze a uchov\u00e1valy obchodn\u00ed logiku. V ka\u017ed\u00e9 slu\u017eb\u011b byla jedna nebo v\u00edce *Repository s odpov\u00eddaj\u00edc\u00edm n\u00e1zvem. Tam byly ulo\u017eeny po\u017eadavky na ulo\u017een\u00e9 procedury v datab\u00e1zi a vrstva mapova\u010d\u016f. Ve ulo\u017een\u00fdch procedur\u00e1ch byla obchodn\u00ed logika, zvl\u00e1\u0161\u0165 mnohem v\u00edce v t\u011bch, kter\u00e9 vracely v\u00fdkazn\u00ed data. ORM se nepou\u017e\u00edvalo, v\u0161ichni se spolehli na ru\u010dn\u011b napsan\u00e9 SQL.&nbsp;<\/p>\n<p>Tak\u00e9 byla vrstva dom\u00e9nov\u00e9ho modelu a spole\u010dn\u00fdch pomocn\u00fdch t\u0159\u00edd, nap\u0159\u00edklad t\u0159\u00edda Order, kter\u00e1 uchov\u00e1vala objedn\u00e1vku. Tam byl tak\u00e9 pomocn\u00edk pro p\u0159evod textu zobrazen\u00ed podle vybran\u00e9 m\u011bny.<\/p>\n<p>To v\u0161e lze p\u0159edstavit takto: <\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Cesta objedn\u00e1vky<\/h4>\n<p>Zva\u017eme zjednodu\u0161enou p\u016fvodn\u00ed cestu k vytvo\u0159en\u00ed takov\u00e9 objedn\u00e1vky.<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>P\u016fvodn\u011b byla str\u00e1nka statick\u00e1. M\u011bla ceny a naho\u0159e bylo telefonn\u00ed \u010d\u00edslo a n\u00e1pis \"Chce\u0161 pizzu \u2013 zavolej na \u010d\u00edslo a objednej\". Pro objedn\u00e1n\u00ed pot\u0159ebujeme realizovat jednoduch\u00fd tok:&nbsp;<\/p>\n<ul>\n<li>\n<p>Klient nav\u0161t\u00edv\u00ed statickou str\u00e1nku s cenami, vyb\u00edr\u00e1 produkty a vol\u00e1 na \u010d\u00edslo uveden\u00e9 na str\u00e1nce.<\/p>\n<\/li>\n<li>\n<p>Klient uv\u00e1d\u00ed produkty, kter\u00e9 chce p\u0159idat do objedn\u00e1vky.<\/p>\n<\/li>\n<li>\n<p>Uv\u00e1d\u00ed svou adresu a jm\u00e9no.<\/p>\n<\/li>\n<li>\n<p>Oper\u00e1tor p\u0159ij\u00edm\u00e1 objedn\u00e1vku.<\/p>\n<\/li>\n<li>\n<p>Objedn\u00e1vka se zobrazuje v rozhran\u00ed p\u0159ijat\u00fdch objedn\u00e1vek.<\/p>\n<\/li>\n<\/ul>\n<p>V\u0161e za\u010d\u00edn\u00e1 zobrazen\u00edm menu. P\u0159ihl\u00e1\u0161en\u00fd oper\u00e1tor m\u016f\u017ee v dan\u00e9m okam\u017eiku p\u0159ijmout pouze jednu objedn\u00e1vku. Proto m\u016f\u017ee draft-ko\u0161\u00edk z\u016fstat v jeho relaci (relace u\u017eivatele se uchov\u00e1v\u00e1 v pam\u011bti). Tam je objekt Cart, ve kter\u00e9m jsou produkty a informace o z\u00e1kazn\u00edkovi.<\/p>\n<p>Z\u00e1kazn\u00edk ozna\u010duje produkt, oper\u00e1tor klikne na <code>+<\/code> vedle produktu a na server se ode\u0161le po\u017eadavek. Z produktu se na\u010d\u00edtaj\u00ed informace z datab\u00e1ze a informace o produktu se p\u0159id\u00e1vaj\u00ed do ko\u0161\u00edku.<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Pozn\u00e1mka<\/strong>. Ano, zde nen\u00ed nutn\u00e9 na\u010d\u00edtat produkt z datab\u00e1ze, lze ho p\u0159edat z frontendu. Ale pro n\u00e1zornost jsem uk\u00e1zal p\u0159esn\u011b cestu z datab\u00e1ze.&nbsp;<\/p>\n<p>D\u00e1le zad\u00e1me adresu a jm\u00e9no z\u00e1kazn\u00edka.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Po kliknut\u00ed na \"Vytvo\u0159it objedn\u00e1vku\":<\/p>\n<ul>\n<li>\n<p>Odes\u00edl\u00e1me po\u017eadavek do OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Z\u00edsk\u00e1v\u00e1me Cart z relace, tam jsou produkty v pot\u0159ebn\u00e9m mno\u017estv\u00ed.<\/p>\n<\/li>\n<li>\n<p>Dopl\u0148ujeme Cart informacemi o z\u00e1kazn\u00edkovi a p\u0159ed\u00e1v\u00e1me do metody AddOrder t\u0159\u00eddy ReceivingOrderService, kde je ulo\u017een do datab\u00e1ze.&nbsp;<\/p>\n<\/li>\n<li>\n<p>V datab\u00e1zi existuj\u00ed tabulky s objedn\u00e1vkou, obsahem objedn\u00e1vky, z\u00e1kazn\u00edkem a v\u0161echny jsou propojen\u00e9.<\/p>\n<\/li>\n<li>\n<p>Rozhran\u00ed pro zobrazen\u00ed objedn\u00e1vky se vyvol\u00e1v\u00e1 a na\u010d\u00edt\u00e1 posledn\u00ed objedn\u00e1vky a zobrazuje je.<\/p>\n<\/li>\n<\/ul>\n<h4>Nov\u00e9 moduly<\/h4>\n<p>P\u0159ij\u00edm\u00e1n\u00ed objedn\u00e1vek bylo d\u016fle\u017eit\u00e9 a nezbytn\u00e9. Nelze provozovat podnik\u00e1n\u00ed v oblasti prodeje pizzy, pokud neexistuje syst\u00e9m na p\u0159ij\u00edm\u00e1n\u00ed objedn\u00e1vek. Proto se syst\u00e9m za\u010dal rozr\u016fstat funkcionalitou \u2014 p\u0159ibli\u017en\u011b od roku 2012 do roku 2015. B\u011bhem t\u00e9to doby vzniklo mnoho r\u016fzn\u00fdch blok\u016f syst\u00e9mu, kter\u00e9 budu ozna\u010dovat <strong>moduly<\/strong>, na rozd\u00edl od pojmu slu\u017eby nebo produktu.&nbsp;<\/p>\n<p>Modul je soubor funkc\u00ed, kter\u00e9 jsou spojeny n\u011bjak\u00fdm spole\u010dn\u00fdm obchodn\u00edm c\u00edlem. P\u0159itom fyzicky se nach\u00e1zej\u00ed v jedn\u00e9 aplikaci.<\/p>\n<p>Moduly lze nazvat bloky syst\u00e9mu. Nap\u0159\u00edklad to m\u016f\u017ee b\u00fdt modul report\u016f, rozhran\u00ed administrace, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>sledova\u010d produkt\u016f v kuchyni<\/u><\/a><\/noindex>, autorizace. To v\u0161e jsou r\u016fzn\u00e1 u\u017eivatelsk\u00e1 rozhran\u00ed, n\u011bkter\u00e9 maj\u00ed dokonce r\u016fzn\u00e9 vizu\u00e1ln\u00ed styly. P\u0159itom v\u0161e je v r\u00e1mci jedn\u00e9 aplikace, jednoho pracovn\u00edho procesu.&nbsp;<\/p>\n<p>Technicky byly moduly uspo\u0159\u00e1d\u00e1ny jako Area (takov\u00fd n\u00e1pad z\u016fstal i v <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>). Byly tam samostatn\u00e9 soubory pro frontend, modely a tak\u00e9 vlastn\u00ed t\u0159\u00eddy kontrol\u00e9r\u016f. Nakonec se syst\u00e9m prom\u011bnil z takov\u00e9ho\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>...na takov\u00fd:<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u011bkter\u00e9 moduly byly realizov\u00e1ny jako samostatn\u00e9 weby (executable project), kv\u016fli zcela odli\u0161n\u00e9mu funk\u010dn\u00edmu zam\u011b\u0159en\u00ed a \u010d\u00e1ste\u010dn\u011b kv\u016fli pon\u011bkud odd\u011blen\u00e9mu, v\u00edce c\u00edlen\u00e9mu v\u00fdvoji. To jsou:<\/p>\n<ul>\n<li>\n<p><strong>Web<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>prvn\u00ed verze<\/u><\/a><\/noindex> webu dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Export<\/strong>: export report\u016f z Dodo IS pro 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Osobn\u00ed<\/strong> \u2014 osobn\u00ed kabinet zam\u011bstnance. Byl vyv\u00edjen samostatn\u011b, m\u00e1 sv\u016fj vlastn\u00ed vstup a odli\u0161n\u00fd design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 projekt pro hostov\u00e1n\u00ed statick\u00e9ho obsahu. Pozd\u011bji jsme se od n\u011bj odklonili a p\u0159evedli ve\u0161kerou statiku na CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Ostatn\u00ed bloky se nach\u00e1zely v aplikaci BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vysv\u011btlen\u00ed n\u00e1zv\u016f:<\/p>\n<ul>\n<li>\n<p>Pokladna \u2014 Pokladna restaurace.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 rozhran\u00ed pro roli \u201eMana\u017eer sm\u011bny\u201c: aktu\u00e1ln\u00ed statistiky prodeje pizzerie, mo\u017enost za\u0159adit produkty do stoplistu, upravit objedn\u00e1vku.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 rozhran\u00ed pro roli \u201eMana\u017eer pizzerie\u201c a \u201eFranchisant\u201c. Zde jsou soust\u0159ed\u011bny funkce pro nastaven\u00ed pizzerie, jej\u00ed bonusov\u00e9 akce, p\u0159\u00edjem a pr\u00e1ce se zam\u011bstnanci, zpr\u00e1vy.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 rozhran\u00ed pro televizory a tablety, kter\u00e9 vis\u00ed v pizzeri\u00edch. Na televizorech se zobrazuje menu, reklamn\u00ed informace a stav objedn\u00e1vky p\u0159i vyd\u00e1n\u00ed.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Pou\u017e\u00edvali spole\u010dnou vrstvu slu\u017eeb, spole\u010dn\u00fd blok dom\u00e9nov\u00fdch t\u0159\u00edd Dodo.Core a tak\u00e9 spole\u010dnou datab\u00e1zi. N\u011bkdy mohla prob\u00edhat interakce mezi jednotliv\u00fdmi weby, jako dodopizza.ru nebo personal.dodopizza.ru.<\/p>\n<p>P\u0159i vzniku nov\u00fdch modul\u016f se sna\u017eili maxim\u00e1ln\u011b znovu vyu\u017e\u00edt ji\u017e vytvo\u0159en\u00fd k\u00f3d slu\u017eeb, ulo\u017een\u00e9 procedury a tabulky v datab\u00e1zi.&nbsp;<\/p>\n<p>Pro lep\u0161\u00ed pochopen\u00ed rozsahu modul\u016f vyvinut\u00fdch v syst\u00e9mu, zde je sch\u00e9ma z roku 2012 s pl\u00e1ny rozvoje:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Do roku 2015 bylo na sch\u00e9matu a je\u0161t\u011b v\u00edc v produkci.<\/p>\n<ul>\n<li>\n<p>P\u0159ijet\u00ed objedn\u00e1vky se prom\u011bnilo v samostatn\u00fd blok Kontaktn\u00edho Centra, kde objedn\u00e1vku p\u0159ij\u00edm\u00e1 oper\u00e1tor.<\/p>\n<\/li>\n<li>\n<p>Objevily se ve\u0159ejn\u00e9 obrazovky s menu a informacemi, kter\u00e9 vis\u00ed v pizzeri\u00edch.<\/p>\n<\/li>\n<li>\n<p>V kuchyni je modul, kter\u00fd automaticky p\u0159ehr\u00e1v\u00e1 hlasovou zpr\u00e1vu \u201eNov\u00e1 pizza\u201c p\u0159i p\u0159ijet\u00ed nov\u00e9ho objedn\u00e1vky a tak\u00e9 tiskne dodac\u00ed list pro kur\u00fdra. To v\u00fdrazn\u011b zjednodu\u0161uje procesy v kuchyni a umo\u017e\u0148uje zam\u011bstnanc\u016fm neodv\u00e1d\u011bt pozornost od velk\u00e9ho mno\u017estv\u00ed jednoduch\u00fdch operac\u00ed.<\/p>\n<\/li>\n<li>\n<p>Blok dod\u00e1vky se stal samostatnou Pokladnou Dod\u00e1vky, kde byl objedn\u00e1vka vyd\u00e1v\u00e1na kur\u00fdrovi, kter\u00fd se p\u0159edem p\u0159ihl\u00e1sil na sm\u011bnu. Byla zohledn\u011bna jeho pracovn\u00ed doba pro v\u00fdpo\u010det mzdy.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Paraleln\u011b mezi lety 2012 a 2015 vzniklo v\u00edce ne\u017e 10 v\u00fdvoj\u00e1\u0159\u016f, otev\u0159elo se 35 pizzeri\u00ed, syst\u00e9m se roz\u0161\u00ed\u0159il do Rumunska a p\u0159ipravil se k otev\u0159en\u00ed pobo\u010dek v USA. V\u00fdvoj\u00e1\u0159i ji\u017e nezaji\u0161\u0165ovali v\u0161echny \u00fakoly, ale byli rozd\u011bleni do t\u00fdm\u016f, z nich\u017e ka\u017ed\u00fd se specializoval na svou \u010d\u00e1st syst\u00e9mu.&nbsp;<\/p>\n<h3>Probl\u00e9my<\/h3>\n<p>V\u010detn\u011b architektury (ale nejen t\u00e9).<\/p>\n<h4>Chaos v datab\u00e1zi<\/h4>\n<p>Jedna datab\u00e1ze je pohodln\u00e1. M\u016f\u017ee dos\u00e1hnout konzistence pomoc\u00ed prost\u0159edk\u016f zabudovan\u00fdch v rela\u010dn\u00edch datab\u00e1z\u00edch. Pr\u00e1ce s n\u00ed je obvykl\u00e1 a snadn\u00e1, zvl\u00e1\u0161t\u011b pokud je tam m\u00e1lo tabulek a m\u00e1lo dat.<\/p>\n<p>Ale za 4 roky v\u00fdvoje se v datab\u00e1zi zjistilo p\u0159ibli\u017en\u011b 600 tabulek, 1500 ulo\u017een\u00fdch procedur, z nich\u017e mnoho obsahovalo i logiku. Bohu\u017eel, ulo\u017een\u00e9 procedury nenab\u00edz\u00ed zvl\u00e1\u0161tn\u00ed v\u00fdhodu p\u0159i pr\u00e1ci s MySQL. Nen\u00ed je mo\u017en\u00e9 \u043a\u0435\u0448ovat datab\u00e1z\u00ed a uchov\u00e1v\u00e1n\u00ed logiky v nich komplikuje v\u00fdvoj a lad\u011bn\u00ed. Op\u011btovn\u00e9 pou\u017eit\u00ed k\u00f3du je tak\u00e9 zt\u00ed\u017eeno.<\/p>\n<p><strong>Na mnoha tabulk\u00e1ch nebyly vhodn\u00e9 indexy<\/strong>, zat\u00edmco jinde bylo naopak p\u0159\u00edli\u0161 mnoho index\u016f, co\u017e zt\u011b\u017eovalo vkl\u00e1d\u00e1n\u00ed. Bylo t\u0159eba modifikovat p\u0159ibli\u017en\u011b 20 tabulek \u2014 transakce na vytvo\u0159en\u00ed objedn\u00e1vky mohla trvat p\u0159ibli\u017en\u011b 3-5 sekundy.&nbsp;<\/p>\n<p><strong>Data v tabulk\u00e1ch nebyla v\u017edy v nejvhodn\u011bj\u0161\u00ed form\u011b<\/strong>. N\u011bkde bylo nutn\u00e9 prov\u00e9st denormalizaci. \u010c\u00e1st pravideln\u011b z\u00edsk\u00e1van\u00fdch dat byla ve sloupci ve form\u011b XML struktury, co\u017e prodlu\u017eovalo dobu vykon\u00e1v\u00e1n\u00ed, zvy\u0161ovalo d\u00e9lku dotaz\u016f a komplikovalo v\u00fdvoj.<\/p>\n<p>Na stejn\u00e9 tabulky se prov\u00e1d\u011bly velmi <strong>r\u016fzn\u00e9 dotazy<\/strong>. Obzvl\u00e1\u0161\u0165 trp\u011bly popul\u00e1rn\u00ed tabulky, jako byla zm\u00edn\u011bn\u00e1 tabulka <em>orders<\/em> nebo tabulka <em>pizzeria<\/em>. Tyto tabulky se pou\u017e\u00edvaly pro v\u00fdstup operativn\u00edch rozhran\u00ed v kuchyni, anal\u00fdzu. K nim se obracel tak\u00e9 web (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), k n\u011bmu\u017e mohlo v ka\u017ed\u00fd okam\u017eik p\u0159ich\u00e1zet n\u00e1hle mnoho po\u017eadavk\u016f.&nbsp;<\/p>\n<p><strong>Data nebyla agregovan\u00e1<\/strong> a mnoho v\u00fdpo\u010dt\u016f prob\u00edhalo za b\u011bhu pomoc\u00ed prost\u0159edk\u016f datab\u00e1ze. To vytv\u00e1\u0159elo zbyte\u010dn\u00e9 v\u00fdpo\u010dty a dodate\u010dn\u00e9 zat\u00ed\u017een\u00ed.&nbsp;<\/p>\n<p>\u010casto k\u00f3d chodil do datab\u00e1ze, kdy\u017e to nemusel. N\u011bkde chyb\u011bly hromadn\u00e9 operace, jinde by bylo pot\u0159eba rozd\u011blit jeden dotaz na n\u011bkolik p\u0159es k\u00f3d, aby se urychlila a zv\u00fd\u0161ila spolehlivost.&nbsp;<\/p>\n<h4>Propojenost a zamotanost v k\u00f3du<\/h4>\n<p><strong>Moduly, kter\u00e9 m\u011bly odpov\u00eddat za sv\u016fj \u00fasek podnik\u00e1n\u00ed, to ned\u011blaly poctiv\u011b.<\/strong>. N\u011bkter\u00e9 z nich m\u011bly duplicity funkc\u00ed pro role. Nap\u0159\u00edklad lok\u00e1ln\u00ed market\u00e9r, kter\u00fd odpov\u00eddal za marketingov\u00e9 aktivity s\u00edt\u011b ve sv\u00e9m m\u011bst\u011b, musel pou\u017e\u00edvat jak rozhran\u00ed \u201eAdmin\u201c (pro zakl\u00e1d\u00e1n\u00ed akc\u00ed), tak rozhran\u00ed \u201eOffice Manager\u201c (pro sledov\u00e1n\u00ed dopadu akc\u00ed na podnik\u00e1n\u00ed). Samoz\u0159ejm\u011b, \u017ee oba moduly uvnit\u0159 pou\u017e\u00edvaly jeden servis, kter\u00fd pracoval s bonusov\u00fdmi akcemi.<\/p>\n<p>Slu\u017eby (t\u0159\u00eddy v r\u00e1mci jednoho monolitick\u00e9ho velk\u00e9ho projektu) se mohly navz\u00e1jem volat pro obohacen\u00ed sv\u00fdch dat.<\/p>\n<p>S t\u011bmi samotn\u00fdmi modelov\u00fdmi t\u0159\u00eddami, kter\u00e9 ukl\u00e1daj\u00ed data, <strong>se pr\u00e1ce v k\u00f3du prov\u00e1d\u011bla r\u016fzn\u011b<\/strong>. N\u011bkde byly konstruktory, p\u0159es kter\u00e9 bylo mo\u017en\u00e9 uv\u00e9st povinn\u00e1 pole. Jinde se to d\u011blalo p\u0159es ve\u0159ejn\u00e9 vlastnosti. Samoz\u0159ejm\u011b, \u017ee z\u00edsk\u00e1v\u00e1n\u00ed a zpracov\u00e1n\u00ed dat z datab\u00e1ze bylo rozmanit\u00e9.&nbsp;<\/p>\n<p><strong>Logika byla bu\u010f v controllerech, nebo ve t\u0159\u00edd\u00e1ch slu\u017eeb.<\/strong>&nbsp;<\/p>\n<p>To jsou na prvn\u00ed pohled nev\u00fdznamn\u00e9 probl\u00e9my, ale v\u00fdrazn\u011b zpomalovaly v\u00fdvoj a sni\u017eovaly kvalitu, co\u017e vedlo k nestabilit\u011b a chyb\u00e1m.&nbsp;<\/p>\n<h4>Slo\u017eitost velk\u00e9ho v\u00fdvoje<\/h4>\n<p><strong>Obt\u00ed\u017ee vznikly i p\u0159i samotn\u00e9m v\u00fdvoji<\/strong>. Bylo t\u0159eba vytv\u00e1\u0159et r\u016fzn\u00e9 bloky syst\u00e9mu, a to paraleln\u011b. Uspokojit pot\u0159eby ka\u017ed\u00e9 komponenty v jednom k\u00f3du se st\u00e1valo \u010d\u00edm d\u00e1l t\u00edm obt\u00ed\u017en\u011bj\u0161\u00ed. Nebylo jednoduch\u00e9 se dohodnout a pot\u011b\u0161it v\u0161echny komponenty najednou. K tomu se p\u0159id\u00e1vala omezen\u00ed technologi\u00ed, zejm\u00e9na v oblasti datab\u00e1ze a front-endu. Bylo t\u0159eba se vzd\u00e1t JQuery ve prosp\u011bch vysoce\u00farov\u0148ov\u00fdch r\u00e1mc\u016f, zejm\u00e9na v \u010d\u00e1sti klientsk\u00fdch slu\u017eeb (web).<\/p>\n<p><strong>V n\u011bkter\u00fdch \u010d\u00e1stech syst\u00e9mu by mohly b\u00fdt pou\u017eity datab\u00e1ze, kter\u00e9 byly pro to vhodn\u011bj\u0161\u00ed<\/strong>. Nap\u0159\u00edklad pozd\u011bji jsme m\u011bli precedent p\u0159echodu z Redis na CosmosDB pro ukl\u00e1d\u00e1n\u00ed n\u00e1kupn\u00edho ko\u0161\u00edku.&nbsp;<\/p>\n<p>T\u00fdmy a v\u00fdvoj\u00e1\u0159i, kte\u0159\u00ed pracovali ve sv\u00fdch oblastech, cht\u011bli jasn\u011b v\u011bt\u0161\u00ed samostatnost pro sv\u00e9 slu\u017eby, jak v oblasti v\u00fdvoje, tak i nasazen\u00ed. Konflikty p\u0159i slu\u010dov\u00e1n\u00ed, probl\u00e9my p\u0159i vyd\u00e1n\u00edch. Pokud tato probl\u00e9m nehraje pro 5 v\u00fdvoj\u00e1\u0159\u016f v\u00fdznamnou roli, p\u0159i 10, a rozhodn\u011b p\u0159i pl\u00e1novan\u00e9m r\u016fstu, by to v\u0161e bylo v\u00e1\u017en\u011bj\u0161\u00ed. A p\u0159ed n\u00e1mi byla v\u00fdvoj mobiln\u00ed aplikace (ta za\u010dala v roce 2017, a v roce 2018 bylo) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">velk\u00e9 selh\u00e1n\u00ed<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>R\u016fzn\u00e9 \u010d\u00e1sti syst\u00e9mu vy\u017eadovaly r\u016fzn\u00e9 ukazatele stability.<\/strong>, ale kv\u016fli siln\u00e9 prov\u00e1zanosti syst\u00e9mu jsme to nemohli zajistit. Chyba p\u0159i v\u00fdvoji nov\u00e9 funkce v administraci mohla klidn\u011b ovlivnit p\u0159\u00edjem objedn\u00e1vek na webu, proto\u017ee k\u00f3d je spole\u010dn\u00fd a znovu pou\u017eiteln\u00fd a datab\u00e1ze a data jsou tak\u00e9 jednotn\u00e9.<\/p>\n<p>Pravd\u011bpodobn\u011b by bylo mo\u017en\u00e9 se v r\u00e1mci takov\u00e9 monolitn\u011b-modul\u00e1rn\u00ed architektury vyhnout t\u011bmto chyb\u00e1m a probl\u00e9m\u016fm: rozd\u011blit odpov\u011bdnost, prov\u00e1d\u011bt refaktoring jak k\u00f3du, tak datab\u00e1ze, jasn\u011b odd\u011blovat vrstvy od sebe, ka\u017ed\u00fd den sledovat kvalitu. Ale zvolen\u00e1 architektonick\u00e1 \u0159e\u0161en\u00ed a zam\u011b\u0159en\u00ed na rychl\u00e9 roz\u0161i\u0159ov\u00e1n\u00ed funk\u010dnosti syst\u00e9mu vedly k probl\u00e9m\u016fm v oblasti stability.<\/p>\n<h4>Jak blog S\u00edla mysli polo\u017eil pokladny v restaurac\u00edch<\/h4>\n<p>Pokud by r\u016fst s\u00edt\u011b pizzeri\u00ed (a zat\u00ed\u017een\u00ed) pokra\u010doval stejn\u00fdm tempem, pak by za n\u011bjakou dobu poklesy byly takov\u00e9, \u017ee by se syst\u00e9m ani nezvedl. Dob\u0159e ilustruje probl\u00e9my, se kter\u00fdmi jsme za\u010dali \u010delit kolem roku 2015, takov\u00fd p\u0159\u00edb\u011bh.&nbsp;<\/p>\n<p>Na blogu \u201e<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>S\u00edla mysli<\/u><\/a><\/noindex>\u201c byl widget, kter\u00fd zobrazoval \u00fadaje o tr\u017eb\u00e1ch za rok cel\u00e9 s\u00edt\u011b. Widget se obracel na ve\u0159ejn\u00e9 API Dodo, kter\u00e9 tyto \u00fadaje poskytuje. Nyn\u00ed jsou tyto statistiky k dispozici na <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Widget se zobrazoval na ka\u017ed\u00e9 str\u00e1nce a prov\u00e1d\u011bl dotazy po \u010dasova\u010di ka\u017ed\u00fdch 20 sekund. Dotaz m\u011bl formu do api.dodopizza.ru a ptal se na:<\/p>\n<ul>\n<li>\n<p>po\u010det pizzeri\u00ed v s\u00edti;<\/p>\n<\/li>\n<li>\n<p>celkov\u00e9 tr\u017eby s\u00edt\u011b od za\u010d\u00e1tku roku;<\/p>\n<\/li>\n<li>\n<p>tr\u017eby za dne\u0161ek.<\/p>\n<\/li>\n<\/ul>\n<p>Dotaz na statistiku o tr\u017eb\u00e1ch \u0161el p\u0159\u00edmo do datab\u00e1ze a za\u010dal vy\u017eadovat data o objedn\u00e1vk\u00e1ch, agregovat data p\u0159\u00edmo za b\u011bhu a vyd\u00e1vat sou\u010det.&nbsp;<\/p>\n<p>Do t\u00e9to tabulky objedn\u00e1vek chodily Pokladny v restaurac\u00edch, exportovaly seznam p\u0159ijat\u00fdch objedn\u00e1vek za dne\u0161ek, a tak\u00e9 se do n\u00ed p\u0159id\u00e1valy nov\u00e9 objedn\u00e1vky. Pokladny prov\u00e1d\u011bly sv\u00e9 dotazy ka\u017ed\u00fdch 5 sekund nebo p\u0159i obnoven\u00ed str\u00e1nky.<\/p>\n<p>Sch\u00e9ma vypadalo takto:<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Jednou na podzim napsal Fjodor Ov\u010dinnikov na sv\u016fj blog dlouh\u00fd a popul\u00e1rn\u00ed \u010dl\u00e1nek. Na blog p\u0159i\u0161lo mnoho lid\u00ed a za\u010dali pe\u010dliv\u011b \u010d\u00edst. Zat\u00edmco ka\u017ed\u00fd z p\u0159\u00edtomn\u00fdch \u010detl \u010dl\u00e1nek, widget s tr\u017ebami spolehliv\u011b pracoval a \u017e\u00e1dal API ka\u017ed\u00fdch 20 sekund.<\/p>\n<p>API zavolalo ulo\u017eenou proceduru pro v\u00fdpo\u010det sou\u010dtu v\u0161ech objedn\u00e1vek od za\u010d\u00e1tku roku pro v\u0161echny pizzerie \u0159et\u011bzce. Agregace b\u011b\u017eela p\u0159es tabulku orders, kter\u00e1 je velmi popul\u00e1rn\u00ed. Do n\u00ed chod\u00ed v\u0161echny pokladny v\u0161ech otev\u0159en\u00fdch restaurac\u00ed v tu dobu. Pokladny p\u0159estaly reagovat, objedn\u00e1vky nebyly p\u0159ij\u00edm\u00e1ny. Objedn\u00e1vky rovn\u011b\u017e nebyly p\u0159ij\u00edm\u00e1ny ze str\u00e1nky, neobjevily se na trackeru, sm\u011bnov\u00fd mana\u017eer je nemohl vid\u011bt ve sv\u00e9m rozhran\u00ed.&nbsp;<\/p>\n<p>To nen\u00ed jedin\u00fd p\u0159\u00edb\u011bh. Do podzimu 2015 byla z\u00e1t\u011b\u017e na syst\u00e9m kritick\u00e1 ka\u017ed\u00fd p\u00e1tek. N\u011bkolikr\u00e1t jsme museli vypnout ve\u0159ejn\u00e9 API a jednou jsme dokonce museli odpojit web, proto\u017ee u\u017e nic nepom\u00e1halo. Dokonce jsme m\u011bli seznam slu\u017eeb s po\u0159ad\u00edm odpojen\u00ed p\u0159i z\u00e1va\u017en\u00fdch z\u00e1t\u011b\u017e\u00edch.<\/p>\n<p>Od t\u00e9to doby za\u010d\u00edn\u00e1 n\u00e1\u0161 boj se z\u00e1t\u011b\u017eemi a za stabilizaci syst\u00e9mu (od podzimu 2015 do podzimu 2018). Pr\u00e1v\u011b tehdy do\u0161lo k \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Velk\u00e9mu p\u00e1du<\/u><\/a><\/noindex>\". I d\u00e1le doch\u00e1zelo k ob\u010dasn\u00fdm v\u00fdpadk\u016fm, n\u011bkter\u00e9 byly docela citliv\u00e9, ale celkov\u00e9 obdob\u00ed nestability nyn\u00ed m\u016f\u017eeme pova\u017eovat za p\u0159ekonan\u00e9.<\/p>\n<h4>Bou\u0159liv\u00fd r\u016fst podnik\u00e1n\u00ed<\/h4>\n<p>Pro\u010d nebylo mo\u017en\u00e9 \"ud\u011blat to ihned dob\u0159e\"? Sta\u010d\u00ed se pod\u00edvat na n\u00e1sleduj\u00edc\u00ed grafy.<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tak\u00e9 v letech 2014-2015 do\u0161lo k otev\u0159en\u00ed v Rumunsku a bylo p\u0159ipravov\u00e1no otev\u0159en\u00ed v USA.<\/p>\n<p>S\u00ed\u0165 rostla velmi rychle, otev\u00edraly se nov\u00e9 zem\u011b, objevily se nov\u00e9 form\u00e1ty pizzeri\u00ed, nap\u0159\u00edklad se otev\u0159ela pizzerie na food courtu. To v\u0161echno vy\u017eadovalo zna\u010dnou pozornost pr\u00e1v\u011b k roz\u0161\u00ed\u0159en\u00ed funkc\u00ed Dodo IS. Bez v\u0161ech t\u011bchto funkc\u00ed, bez sledov\u00e1n\u00ed v kuchyni, sledov\u00e1n\u00ed produkt\u016f a ztr\u00e1t v syst\u00e9mu, zobrazen\u00ed vyd\u00e1n\u00ed objedn\u00e1vky v oblasti food courtu, bychom mo\u017en\u00e1 nyn\u00ed nemohli diskutovat o \"spr\u00e1vn\u00e9\" architektu\u0159e a \"spr\u00e1vn\u00e9m\" p\u0159\u00edstupu k v\u00fdvoji.<\/p>\n<p>Dal\u0161\u00edmi p\u0159ek\u00e1\u017ekami pro v\u010dasnou revizi architektury a v\u016fbec pro pozornost k technick\u00fdm probl\u00e9m\u016fm byl krize v roce 2014. Tyto v\u011bci t\u011b\u017ece zas\u00e1hly mo\u017enosti pro r\u016fst t\u00fdm\u016f, zejm\u00e9na pro mlad\u00e9 podnik\u00e1n\u00ed, jak\u00fdm byla Dodo Pizza.<\/p>\n<h3>Rychl\u00e1 \u0159e\u0161en\u00ed, kter\u00e1 pomohla<\/h3>\n<p>Probl\u00e9my vy\u017eadovaly \u0159e\u0161en\u00ed. \u0158e\u0161en\u00ed lze zjednodu\u0161en\u011b rozd\u011blit do dvou skupin:<\/p>\n<ul>\n<li>\n<p>Rychl\u00e1, kter\u00e1 has\u00ed po\u017e\u00e1r a poskytuj\u00ed malou rezervu s\u00edly a z\u00edsk\u00e1vaj\u00ed n\u00e1m \u010das na zm\u011bny.<\/p>\n<\/li>\n<li>\n<p>Syst\u00e9mov\u00e1 a tud\u00ed\u017e, dlouh\u00e1. Reengineering \u0159ady modul\u016f, d\u011blen\u00ed monolitick\u00e9 architektury na jednotliv\u00e9 slu\u017eby (v\u011bt\u0161ina z nich je sp\u00ed\u0161e makroslu\u017eby ne\u017e mikro slu\u017eby a o tom existuj\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>Zpr\u00e1va Andreje Morevsk\u00e9ho<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Such\u00fd seznam rychl\u00fdch zm\u011bn je n\u00e1sleduj\u00edc\u00ed:<\/p>\n<h4>Zv\u011bt\u0161en\u00ed master datab\u00e1ze<\/h4>\n<p>Samoz\u0159ejm\u011b, prvn\u00edm krokem v boji s n\u00e1roky je zv\u00fd\u0161en\u00ed v\u00fdkonu serveru. To bylo provedeno jak pro master datab\u00e1zi, tak pro webov\u00e9 servery. Bohu\u017eel to lze prov\u00e9st pouze do ur\u010dit\u00e9 m\u00edry, pot\u00e9 se to st\u00e1v\u00e1 p\u0159\u00edli\u0161 drah\u00fdm.<\/p>\n<p>Od roku 2014 jsme p\u0159e\u0161li na Azure, o tom jsme tak\u00e9 psali v \u010dl\u00e1nku \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Jak Dodo Pizza dod\u00e1v\u00e1 pizzu pomoc\u00ed cloudu Microsoft Azure<\/a><\/noindex>\u201c. Ale po s\u00e9rii zv\u00fd\u0161en\u00ed serveru pro datab\u00e1zi jsme narazili na n\u00e1klady.&nbsp;<\/p>\n<h4>Repliky datab\u00e1ze pro \u010dten\u00ed<\/h4>\n<p>Byly vytvo\u0159eny dv\u011b repliky pro datab\u00e1zi:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>pro dotazy na adres\u00e1\u0159e<\/strong>. Pou\u017e\u00edv\u00e1 se pro \u010dten\u00ed adres\u00e1\u0159\u016f, nap\u0159\u00edklad m\u011bst, ulic, pizzeri\u00ed, produkt\u016f (slowly changed domain), a v t\u011bch rozhran\u00edch, kde je povolen mal\u00fd zpo\u017ed\u011bn\u00ed. T\u011bchto replik bylo 2, jejich\u017e dostupnost jsme zabezpe\u010dili stejn\u011b jako u master datab\u00e1ze.<\/p>\n<p><strong>ReadReplica pro dotazy na reporty<\/strong>. Tato datab\u00e1ze m\u011bla ni\u017e\u0161\u00ed dostupnost, ale byla vyu\u017e\u00edv\u00e1na pro v\u0161echny reporty. A\u010dkoli m\u011bly t\u011b\u017ek\u00e9 dotazy na obrovsk\u00e9 p\u0159epo\u010dty dat, nijak neovliv\u0148uj\u00ed master datab\u00e1zi a provozn\u00ed rozhran\u00ed.&nbsp;<\/p>\n<h4>Cache v k\u00f3du<\/h4>\n<p>V k\u00f3du nebylo \u017e\u00e1dn\u00e9 cache (v\u016fbec). To vedlo k dal\u0161\u00edm, ne v\u017edy pot\u0159ebn\u00fdm, dotaz\u016fm na p\u0159et\u00ed\u017eenou datab\u00e1zi. Cache byly p\u016fvodn\u011b jak v pam\u011bti, tak na extern\u00edm cache slu\u017eb\u011b, co\u017e byl Redis. V\u0161echno bylo invalidov\u00e1no \u010dasem, nastaven\u00ed bylo uvedeno v k\u00f3du.<\/p>\n<h4>N\u011bkolik server\u016f pro backend<\/h4>\n<p>Backend aplikace bylo tak\u00e9 nutn\u00e9 \u0161k\u00e1lovat, aby zvl\u00e1dal zv\u00fd\u0161en\u00e9 zat\u00ed\u017een\u00ed. Bylo t\u0159eba vytvo\u0159it z jednoho iis-serveru cluster. P\u0159enesli jsme <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>sezen\u00ed aplikac\u00ed<\/u><\/a><\/noindex> z pam\u011bti na RedisCache, co\u017e umo\u017enilo vytvo\u0159it n\u011bkolik server\u016f stoj\u00edc\u00edch za jednoduch\u00fdm vyva\u017eova\u010dem zat\u00ed\u017een\u00ed s round robin. Nejprve byl pou\u017eit ten sam\u00fd Redis, kter\u00fd byl pou\u017eit pro cache, pot\u00e9 jsme to rozd\u011blili na n\u011bkolik.&nbsp;<\/p>\n<p>Nakonec se architektura zkomplikovala\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historie architektury Dodo IS: ran\u00fd monolit\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026ale \u010d\u00e1st nap\u011bt\u00ed se poda\u0159ilo uvolnit.<\/p>\n<p>A pak bylo t\u0159eba p\u0159epracovat p\u0159et\u00ed\u017een\u00e9 komponenty, co\u017e jsme tak\u00e9 ud\u011blali. O tom budeme hovo\u0159it v dal\u0161\u00ed \u010d\u00e1sti.<\/p>\n<p>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Historie architektury Dodo IS: ran\u00fd monolit | ProHoster","description":"Nebo ka\u017ed\u00e1 ne\u0161\u0165astn\u00e1 firma s monolitem je ne\u0161\u0165astn\u00e1 sv\u00fdm vlastn\u00edm zp\u016fsobem. V\u00fdvoj syst\u00e9mu Dodo IS za\u010dal okam\u017eit\u011b, jakmile byl zah\u00e1jen byznys Dodo Pizzy \u2014 v roce 2011.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}