{"id":36721,"date":"2019-10-31T22:13:20","date_gmt":"2019-10-31T19:13:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-dark-razvertyvaet-kod-za-50-ms\/"},"modified":"2019-10-31T22:13:20","modified_gmt":"2019-10-31T19:13:20","slug":"kak-dark-razvertyvaet-kod-za-50-ms","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"Ako Dark roz\u0161iruje k\u00f3d za 50 ms","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ako Dark roz\u0161iruje k\u00f3d za 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010c\u00edm r\u00fdchlej\u0161ie je vyv\u00edjanie, t\u00fdm r\u00fdchlej\u0161ie sa rozv\u00edja technologick\u00e1 spolo\u010dnos\u0165.<\/p>\n<p><\/p>\n<p>Bohu\u017eia\u013e, modern\u00e9 aplik\u00e1cie pracuj\u00fa proti n\u00e1m \u2013 na\u0161e syst\u00e9my musia by\u0165 aktualizovan\u00e9 v re\u00e1lnom \u010dase a pritom nikomu neprek\u00e1\u017ea\u0165, ani nesp\u00f4sobova\u0165 v\u00fdpadky a prestoje. Nasadenie v tak\u00fdchto syst\u00e9moch sa st\u00e1va zlo\u017eitou \u00falohou a vy\u017eaduje zlo\u017eit\u00fa kontinuitu dod\u00e1vok aj v mal\u00fdch t\u00edmach.<\/p>\n<p><\/p>\n<p>Tieto pipeline maj\u00fa zvy\u010dajne \u00fazke vyu\u017eitie, pracuj\u00fa pomaly a nie s\u00fa spo\u013eahliv\u00e9. V\u00fdvoj\u00e1ri ich musia najprv vytvori\u0165 manu\u00e1lne a potom nimi spravova\u0165, pri\u010dom spolo\u010dnosti \u010dasto naj\u00edmaj\u00fa cel\u00e9 t\u00edmy DevOps na t\u00fato \u00falohu.<\/p>\n<p><\/p>\n<p>Na r\u00fdchlosti t\u00fdchto pipeline z\u00e1vis\u00ed r\u00fdchlos\u0165 v\u00fdvoja. U najlep\u0161\u00edch t\u00edmov trv\u00e1 nasadenie 5\u201310 min\u00fat, ale zvy\u010dajne to trv\u00e1 ove\u013ea dlh\u0161ie a na jedno nasadenie je potrebn\u00fdch nieko\u013eko hod\u00edn.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Na to v Dark je potrebn\u00fdch 50 ms. <em>P\u00e4\u0165desiat. Milisek\u00fand.<\/em>. Dark je <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">komplexn\u00e9 rie\u0161enie s programovac\u00edm jazykom, editorom a infra\u0161trukt\u00farou<\/a><\/noindex>, vytvoren\u00e9 \u0161peci\u00e1lne pre kontinu\u00e1lnu dod\u00e1vku, a v\u0161etky aspekty Dark, vr\u00e1tane samotn\u00e9ho jazyka, s\u00fa postaven\u00e9 s oh\u013eadom na bezpe\u010dn\u00e9 okam\u017eit\u00e9 nasadenie.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Pre\u010do s\u00fa pipeline kontinu\u00e1lnej dod\u00e1vky tak\u00e9 pomal\u00e9?<\/h3>\n<p><\/p>\n<p>Predpokladajme, \u017ee m\u00e1me webov\u00fa aplik\u00e1ciu v Pythone a u\u017e sme vytvorili skvel\u00fd a modern\u00fd pipeline kontinu\u00e1lnej dod\u00e1vky. Pre v\u00fdvoj\u00e1ra, ktor\u00fd sa ka\u017ed\u00fd de\u0148 zaober\u00e1 t\u00fdmto projektom, bude nasadenie jednej drobnej zmeny vyzera\u0165 zhruba takto:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">Upravenie zmien<\/h3>\n<p><\/p>\n<ul>\n<li>Vytvorenie novej vetvy v gite<\/li>\n<li>Upravenie zmien pod prep\u00edna\u010dom funkcie<\/li>\n<li>Modulov\u00e9 testovanie na overenie zmien s prep\u00edna\u010dom funkcie a bez neho<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">Pull request<\/h3>\n<p><\/p>\n<ul>\n<li>Commit zmien<\/li>\n<li>Odoslanie zmien do vzdialen\u00e9ho repozit\u00e1ra na github<\/li>\n<li>Pull request<\/li>\n<li>CI sa automaticky vykon\u00e1va na pozad\u00ed<\/li>\n<li>Revize k\u00f3du<\/li>\n<li>E\u0161te p\u00e1r rev\u00edzi\u00ed, ak je to potrebn\u00e9<\/li>\n<li>Spojenie zmien s hlavn\u00fdm gitom.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI sa vykon\u00e1va na hlavnom vetve<\/h3>\n<p><\/p>\n<ul>\n<li>In\u0161tal\u00e1cia frontendov\u00fdch z\u00e1vislost\u00ed cez npm<\/li>\n<li>Stavba a optimaliz\u00e1cia HTML+CSS+JS zdrojov<\/li>\n<li>Spustenie modulov\u00fdch a funk\u010dn\u00fdch testov na frontende<\/li>\n<li>In\u0161tal\u00e1cia Python z\u00e1vislost\u00ed z PyPI<\/li>\n<li>Spustenie modulov\u00fdch a funk\u010dn\u00fdch testov na backend-e<\/li>\n<li>Testovanie integr\u00e1cie na oboch koncoch<\/li>\n<li>Odoslanie frontendov\u00fdch zdrojov do CDN<\/li>\n<li>Stavba kontajnera pre Python program<\/li>\n<li>Odoslanie kontajnera do registra<\/li>\n<li>Aktualiz\u00e1cia manifestu Kubernetes<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Nahradenie star\u00e9ho k\u00f3du nov\u00fdm<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes sp\u00fa\u0161\u0165a nieko\u013eko exempl\u00e1rov nov\u00e9ho kontajnera<\/li>\n<li>Kubernetes \u010dak\u00e1, k\u00fdm sa exempl\u00e1re stan\u00fa funk\u010dn\u00fdmi<\/li>\n<li>Kubernetes prid\u00e1va exempl\u00e1re do HTTP vyva\u017eova\u010da za\u0165a\u017eenia<\/li>\n<li>Kubernetes \u010dak\u00e1, k\u00fdm sa star\u00e9 exempl\u00e1re prestan\u00fa pou\u017e\u00edva\u0165<\/li>\n<li>Kubernetes zastavuje star\u00e9 exempl\u00e1re<\/li>\n<li>Kubernetes opakuje tieto oper\u00e1cie, k\u00fdm nov\u00e9 exempl\u00e1re nenahradia v\u0161etky star\u00e9<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Aktiv\u00e1cia nov\u00e9ho prep\u00edna\u010da funkci\u00ed<\/h3>\n<p><\/p>\n<ul>\n<li>Nov\u00fd k\u00f3d sa aktivuje iba pre seba, aby sa zabezpe\u010dilo, \u017ee v\u0161etko je v poriadku<\/li>\n<li>Nov\u00fd k\u00f3d sa aktivuje pre 10 % pou\u017e\u00edvate\u013eov, sleduj\u00fa sa prev\u00e1dzkov\u00e9 a obchodn\u00e9 metriky<\/li>\n<li>Nov\u00fd k\u00f3d sa aktivuje pre 50 % pou\u017e\u00edvate\u013eov, sleduj\u00fa sa prev\u00e1dzkov\u00e9 a obchodn\u00e9 metriky<\/li>\n<li>Nov\u00fd k\u00f3d sa aktivuje pre 100 % pou\u017e\u00edvate\u013eov, sleduj\u00fa sa prev\u00e1dzkov\u00e9 a obchodn\u00e9 metriky<\/li>\n<li>Nakoniec opakujete cel\u00fd postup, aby ste odstr\u00e1nili star\u00fd k\u00f3d a prep\u00edna\u010d<\/li>\n<\/ul>\n<p><\/p>\n<p>Proces z\u00e1vis\u00ed od n\u00e1strojov, jazyka a pou\u017e\u00edvanej architekt\u00fary orientovanej na slu\u017eby, ale v skratke vyzer\u00e1 takto. Nespomenul som nasadenia s migr\u00e1ciou datab\u00e1z, preto\u017ee to si vy\u017eaduje d\u00f4kladn\u00e9 pl\u00e1novanie, ale ni\u017e\u0161ie vysvetl\u00edm, ako s t\u00fdm Dark popracoval.<\/p>\n<p><\/p>\n<p>Je tu ve\u013ea komponentov a mnoh\u00e9 z nich m\u00f4\u017eu \u013eahko sp\u00f4sobova\u0165 spomalenie, zlyhanie, vyvol\u00e1va\u0165 do\u010dasn\u00fa konkurenciu alebo zr\u00fati\u0165 pracovn\u00fd syst\u00e9m.<\/p>\n<p><\/p>\n<p>A ke\u010f\u017ee tieto pipeliny s\u00fa takmer v\u017edy vytvoren\u00e9 na \u0161pecifick\u00e9 pr\u00edpady, \u0165a\u017eko sa na ne spoliahnu\u0165. Mnoh\u00ed maj\u00fa dni, ke\u010f nie je mo\u017en\u00e9 nasadi\u0165 k\u00f3d, preto\u017ee s\u00fa v Dockerfile probl\u00e9my, v jednom z desiatok slu\u017eieb do\u0161lo k zlyhaniu, alebo potrebn\u00fd odborn\u00edk je na dovolenke.<\/p>\n<p><\/p>\n<p>Hor\u0161ie je, \u017ee mnoh\u00e9 z t\u00fdchto krokov v\u00f4bec nerobia ni\u010d u\u017eito\u010dn\u00e9. Potrebovali sme ich v minulosti, ke\u010f sme nasadzovali k\u00f3d priamo pre pou\u017e\u00edvate\u013eov, ale teraz m\u00e1me prep\u00edna\u010de pre nov\u00fd k\u00f3d, a tieto procesy sa rozdelili. V\u00fdsledkom je, \u017ee krok, v ktorom sa nasadzuje k\u00f3d (star\u00fd je nahraden\u00fd nov\u00fdm), sa teraz stal jednoducho zbyto\u010dn\u00fdm rizikom.<\/p>\n<p><\/p>\n<p>Samozrejme, \u017ee je to ve\u013emi premyslen\u00e1 pipeline. T\u00edm, ktor\u00fd ju vytvoril, ne\u0161etril \u010dasom a peniazmi na r\u00fdchle nasadenie. Obvykle s\u00fa nasadzovacie pipeliny ove\u013ea pomal\u0161ie a menej spo\u013eahliv\u00e9.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Implement\u00e1cia kontinu\u00e1lnej dod\u00e1vky v Dark<\/h3>\n<p><\/p>\n<p>Nepretr\u017eit\u00e1 dod\u00e1vka je pre Dark tak d\u00f4le\u017eit\u00e1, \u017ee sme sa od za\u010diatku sna\u017eili dosiahnu\u0165 \u010das menej ne\u017e sekundu. Pre\u0161li sme v\u0161etky kroky pipeline, aby sme odstr\u00e1nili v\u0161etko zbyto\u010dn\u00e9, a to, \u010do zostalo, sme doladili. Tu je, ako sme odstra\u0148ovali kroky.<\/p>\n<p><\/p>\n<blockquote><p>Jessie Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) vytvorila nov\u00e9 slovo deployless (nevy\u017eaduje nasadenie) na konferencii Future of Software Development v Reykjav\u00edku<\/p><\/blockquote>\n<p>Okam\u017eite sme sa rozhodli, \u017ee Dark bude zalo\u017een\u00fd na koncepcii \u201edeployless\u201c (\u010fakujem <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex> za neologizmus). Deployless znamen\u00e1, \u017ee ak\u00fdko\u013evek k\u00f3d sa okam\u017eite nasad\u00ed a je pripraven\u00fd na pou\u017eitie v produkcii. Samozrejme, nezme\u0161k\u00e1me chybov\u00fd alebo ne\u00fapln\u00fd k\u00f3d (principy bezpe\u010dnosti op\u00ed\u0161em ni\u017e\u0161ie).<\/p>\n<p><\/p>\n<p>Na demon\u0161tr\u00e1cii Dark sa n\u00e1s \u010dasto p\u00fdtali, ako sme sa podarilo tak ur\u00fdchli\u0165 nasadenie. Zvl\u00e1\u0161tny ot\u00e1zka. \u013dudia si asi myslia, \u017ee sme vymysleli nejak\u00fa supertechnol\u00f3giu, ktor\u00e1 porovn\u00e1va k\u00f3d, kompiluje ho, bal\u00ed do kontajnera, sp\u00fa\u0161\u0165a virtu\u00e1lnu ma\u0161inu, na studeno sp\u00fa\u0161\u0165a kontajner a to v\u0161etko za 50 ms. Ur\u010dite to nie je mo\u017en\u00e9. Ale vytvorili sme \u0161peci\u00e1lny n\u00e1stroj na nasadenie, ktor\u00fd to v\u0161etko ani nepotrebuje.<\/p>\n<p><\/p>\n<p>Dark sp\u00fa\u0161\u0165a interpret\u00e1tory v oblaku. Predpokladajme, \u017ee p\u00ed\u0161ete k\u00f3d vo funkcii alebo spracovate\u013eovi HTTP alebo udalost\u00ed. Posielame diff do abstraktn\u00e9ho syntaktick\u00e9ho stromu (implement\u00e1cia k\u00f3du, ktor\u00fa vn\u00fatorne vyu\u017e\u00edva n\u00e1\u0161 editor a servery) na na\u0161e servery a potom sp\u00fa\u0161\u0165ame tento k\u00f3d, ke\u010f prich\u00e1dzaj\u00fa po\u017eiadavky. Tak\u017ee nasadenie vyzer\u00e1 jednoducho ako skromn\u00fd z\u00e1znam do datab\u00e1zy \u2014 okam\u017eit\u00e9 a element\u00e1rne. Nasadenie prebieha tak r\u00fdchlo, preto\u017ee zah\u0155\u0148a najminimum.<\/p>\n<p><\/p>\n<p>V bud\u00facnosti pl\u00e1nujeme urobi\u0165 z Dark kompil\u00e1tor infra\u0161trukt\u00fary, ktor\u00fd vytvor\u00ed a spust\u00ed ide\u00e1lnu infra\u0161trukt\u00faru pre vysok\u00fd v\u00fdkon a spo\u013eahlivos\u0165 aplik\u00e1ci\u00ed. Okam\u017eit\u00e9 nasadenie sa samozrejme nikam nestrat\u00ed.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Bezpe\u010dn\u00e9 nasadenie<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">\u0160trukt\u00farovan\u00fd editor<\/h3>\n<p><\/p>\n<p>K\u00f3d v Dark sa p\u00ed\u0161e v editore Dark. \u0160trukt\u00farovan\u00fd editor neumo\u017e\u0148uje syntaktick\u00e9 chyby. V podstate, v Dark ani nem\u00e1me analyz\u00e1tor. K\u00fdm p\u00ed\u0161ete text, priamo pracujeme s abstraktn\u00fdm syntaktick\u00fdm stromom (AST), ako <noindex><a rel=\"nofollow\" href=\"http:\/\/danmidwood.com\/content\/2014\/11\/21\/animated-paredit.html\">Paredit<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ravichugh.github.io\/sketch-n-sketch\/\">Sketch-n-Sketch<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/gregoor.github.io\/tofu\/\">Tofu<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/notes\/kent-beck\/prune-a-code-editor-that-is-not-a-text-editor\/1012061842160013\/\">Prune<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd nedokon\u010den\u00fd k\u00f3d v Dark m\u00e1 pr\u00edpustn\u00fa s\u00e9mantiku vykon\u00e1vania, zhruba ako <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">typed holes v Hazel<\/a><\/noindex>Napr\u00edklad, ak zm\u011bn\u00edte volanie funkcie, uchov\u00e1vame star\u00fa funkciu, k\u00fdm nov\u00e1 nebud\u00fa vhodn\u00e1.<\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd program v Dark m\u00e1 svoj v\u00fdznam, preto ne\u00fapln\u00fd k\u00f3d nebr\u00e1ni dokon\u010den\u00e9mu fungova\u0165.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Re\u017eimy \u00faprav<\/h3>\n<p><\/p>\n<p>K\u00f3d v Dark p\u00ed\u0161ete v dvoch pr\u00edpadoch. Po prv\u00e9: p\u00ed\u0161ete nov\u00fd k\u00f3d a ste jedin\u00fdm pou\u017e\u00edvate\u013eom. Napr\u00edklad, nach\u00e1dza sa to v REPL a in\u00ed pou\u017e\u00edvate\u013eia k nemu nikdy nemaj\u00fa pr\u00edstup, alebo je to nov\u00e1 HTTP trasa, na ktor\u00fa sa nikde neodkazujete. Tu m\u00f4\u017eete pracova\u0165 bez ak\u00fdchko\u013evek opatren\u00ed a teraz presne takto pracujete v prostred\u00ed v\u00fdvoja.<\/p>\n<p><\/p>\n<p>Druh\u00e1 situ\u00e1cia: k\u00f3d sa u\u017e pou\u017e\u00edva. Ak pre k\u00f3d prech\u00e1dza prev\u00e1dzka (funkcie, spracovatelia udalost\u00ed, datab\u00e1zy at\u010f.), treba by\u0165 opatrn\u00fd. Na to blokujeme cel\u00fd pou\u017e\u00edvan\u00fd k\u00f3d a vy\u017eadujeme pou\u017eitie \u0161trukt\u00farovanej\u0161\u00edch n\u00e1strojov na jeho \u00fapravu. O \u0161trukt\u00farovan\u00fdch n\u00e1strojoch sa rozpr\u00e1vam ni\u017e\u0161ie: prep\u00edna\u010de funkci\u00ed pre spracovate\u013eov HTTP a udalost\u00ed, v\u00fdkonne migra\u010dn\u00e9 platformy pre datab\u00e1zy a nov\u00fd sp\u00f4sob spr\u00e1vy verzi\u00ed pre funkcie a typy.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Prep\u00edna\u010de funkci\u00ed<\/h3>\n<p><\/p>\n<p>Jeden zo sp\u00f4sobov <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">odstr\u00e1nenia nadbyto\u010dnej zlo\u017eitosti<\/a><\/noindex> v Dark je odstr\u00e1ni\u0165 nieko\u013eko probl\u00e9mov jedn\u00fdm rie\u0161en\u00edm. Prep\u00edna\u010de funkci\u00ed vykon\u00e1vaj\u00fa mnoho r\u00f4znych \u00faloh: nahr\u00e1dzaj\u00fa lok\u00e1lne prostredie v\u00fdvoja, git vetvy, nasadzovanie k\u00f3du a samozrejme tradi\u010dn\u00e9 pomal\u00e9 a kontrolovan\u00e9 vyd\u00e1vanie nov\u00e9ho k\u00f3du.<\/p>\n<p><\/p>\n<p>Vytvorenie a nasadenie prep\u00edna\u010da funkcie sa vykon\u00e1va v na\u0161om editore v jednej oper\u00e1cii. Vytv\u00e1ra pr\u00e1zdny priestor pre nov\u00fd k\u00f3d a poskytuje ovl\u00e1dacie prvky na pr\u00edstup k star\u00e9mu a nov\u00e9mu k\u00f3du, ako aj tla\u010didl\u00e1 a pr\u00edkazy na postupn\u00fd prechod na nov\u00fd k\u00f3d alebo jeho vyl\u00fa\u010denie.<\/p>\n<p><\/p>\n<p>Prep\u00edna\u010de funkci\u00ed s\u00fa zabudovan\u00e9 do jazyka Dark, a dokonca aj ne\u00fapln\u00e9 prep\u00edna\u010de vykon\u00e1vaj\u00fa svoju \u00falohu \u2013 ak podmienka v prep\u00edna\u010di nie je splnen\u00e1, bude sa vykon\u00e1va\u0165 star\u00fd zablokovan\u00fd k\u00f3d.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Prostredie pre v\u00fdvoj<\/h3>\n<p><\/p>\n<p>Prep\u00edna\u010de funkci\u00ed nahr\u00e1dzaj\u00fa lok\u00e1lne prostredie v\u00fdvoja. Dnes maj\u00fa t\u00edmy \u0165a\u017ekosti so zabezpe\u010den\u00edm toho, aby v\u0161etci pou\u017e\u00edvali rovnak\u00e9 verzie n\u00e1strojov a kni\u017en\u00edc (n\u00e1stroje na form\u00e1tovanie k\u00f3du, lintery, spr\u00e1vca bal\u00edkov, kompil\u00e1tory, predprocesory, testovacie n\u00e1stroje a pod.) S Dark nie je potrebn\u00e9 in\u0161talova\u0165 z\u00e1vislosti lok\u00e1lne, spravova\u0165 lok\u00e1lnu in\u0161tal\u00e1ciu Dockeru alebo prij\u00edma\u0165 in\u00e9 opatrenia na zabezpe\u010denie aspo\u0148 akejsi rovnosti medzi v\u00fdvojov\u00fdm prostred\u00edm a produkciou. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Vzh\u013eadom na to, \u017ee tak\u00e1 rovnos\u0165 je aj tak nemo\u017en\u00e1,<\/a><\/noindex>, ani sa nebudeme pretvarova\u0165, \u017ee sa o \u0148u sna\u017e\u00edme.<\/p>\n<p><\/p>\n<p>Namiesto vytv\u00e1rania sklonovan\u00e9ho lok\u00e1lneho prostredia, prep\u00edna\u010de v Dark vytv\u00e1raj\u00fa nov\u00fa pieskovisku v produkcii, ktor\u00e1 nahr\u00e1dza v\u00fdvojov\u00e9 prostredie. V bud\u00facnosti m\u00e1me v pl\u00e1ne tie\u017e vytv\u00e1ra\u0165 pieskovisko pre in\u00e9 \u010dasti aplik\u00e1cie (napr\u00edklad okam\u017eit\u00e9 klony datab\u00e1z), hoci zatia\u013e sa to nezd\u00e1 a\u017e tak\u00e9 d\u00f4le\u017eit\u00e9.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Vety a nasadenia<\/h3>\n<p><\/p>\n<p>V s\u00fa\u010dasnosti existuje nieko\u013eko sp\u00f4sobov, ako zavies\u0165 nov\u00fd k\u00f3d do syst\u00e9mov: vetvy git, f\u00e1zy nasadenia a prep\u00edna\u010de funkci\u00ed. Rie\u0161ia jeden probl\u00e9m v r\u00f4znych \u010dastiach pracovn\u00e9ho toku: git \u2013 vo f\u00e1zach pred nasaden\u00edm, nasadenie \u2013 v momente prechodu zo star\u00e9ho k\u00f3du na nov\u00fd a prep\u00edna\u010de funkci\u00ed \u2013 pre kontrolovan\u00e9 vydanie nov\u00e9ho k\u00f3du.<\/p>\n<p><\/p>\n<p>Najefekt\u00edvnej\u0161\u00ed sp\u00f4sob s\u00fa prep\u00edna\u010de funkci\u00ed (z\u00e1rove\u0148 najjednoduch\u0161ie na pochopenie a pou\u017eitie). S nimi sa d\u00e1 \u00faplne vzda\u0165 ostatn\u00fdch dvoch met\u00f3d. Najm\u00e4 u\u017eito\u010dn\u00e9 je odstr\u00e1ni\u0165 nasadenie \u2013 ak aj tak pou\u017e\u00edvame prep\u00edna\u010de funkci\u00ed na aktiv\u00e1ciu k\u00f3du, krok prevodu serverov na nov\u00fd k\u00f3d len vytv\u00e1ra zbyto\u010dn\u00e9 rizik\u00e1.<\/p>\n<p><\/p>\n<p>Git je \u0165a\u017eko pou\u017eite\u013en\u00fd, najm\u00e4 pre za\u010diato\u010dn\u00edkov, a to ho v\u00fdrazne obmedzuje, ale m\u00e1 pohodln\u00e9 vetvy. Mnoh\u00e9 nev\u00fdhody gitu sme vyhladili. Dark umo\u017e\u0148uje \u00fapravy v re\u00e1lnom \u010dase a spolupr\u00e1cu v \u0161t\u00fdle Google Dokumentov, aby sa nemusel k\u00f3d posiela\u0165 a aby sa mohlo menej \u010dasto prebera\u0165 a zl\u00fa\u010di\u0165.<\/p>\n<p><\/p>\n<p>Prep\u00edna\u010de funkci\u00ed s\u00fa z\u00e1kladom bezpe\u010dn\u00e9ho nasadenia. Spolu s okam\u017eit\u00fdm nasaden\u00edm umo\u017e\u0148uj\u00fa r\u00fdchlo testova\u0165 koncepty v mal\u00fdch fragmentoch s n\u00edzkym rizikom, namiesto aplikovania jedinej ve\u013ekej zmeny, ktor\u00e1 m\u00f4\u017ee syst\u00e9m zr\u00fati\u0165.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Verziovanie<\/h3>\n<p><\/p>\n<p>Na zmenu funkci\u00ed a typov pou\u017e\u00edvame verziovanie. Ak chcete zmeni\u0165 funkciu, Dark vytvor\u00ed nov\u00fa verziu tejto funkcie. Potom m\u00f4\u017eete t\u00fato verziu zavola\u0165 pomocou prep\u00edna\u010da v HTTP spracovate\u013eovi alebo udalostiach. (Ak je to funkcia hlboko v grafe volan\u00ed, po\u010das procesu sa vytvor\u00ed nov\u00e1 verzia ka\u017edej funkcie. M\u00f4\u017ee sa to zda\u0165 prehnan\u00e9, ale funkcie sa neprekr\u00fdvaj\u00fa, ak ich nepou\u017e\u00edvate, tak\u017ee to ani nezbad\u00e1te.)<\/p>\n<p><\/p>\n<p>Z t\u00fdchto ist\u00fdch d\u00f4vodov verzionujeme aj typy. O na\u0161om syst\u00e9me typov sme podrobne hovorili <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">v predch\u00e1dzaj\u00facom pr\u00edspevku.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>V\u010faka verziovaniu funkci\u00ed a typov m\u00f4\u017eete vykon\u00e1va\u0165 zmeny v aplik\u00e1cii postupne. M\u00f4\u017eete overi\u0165, \u017ee ka\u017ed\u00fd jednotliv\u00fd spracovate\u013e funguje s novou verziou, nie je potrebn\u00e9 hne\u010f implementova\u0165 v\u0161etky zmeny v aplik\u00e1ci\u00e1ch (ale m\u00e1me n\u00e1stroje, ktor\u00e9 to umo\u017enia r\u00fdchlo, ak by ste chceli).<\/p>\n<p><\/p>\n<p>Je to ove\u013ea bezpe\u010dnej\u0161ie ako pln\u00e9 nasadenie v\u0161etk\u00e9ho naraz, ako sa to deje teraz.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Nov\u00e9 verzie bal\u00edkov a \u0161tandardn\u00e1 kni\u017enica<\/h3>\n<p><\/p>\n<p>Ke\u010f aktualizujete bal\u00edk v Dark, okam\u017eite nenahrad\u00edme pou\u017e\u00edvanie ka\u017edej funkcie alebo typu v celom k\u00f3de. To nie je bezpe\u010dn\u00e9. K\u00f3d i na\u010falej pou\u017e\u00edva t\u00fa ist\u00fa verziu, ktor\u00fa pou\u017e\u00edval, a vy aktualizujete pou\u017e\u00edvanie funkci\u00ed a typov na nov\u00fa verziu pre ka\u017ed\u00fd jednotliv\u00fd pr\u00edpad pomocou prep\u00edna\u010dov.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"Ako Dark roz\u0161iruje k\u00f3d za 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Sn\u00edmka obrazovky \u010dasti automatick\u00e9ho procesu v Dark, ukazuj\u00faca dve verzie funkcie Dict::get. Dict::get_v0 vracal typ Any (od ktor\u00e9ho sa vzd\u00e1vame), zatia\u013e \u010do Dict::get_v1 vracia typ Option.<\/em><\/p>\n<p><\/p>\n<p>\u010casto poskytujeme nov\u00fa funkciu \u0161tandardnej kni\u017enice a vylu\u010dujeme star\u00e9 verzie. Pou\u017e\u00edvatelia so star\u00fdmi verziami v k\u00f3de si ich zachovaj\u00fa, no nov\u00ed pou\u017e\u00edvatelia sa k nim nedostan\u00fa. Pl\u00e1nujeme poskytn\u00fa\u0165 n\u00e1stroje, aby sme previedli pou\u017e\u00edvate\u013eov zo star\u00fdch verzi\u00ed na nov\u00e9 v jednom kroku, op\u00e4\u0165 prostredn\u00edctvom prep\u00edna\u010dov funkci\u00ed.<\/p>\n<p><\/p>\n<p>Dark tie\u017e poskytuje jedine\u010dn\u00fa pr\u00edle\u017eitos\u0165: ke\u010f\u017ee vykon\u00e1vame v\u00e1\u0161 pracovn\u00fd k\u00f3d, m\u00f4\u017eeme sami testova\u0165 nov\u00e9 verzie, porovn\u00e1va\u0165 v\u00fdstupy pre nov\u00e9 a star\u00e9 po\u017eiadavky, aby sme v\u00e1m ozn\u00e1mili zmeny. Tak\u017ee aktualiz\u00e1cia bal\u00edkov, ktor\u00e1 sa \u010dasto vykon\u00e1va naslepo (alebo si vy\u017eaduje d\u00f4kladn\u00e9 testovanie kv\u00f4li bezpe\u010dnosti), predstavuje ove\u013ea men\u0161ie rizik\u00e1 a m\u00f4\u017ee prebieha\u0165 automaticky.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Nov\u00e9 verzie Dark<\/h3>\n<p><\/p>\n<p>Prechod z Python 2 na Python 3 sa natiahol na cel\u00e9 desa\u0165ro\u010die a na\u010falej zost\u00e1va probl\u00e9mom. Ke\u010f\u017ee vytv\u00e1rame Dark pre nepretr\u017eit\u00e9 dod\u00e1vky, je potrebn\u00e9 zoh\u013eadni\u0165 tieto zmeny jazyka.<\/p>\n<p><\/p>\n<p>Ke\u010f prinesieme mal\u00e9 zmeny do jazyka, vytv\u00e1rame nov\u00fa verziu Dark. Star\u00fd k\u00f3d zost\u00e1va v starej verzii Dark a nov\u00fd k\u00f3d sa pou\u017e\u00edva v novej verzii. Na prechod na nov\u00fa verziu Dark je mo\u017en\u00e9 pou\u017ei\u0165 prep\u00edna\u010de alebo verzie funkci\u00ed.<\/p>\n<p><\/p>\n<p>To je obzvl\u00e1\u0161\u0165 u\u017eito\u010dn\u00e9, ke\u010f\u017ee Dark vznikol len ned\u00e1vno. Mnoh\u00e9 zmeny v jazyku alebo kni\u017enici sa m\u00f4\u017eu uk\u00e1za\u0165 ako ne\u00faspe\u0161n\u00e9. Postupn\u00e9 verziovanie jazyka n\u00e1m umo\u017e\u0148uje vykon\u00e1va\u0165 drobn\u00e9 aktualiz\u00e1cie, teda m\u00f4\u017eeme sa nepon\u00e1h\u013ea\u0165 a odlo\u017ei\u0165 mnoh\u00e9 rozhodnutia o jazyku, a\u017e k\u00fdm nebudeme ma\u0165 viac pou\u017e\u00edvate\u013eov, a teda aj viac inform\u00e1ci\u00ed.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Migr\u00e1cie datab\u00e1z<\/h3>\n<p><\/p>\n<p>Pre bezpe\u010dn\u00fa migr\u00e1ciu datab\u00e1zy existuje <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">\u0161tandardn\u00fd vzorec<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>Prepisova\u0165 k\u00f3d na podporu nov\u00fdch a star\u00fdch form\u00e1tov<\/li>\n<li>Prekonvertova\u0165 v\u0161etky d\u00e1ta do nov\u00e9ho form\u00e1tu<\/li>\n<li>Odstr\u00e1ni\u0165 star\u00fd pr\u00edstup k \u00fadajom<\/li>\n<\/ul>\n<p><\/p>\n<p>Nakoniec migr\u00e1cia datab\u00e1zy trv\u00e1 dlh\u0161ie a vy\u017eaduje ve\u013ea zdrojov. A my zhroma\u017e\u010fujeme zastaran\u00e9 sch\u00e9my, preto\u017ee aj jednoduch\u00e9 \u00falohy, ako napr\u00edklad oprava n\u00e1zvu tabu\u013eky alebo st\u013apca, neost\u00e1vaj\u00fa za vynalo\u017een\u00e9 \u00fasilie.<\/p>\n<p><\/p>\n<p>Dark m\u00e1 efekt\u00edvnu platformu na migr\u00e1ciu datab\u00e1z, ktor\u00e1 (d\u00fafajme) nato\u013eko zjednodu\u0161\u00ed proces, \u017ee sa ho prestanete b\u00e1\u0165. V\u0161etky \u00falo\u017eisk\u00e1 d\u00e1t v Dark (\u00falo\u017eisk\u00e1 p\u00e1rov \u201ek\u013e\u00fa\u010d-hodnota\u201c alebo trval\u00e9 hash tabu\u013eky) maj\u00fa typ. Aby ste preniesli \u00falo\u017eisko d\u00e1t, jednoducho mu prirad\u00edte nov\u00fd typ a funkciu n\u00e1vratu a nakotvenia na prevod hodn\u00f4t medzi dvoma typmi.<\/p>\n<p><\/p>\n<p>Pr\u00edstup k d\u00e1tov\u00fdm \u00falo\u017ei\u0161\u0165\u00e1m v Dark sa uskuto\u010d\u0148uje prostredn\u00edctvom verzionovan\u00fdch n\u00e1zvov premenn\u00fdch. Napr\u00edklad, d\u00e1tov\u00e9 \u00falo\u017eisko Users sa p\u00f4vodne naz\u00fdva Users-v0. Ke\u010f sa vytvor\u00ed nov\u00e1 verzia s in\u00fdm typom, n\u00e1zov sa zmen\u00ed na Users-v1. Ak s\u00fa d\u00e1ta ulo\u017een\u00e9 cez Users-v0 a vy k nim pristupujete cez Users-v1, aplikuje sa funkcia n\u00e1vratu. Ak s\u00fa d\u00e1ta ulo\u017een\u00e9 cez Users-v1 a vy k nim pristupujete cez Users-v0, aplikuje sa funkcia sp\u00e4tn\u00e9ho n\u00e1vratu.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ui\/sl\/wd\/uislwdrfrvact0d1ts5icnk-4ka.png\"><img decoding=\"async\" alt=\"Ako Dark roz\u0161iruje k\u00f3d za 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Obrazovka migr\u00e1cie datab\u00e1zy s n\u00e1zvami pol\u00ed star\u00e9ho datab\u00e1zov\u00e9ho syst\u00e9mu, v\u00fdrazmi n\u00e1vratu a sp\u00e4tn\u00e9ho n\u00e1vratu a in\u0161trukciami na aktiv\u00e1ciu migr\u00e1cie.<\/em><\/p>\n<p><\/p>\n<p>Pou\u017eite prep\u00edna\u010de funkci\u00ed, aby ste nasmerovali volania z Users-v0 na verziu Users-v1. M\u00f4\u017eete to robi\u0165 po jednom HTTP spracovate\u013eovi naraz, aby ste zn\u00ed\u017eili rizik\u00e1, a prep\u00edna\u010de funguj\u00fa aj pre jednotliv\u00fdch pou\u017e\u00edvate\u013eov, aby ste mohli overi\u0165, \u017ee v\u0161etko funguje pod\u013ea o\u010dak\u00e1van\u00ed. Ke\u010f neostane \u017eiadny pou\u017e\u00edvate\u013e Users-v0, Dark v pozad\u00ed prevedie v\u0161etky zost\u00e1vaj\u00face d\u00e1ta zo star\u00e9ho form\u00e1tu na nov\u00fd. Ani si to nev\u0161imnete.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testovanie<\/h3>\n<p><\/p>\n<p>Dark je <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">funkcion\u00e1lny programovac\u00ed jazyk so statickou typiz\u00e1ciou<\/a><\/noindex> a nemenn\u00fdmi hodnotami, tak\u017ee testovacia plocha je podstatne men\u0161ia v porovnan\u00ed s objektovo orientovan\u00fdmi jazykmi s dynamickou typiz\u00e1ciou. Ale testova\u0165 sa aj tak mus\u00ed.<br \/>\nV Dark editor automaticky sp\u00fa\u0161\u0165a modul\u00e1rne testy v pozad\u00ed pre upraven\u00fd k\u00f3d a automaticky sp\u00fa\u0161\u0165a tieto testy pre v\u0161etky prep\u00edna\u010de funkci\u00ed. V bud\u00facnosti chceme pomocou statick\u00fdch typov automaticky vykon\u00e1va\u0165 fuzzing k\u00f3du, aby sme na\u0161li chyby.<\/p>\n<p><\/p>\n<p>Okrem toho, Dark vykon\u00e1va va\u0161u infra\u0161trukt\u00faru v produkcii, \u010do otv\u00e1ra nov\u00e9 mo\u017enosti. Automaticky uklad\u00e1me HTTP po\u017eiadavky v infra\u0161trukt\u00fare Dark (k\u00fdm uchov\u00e1vame v\u0161etky po\u017eiadavky, ale nesk\u00f4r chceme prejs\u0165 na vzorkovanie). Testujeme na nich nov\u00fd k\u00f3d a vykon\u00e1vame modul\u00e1rne testy, a ak budete chcie\u0165, m\u00f4\u017eete \u013eahko previes\u0165 zauj\u00edmav\u00e9 po\u017eiadavky na modul\u00e1rne testy.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">\u010co sme odstr\u00e1nili<\/h3>\n<p><\/p>\n<p>Ke\u010f\u017ee nem\u00e1me nasadenie, ale m\u00e1me prep\u00edna\u010de funkci\u00ed, pribli\u017ene 60 % rozvodov\u00e9ho kan\u00e1la zost\u00e1va bokom. Nepotrebujeme git vetvy alebo pull requesty, zostavovanie backendov\u00fdch zdrojov a kontajnerov, odosielanie zdrojov a kontajnerov do registrov alebo kroky nasadenia v Kubernetes.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/gc\/9e\/g-\/gc9eg-szouq0dtrxxr8jd6c6dyo.jpeg\"><img decoding=\"async\" alt=\"Ako Dark roz\u0161iruje k\u00f3d za 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Porovnanie \u0161tandardn\u00e9ho pipeline nepretr\u017eit\u00e9ho dod\u00e1vania (v\u013eavo) a Dark nepretr\u017eit\u00e9ho dod\u00e1vania (vpravo). V Dark dod\u00e1vanie pozost\u00e1va z 6 krokov a jedn\u00e9ho cyklu, zatia\u013e \u010do tradi\u010dn\u00e1 verzia obsahuje 35 krokov a 3 cykly.<\/em><\/p>\n<p><\/p>\n<p>V Dark je v nasaden\u00ed iba 6 krokov a 1 cyklus (kroky, ktor\u00e9 sa opakuj\u00fa nieko\u013ekokr\u00e1t), zatia\u013e \u010do modern\u00fd pipeline nepretr\u017eit\u00e9ho dod\u00e1vania pozost\u00e1va z 35 krokov a 3 cyklov. V Dark s\u00fa testy sp\u00fa\u0161\u0165an\u00e9 automaticky a vy to ani nevn\u00edmate; z\u00e1vislosti s\u00fa in\u0161talovan\u00e9 automaticky; v\u0161etko, \u010do s\u00favis\u00ed s git alebo Github, u\u017e nie je potrebn\u00e9; kompil\u00e1cia, testovanie a odosielanie Docker kontajnerov nie je potrebn\u00e9; nasadenie v Kubernetes u\u017e nie je potrebn\u00e9.<\/p>\n<p><\/p>\n<p>Aj zvy\u0161n\u00e9 kroky v Dark sa stali jednoduch\u0161\u00edmi. Ke\u010f\u017ee ovl\u00e1danie funk\u010dn\u00fdch prep\u00edna\u010dov je mo\u017en\u00e9 jedn\u00fdm krokom, nie je potrebn\u00e9 prech\u00e1dza\u0165 cel\u00fdm pipeline nasadenia druh\u00fdkr\u00e1t, aby ste odstr\u00e1nili star\u00fd k\u00f3d.<\/p>\n<p><\/p>\n<p>Sna\u017eili sme sa zjednodu\u0161i\u0165 dod\u00e1vanie k\u00f3du, zn\u00ed\u017een\u00edm \u010dasu a riz\u00edk spojen\u00fdch s nepretr\u017eit\u00fdm dod\u00e1van\u00edm. Navy\u0161e sme v\u00fdrazne zjednodu\u0161ili aktualiz\u00e1ciu bal\u00edkov, migr\u00e1cie datab\u00e1z, testovanie, spr\u00e1vu verzi\u00ed, in\u0161tal\u00e1ciu z\u00e1vislost\u00ed, rovnos\u0165 medzi prostred\u00edm pre v\u00fdvoj a produkciou a r\u00fdchle a bezpe\u010dn\u00e9 aktualiz\u00e1cie jazykov\u00fdch verzi\u00ed.<\/p>\n<p><\/p>\n<p>Na ot\u00e1zky k tomu odpoved\u00e1m na <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNews<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Aby ste sa dozvedeli viac o zariaden\u00ed Dark, pre\u010d\u00edtajte si <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">\u010dl\u00e1nok o Dark<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">prihl\u00e1ste sa k n\u00e1m na Twitteri<\/a><\/noindex> (alebo na <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">m\u0148a<\/a><\/noindex>) alebo <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">prihl\u00e1ste sa na beta-verziu a z\u00edskavajte upozornenia na nasleduj\u00face pr\u00edspevky<\/a><\/noindex>. Ak sa chyst\u00e1te na StrangeLoop v septembri, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">pr\u00ed\u010fte k n\u00e1m na spustenie<\/a><\/noindex>.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/462027\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0430\u0441 \u2014 \u043d\u0430\u0448\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0441\u0442\u043e\u044f\u043c \u0438 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u043c. \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u0430\u0436\u0435 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27506,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36721","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=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\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\/sk\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\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=\"2019-10-31T19:13:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:20+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\udd47Ako Dark nasadzuje k\u00f3d za 50 ms | ProHoster","description":"\u010c\u00edm r\u00fdchlej\u0161\u00ed je proces v\u00fdvoja, t\u00fdm r\u00fdchlej\u0161ie.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster","og:description":"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","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":"2019-10-31T19:13:20+00:00","article:modified_time":"2019-10-31T19:13:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36721","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":"2026-01-22 04:34:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:34:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}