{"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\/et\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"Kuidas Dark k\u00e4ivitab koodi 50 ms jooksul","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas Dark k\u00e4ivitab koodi 50 ms jooksul\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mida kiiremini arenduse protsess kulgeb, seda kiiremini areneb tehnoloogiaettev\u00f5te.<\/p>\n<p><\/p>\n<p>Kahjuks t\u00f6\u00f6tavad t\u00e4nap\u00e4eva rakendused meie vastu \u2013 meie s\u00fcsteemid peavad uuendama reaalajas, samas kedagi segamata ja katkestusi tekitamata. Selliste s\u00fcsteemide kasutuselev\u00f5tt muutub keeruliseks \u00fclesandeks ning n\u00f5uab isegi v\u00e4ikestes meeskondades keerukaid pideva tarnimise torustikke.<\/p>\n<p><\/p>\n<p>Need torustikud on tavaliselt kitsase kasutusalaga, aeglased ja ebausaldusv\u00e4\u00e4rsed. Arendajad peavad need esmalt k\u00e4sitsi looma ja seej\u00e4rel hallama, mist\u00f5ttu paljud ettev\u00f5tted palkavad selleks tervet DevOps'i meeskonda.<\/p>\n<p><\/p>\n<p>Nende torustike kiirus m\u00e4\u00e4rab arenduse kiirus. Parimatel meeskondadel v\u00f5tab kasutusev\u00f5tt aega 5\u201310 minutit, kuid tavaliselt kestab see palju kauem ja \u00fche kasutusev\u00f5tu jaoks kulub mitu tundi.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Darkis kulub sellele 50 ms. <em>Viisk\u00fcmmend. Millisekundit.<\/em>. Dark on <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">kompleksne lahendus koos programmeerimiskeele, redigeerija ja infrastruktuuriga.<\/a><\/noindex>, mis valmistati pidevaks tarnegra, ning k\u00f5ik aspektid Darkist, sealhulgas keel, on \u00fcles ehitatud turvalise ja kohese juurutamise silmas pidades.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Miks on pideva tarnimise torujuhtmed nii aeglased?<\/h3>\n<p><\/p>\n<p>Oletame, et meil on veebirakendus Pythonis ja me oleme juba loonud suurep\u00e4rase ja kaasaegse pideva tarnimise torujuhtme. Arendaja, kes on iga p\u00e4ev selle projektiga h\u00f5ivatud, peab \u00fcht v\u00e4ikest muudatust juurutama nii:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">Muudatuste tegemine<\/h3>\n<p><\/p>\n<ul>\n<li>Uue haru loomine git'is<\/li>\n<li>Muudatuste tegemine funktsioonide l\u00fclitamise abil<\/li>\n<li>Moodulitestimine muudatuste kontrollimiseks funktsioonide l\u00fclitamisega ja ilma<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">Pull-request<\/h3>\n<p><\/p>\n<ul>\n<li>Muudatuste committimine<\/li>\n<li>Muudatuste saatmine kaugrepository'sse GitHubis<\/li>\n<li>Pull-request<\/li>\n<li>CI kogumise automaatne k\u00e4ivitamine taustal<\/li>\n<li>Koodiarvustus<\/li>\n<li>Veel m\u00f5ned arvustused, kui vajalik<\/li>\n<li>Muudatuste sulandumine git'i masteriga.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI t\u00f6\u00f6tab masteril<\/h3>\n<p><\/p>\n<ul>\n<li>Frontend s\u00f5ltuvuste installimine npm-i kaudu<\/li>\n<li>HTML+CSS+JS ressursside kogumine ja optimeerimine<\/li>\n<li>Moodulite ja funktsionaalsete testide k\u00e4itamine frontendis<\/li>\n<li>Python s\u00f5ltuvuste installimine PyPist<\/li>\n<li>Moodulite ja funktsionaalsete testide k\u00e4itamine backend'is<\/li>\n<li>Integratsiooni testimine m\u00f5lemal l\u00f5pus<\/li>\n<li>Frontend'i ressursside saatmine CDN-i<\/li>\n<li>Python programmi konteineri koostamine<\/li>\n<li>Konteineri saatmine registrisse<\/li>\n<li>Kubernetes'i manifesti v\u00e4rskendamine<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Vanade koodide asendamine uutega<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes k\u00e4ivitab mitu uue konteineri instantsi<\/li>\n<li>Kubernetes ootab, et instantsid muutuksid t\u00f6\u00f6v\u00f5imeliseks<\/li>\n<li>Kubernetes lisab instantsid HTTP koormuse tasakaalustajasse<\/li>\n<li>Kubernetes ootab, kuni vanad instantsid l\u00f5petavad kasutamise<\/li>\n<li>Kubernetes peatab vanad instantsid<\/li>\n<li>Kubernetes kordab neid toiminguid, kuni uued instantsid asendavad k\u00f5ik vanad<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Uue funktsiooni l\u00fcliti sisse l\u00fclitamine<\/h3>\n<p><\/p>\n<ul>\n<li>Uus kood l\u00fclitub sisse ainult enda jaoks, et veenduda, et k\u00f5ik on korras<\/li>\n<li>Uus kood l\u00fclitub sisse 10% kasutajatest, j\u00e4lgitakse t\u00f6\u00f6- ja \u00e4ri-metreid<\/li>\n<li>Uus kood l\u00fclitub sisse 50% kasutajatest, j\u00e4lgitakse t\u00f6\u00f6- ja \u00e4ri-metreid<\/li>\n<li>Uus kood l\u00fclitub sisse 100% kasutajatest, j\u00e4lgitakse t\u00f6\u00f6- ja \u00e4ri-metreid<\/li>\n<li>L\u00f5puks kordate kogu protseduuri, et eemaldada vana kood ja l\u00fcliti<\/li>\n<\/ul>\n<p><\/p>\n<p>Protsess s\u00f5ltub t\u00f6\u00f6riistadest, keelest ja teenusele suunatud arhitektuuride kasutamisest, kuid \u00fcldjoontes n\u00e4eb see v\u00e4lja nii. Ma ei maininud andmebaaside migratsiooniga seotud juurutamisi, sest see n\u00f5uab p\u00f5hjalikku planeerimist, kuid allpool r\u00e4\u00e4gin, kuidas sellega Dark tegeleb.<\/p>\n<p><\/p>\n<p>Siin on palju komponente, ja paljud neist v\u00f5ivad kergesti aeglustuda, rike toimuda, p\u00f5hjustada ajutisi konflikte v\u00f5i s\u00fcsteemi kokku kukkuda.<\/p>\n<p><\/p>\n<p>Kuna need torujuhtmed on peaaegu alati loodud konkreetse juhtumi jaoks, on neile raske toetuda. Paljudel v\u00f5ivad olla p\u00e4evad, mil koodi ei \u00f5nnestu rakendada, sest Dockerfile'is on probleeme, \u00fches k\u00fcmnetest teenustest on juhtunud rike v\u00f5i vajalik spetsialist on puhkusel.<\/p>\n<p><\/p>\n<p>Vaatamata sellele, et paljud neist sammudest ei tee \u00fcldse midagi kasulikku. Need olid vajalikud varem, kui juurutasime koodi otse kasutajatele, kuid n\u00fc\u00fcd on meil uute koodide jaoks l\u00fclitid ja need protsessid on jagunenud. Tulemuseks on see, et samm, mil kood juurutatakse (vana asendatakse uuega), on n\u00fc\u00fcd lihtsalt liigne risk.<\/p>\n<p><\/p>\n<p>Muidugi, see on v\u00e4ga l\u00e4bim\u00f5eldud t\u00f6\u00f6voog. Meeskond, kes selle l\u00f5i, ei s\u00e4\u00e4stnud aega ja raha kiiruselt juurutamiseks. Tavalised juurutust\u00f6\u00f6vood on tavaliselt palju aeglasemad ja usaldusv\u00e4\u00e4rsemad.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Pideva tarnimise rakendamine Darkis<\/h3>\n<p><\/p>\n<p>Pidev tarnimine on Darkile nii oluline, et sihtisime algusest peale alla sekundi aega. Vaatasime k\u00f5iki t\u00f6\u00f6voo samme, et eemaldada k\u00f5ik \u00fcleliigne, ja viimistlesime \u00fclej\u00e4\u00e4nud. Nii me samme eemaldame.<\/p>\n<p><\/p>\n<blockquote><p>Jessie Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) leiutas uue s\u00f5na deployless (juurutamata) Future of Software Development konverentsil Reykjavikis.<\/p><\/blockquote>\n<p>Otsustasime kohe, et Dark p\u00f5hineb m\u00f5iste \u201edeployless\u201d (ait\u00e4h <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex> uue s\u00f5na eest). Deployless t\u00e4hendab, et iga kood juurutatakse koheselt ja on tootmises kasutamiseks valmis. Loomulikult ei j\u00e4ta me t\u00e4helepanuta defektset v\u00f5i mittet\u00e4ielikku koodi (turvaperioodid, millest kirjutan allpool).<\/p>\n<p><\/p>\n<p>Darki demonstreerimise ajal k\u00fcsiti meilt tihti, kuidas me suudame nii kiiresti seadistada. See on veider k\u00fcsimus. Inimesed arvavad ilmselt, et oleme v\u00e4lja m\u00f5elnud mingi supertehnoloogia, mis v\u00f5rdleb koodi, kompileerib selle, pakib konteinerisse, k\u00e4ivitab virtuaalmasina, t\u00f5ukab konteineri k\u00fclmalt k\u00e4ima ja seda k\u00f5ike 50 ms jooksul. See on t\u00f5en\u00e4oliselt v\u00f5imatu. Kuid oleme loonud spetsiaalse seadistamismootor, millele pole seda k\u00f5ike vaja.<\/p>\n<p><\/p>\n<p>Dark k\u00e4ivitab t\u00f5lgendajad pilves. Oletame, et kirjutate koodi funktsioonis v\u00f5i HTTP v\u00f5i s\u00fcndmuste t\u00f6\u00f6tlejas. Saatma diffi abstraktse s\u00fcntakspuu (koodi teostus, mida meie redaktor ja serverid sisemiselt kasutavad) meie serveritesse ning seej\u00e4rel k\u00e4ivitame selle koodi, kui saabuvad p\u00e4ringud. Seet\u00f5ttu n\u00e4eb seadistamine v\u00e4lja nagu tagasihoidlik kirje andmebaasis \u2014 hetkeline ja elementaarne. Seadistamine toimub nii kiiresti, kuna see sisaldab k\u00f5ige v\u00e4hem.<\/p>\n<p><\/p>\n<p>Tulevikus plaanime Darkist luua infrastruktuuri koostaja, mis suudab luua ja k\u00e4ivitada ideaalse infrastruktuuri rakenduste k\u00f5rge j\u00f5udluse ja t\u00f6\u00f6kindluse tagamiseks. Kohene juurutamine j\u00e4\u00e4b kindlasti alles.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Turvaline juurutamine<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Struktuurne redaktor<\/h3>\n<p><\/p>\n<p>Darki kood kirjutatakse Darki redaktoris. Struktuurne redaktor ei luba s\u00fcntaksivigu. Tegelikult ei ole Darkis isegi anal\u00fcsaatorit. Kui te tekstis sisestate, t\u00f6\u00f6tame me otse abstraktse s\u00fcntaksipuuga (AST), n\u00e4iteks <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> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Iga l\u00f5petamata koodi puhul Darkis on lubatud semantika t\u00e4itmiseks, umbes nagu <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">typed holes Hazelis<\/a><\/noindex>. N\u00e4iteks, kui muudate funktsiooni kutsumist, hoiame vana funktsiooni, kuni uus on sobiv.<\/p>\n<p><\/p>\n<p>Igal programmi Darkis on oma t\u00e4hendus, seega ei segada l\u00f5petamata kood ka l\u00f5petatud t\u00f6\u00f6d.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Redigeerimisre\u017eiimid<\/h3>\n<p><\/p>\n<p>Te kirjutate koodi Darkis kahes olukorras. Esimene: kirjutate uut koodi ja olete ainus kasutaja. N\u00e4iteks on see REPL-is, ja teised kasutajad ei p\u00e4\u00e4se sellele kunagi ligi, v\u00f5i see on uus HTTP marsruut, millele te ei viita. Siin saab t\u00f6\u00f6tada ilma eriliste ettevaatusabin\u00f5udeta, ja praegu te t\u00f6\u00f6tate t\u00e4pselt nii arenduskeskkonnas.<\/p>\n<p><\/p>\n<p>Teine olukord: kood on juba kasutuses. Kui koodi kaudu l\u00e4bib liiklus (funktsioonid, s\u00fcndmuste t\u00f6\u00f6tlejad, andmebaasid jne), tuleb olla ettevaatlik. Selleks blokeerime kogu kasutuses oleva koodi ja n\u00f5uame struktureeritud t\u00f6\u00f6riistade kasutamist selle redigeerimiseks. Struktureeritud t\u00f6\u00f6riistadest r\u00e4\u00e4gin allpool: funktsioonide l\u00fclitid HTTP t\u00f6\u00f6tlejatele ja s\u00fcndmustele, v\u00f5imas andmebaaside migratsiooniplatvorm ning uus versioonihalduse meetod funktsioonide ja t\u00fc\u00fcpide jaoks.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Funktsioonide l\u00fclitid<\/h3>\n<p><\/p>\n<p>\u00dcks viis <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">liigse keerukuse v\u00e4hendamiseks<\/a><\/noindex> Darkis on v\u00f5imalik lahendada mitmeid probleeme \u00fche lahendusega. Funktsioonide l\u00fclitid t\u00e4idavad palju erinevaid \u00fclesandeid: lokaalsete arenduskeskkondade asendamine, git-haarakohad, koodi juurutamine ja muidugi traditsiooniline aeglane ja kontrollitud uue koodi v\u00e4ljaandmine.<\/p>\n<p><\/p>\n<p>Funktsionaalsuse l\u00fcliti loomine ja juurutamine toimub meie redigeerijas \u00fche toiminguna. See loob uue koodi jaoks t\u00fchja ruumi ja pakub juurdep\u00e4\u00e4sueeliseid vanale ja uuele koodile, samuti nuppe ja k\u00e4ske uuele koodile j\u00e4rkj\u00e4rguliseks \u00fcleminekuks v\u00f5i selle v\u00e4lja j\u00e4tmiseks.<\/p>\n<p><\/p>\n<p>Funktsioonide l\u00fclitid on sisse ehitatud Darki keelde ja isegi l\u00f5petamata l\u00fclitid t\u00e4idavad oma \u00fclesannet \u2014 kui l\u00fcliti tingimus ei ole t\u00e4idetud, t\u00e4idetakse vana blokeeritud kood.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Arenduskeskkond<\/h3>\n<p><\/p>\n<p>Funktsioonide l\u00fclitid asendavad kohalikku arenduskeskkonda. T\u00e4na on meeskondadel keeruline j\u00e4lgida, et k\u00f5ik kasutaksid samu t\u00f6\u00f6riistade ja raamatukogude versioone (koodivormindustooted, linterid, paketihaldurid, kompilaatorid, eelt\u00f6\u00f6tlejad, testimistooted jne). Darki puhul pole vaja s\u00f5ltuvusi kohalikult installida, hallata kohalikku Docker'i installatsiooni v\u00f5i v\u00f5tta muid meetmeid, et tagada v\u00e4hemalt mingi sarnasus arenduskeskkonna ja tootmise vahel. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Arvestades, et selline sarnasus on ikkagi v\u00f5imatu,<\/a><\/noindex>, me isegi ei teeselda, et p\u00fc\u00fcame selle poole.<\/p>\n<p><\/p>\n<p>Selle asemel, et luua kloonitud kohalikku keskkonda, loovad Darki l\u00fclitid uue liivakasti tootmises, mis asendab arenduskeskkonna. Tulevikus plaanime luua liivakast ka teiste rakenduse osade jaoks (n\u00e4iteksandmebaasi hetkekloonid), kuigi praegu ei tundu see nii oluline.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Harud ja v\u00e4ljat\u00f5mbamised<\/h3>\n<p><\/p>\n<p>Praegu on mitu v\u00f5imalust uut koodi s\u00fcsteemidesse sisestada: git harud, juurutamisetapid ja funktsioonil\u00fclitid. Need lahendavad sama probleemi erinevates t\u00f6\u00f6protsessi osades: git - enne juurutamist etappides, juurutamine - vana koodist uue koodi \u00fclemineku hetkel ning funktsioonil\u00fclitid - uue koodi kontrollitud v\u00e4ljastamiseks.<\/p>\n<p><\/p>\n<p>T\u00f5husaim viis on funktsioonil\u00fclitid (samuti k\u00f5ige lihtsam m\u00f5ista ja kasutada). Nende abil saab t\u00e4ielikult loobuda teistest kahest meetodist. Eelk\u00f5ige on kasulik juurutamist eemaldada - kui me ikkagi kasutame funktsioonil\u00fcliteid koodi lubamiseks, siis serverite \u00fclemineku etapp uuele koodile tekitab ainult t\u00e4iendavaid riske.<\/p>\n<p><\/p>\n<p>Giti kasutamine on keeruline, eriti algajatele, ja see piirab oma v\u00f5imalusi, kuid tal on mugavad harud. Oleme tasandanud paljusid giti puudusi. Dark redigeeritakse reaalajas ja v\u00f5imaldab koost\u00f6\u00f6d Google Docs stiilis, et ei peaks koodi saatma ja saaks harvemini rebasi ja \u00fchte liita.<\/p>\n<p><\/p>\n<p>Funktsioonide vahetused on turvalise juurutamise aluseks. Koos kiirete juurutustega v\u00f5imaldavad need kiiresti katsetada kontseptsioone v\u00e4ikeste madala riskiga fragmentide kaudu, selle asemel, et rakendada \u00fchte suurt muudatust, mis v\u00f5ib s\u00fcsteemi kukutada.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versioonimine<\/h3>\n<p><\/p>\n<p>Funktsioonide ja t\u00fc\u00fcpide muutmiseks kasutame versioonimist. Kui soovite funktsiooni muuta, loob Dark selle funktsiooni jaoks uue versiooni. Seej\u00e4rel saate seda versiooni kutsuda v\u00e4lja vahetaja kaudu HTTP v\u00f5i s\u00fcndmuste k\u00e4sitlejasse. (Kui see funktsioon on s\u00fcgaval kutsumisgraafikus, luuakse iga korda uus versioon igast funktsioonist. See v\u00f5ib tunduda liialt, kuid funktsioonid ei sega \u00fcksteist, kui te neid ei kasuta, seega ei pruugi te seda isegi m\u00e4rgata.)<\/p>\n<p><\/p>\n<p>Samadel p\u00f5hjustel versioneerime ka t\u00fc\u00fcpe. Omandasime meie t\u00fc\u00fcbist s\u00fcsteemi detailse \u00fclevaate. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">eelmises postituses<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Funktsioonide ja t\u00fc\u00fcpide versioonimise abil saate oma rakendusse muudatusi j\u00e4rk-j\u00e4rgult sisse viia. Iga eraldi t\u00f6\u00f6tleva funktsiooni toimivust saab kontrollida uue versiooniga, ilma et peaksite k\u00f5ik muudatused rakendusse samaaegselt tooma (kuid meil on t\u00f6\u00f6riistad, et seda kiiresti teha, kui soovite).<\/p>\n<p><\/p>\n<p>See on palju turvalisem kui kogu korraga t\u00e4ielik juurutamine, nagu see praegu on.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Uued pakettide versioonid ja standardne teek<\/h3>\n<p><\/p>\n<p>Kui v\u00e4rskendate paketti Darkis, ei asenda me kohe iga funktsiooni v\u00f5i t\u00fc\u00fcbi kasutamist kogu koodibaasis. See ei ole ohutu. Kood kasutab endiselt sama versiooni, mida ta kasutas, samas kui te v\u00e4rskendate funktsioonide ja t\u00fc\u00fcpide kasutamist uue versiooniga iga eraldi juhtumi jaoks l\u00fclitite abil.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"Kuidas Dark k\u00e4ivitab koodi 50 ms jooksul\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Kuvat\u00f5mmis Darki automaatprotsessist, mis n\u00e4itab kahte versiooni funktsioonist Dict::get. Dict::get_v0 tagastas t\u00fc\u00fcbi Any (millest me loobume), samas kui Dict::get_v1 tagastab t\u00fc\u00fcbi Option.<\/em><\/p>\n<p><\/p>\n<p>Meie teenus pakub sageli uusi funktsioone, samas k\u00f5rvaldades vanad versioonid. Kasutajad, kellel on vanad versioonid, saavad neid oma koodis j\u00e4tkuvalt kasutada, kuid uued kasutajad ei p\u00e4\u00e4se neile ligi. Kavatseme pakkuda t\u00f6\u00f6riistu, et viia kasutajad vanadelt versioonidelt uutele \u00fche sammuga, samuti funktsiooni l\u00fclitite abil.<\/p>\n<p><\/p>\n<p>Dark pakub ka ainulaadset v\u00f5imalust: kuna me jooksutame teie t\u00f6\u00f6koodi, saame ise uusi versioone testida, v\u00f5rreldes uusite ja vanade p\u00e4ringute v\u00e4ljundeid, et teavitada teid muudatustest. Seet\u00f5ttu on pakettide uuendamine, mis sageli toimub pimesi (v\u00f5i n\u00f5uab p\u00f5hjalikku testimist turvalisuse huvides), palju v\u00e4hem riskantne ning v\u00f5ib toimuda automaatselt.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Uued versioonid Dark<\/h3>\n<p><\/p>\n<p>\u00dcleminek Python 2-lt Python 3-le venis k\u00fcmnendiks ja on endiselt probleem. Kuna arendame Dark'i pideva tarnimise jaoks, peame arvesse v\u00f5tma neid keele muutusi.<\/p>\n<p><\/p>\n<p>Kui teeme keeles v\u00e4ikseid muudatusi, loome uue versiooni Dark. Vana kood j\u00e4\u00e4b vana versiooni Darki alla ja uus kood kasutatakse uues versioonis. Uue versiooni Darki kasutamiseks saab kasutada l\u00fclitusi v\u00f5i funktsiooniversioone.<\/p>\n<p><\/p>\n<p>See on eriti kasulik, arvestades, et Dark on hiljuti ilmunud. Paljud keele v\u00f5i teegi muudatused v\u00f5ivad olla eba\u00f5nnestunud. Keeles j\u00e4rkj\u00e4rguline versioonimine v\u00f5imaldab meil teha v\u00e4ikeseid uuendusi, st saame mitte kiirustada ja edasi l\u00fckata paljusid keelealaseid otsuseid, kuni meil on rohkem kasutajaid ja seega rohkem teavet.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Andmebaasi migratsioonid<\/h3>\n<p><\/p>\n<p>Ohutuks andmebaasi migratsiooniks on olemas <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">standaardne valem<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>Koodi \u00fcmber kirjutamine uute ja vanade formaatide toetamiseks<\/li>\n<li>K\u00f5ik andmed uude formaati \u00fcmber muuta<\/li>\n<li>Eemaldada vana andmete ligip\u00e4\u00e4s<\/li>\n<\/ul>\n<p><\/p>\n<p>Tulemuseks on andmebaasi migratsioon, mis venib ja n\u00f5uab palju ressursse. Meil tekivad vananenud skeemid, sest isegi lihtsad \u00fclesanded, nagu tabeli v\u00f5i veeru nime parandamine, ei \u00f5igusta kulutatud pingutusi.<\/p>\n<p><\/p>\n<p>Darkis on t\u00f5hus andmebaaside migratsiooniplatvorm, mis (me loodame) muudab protsessi nii lihtsaks, et te ei karda seda enam. K\u00f5ik Darki andmehoidlad (\u201ev\u00f5ti-v\u00e4\u00e4rtus\u201d hoidlatega v\u00f5i p\u00fcsihash-tabelid) on t\u00fc\u00fcbi all. Andmehoidla migreerimiseks lihtsalt m\u00e4\u00e4rate sellele uue t\u00fc\u00fcbi ja taastamis- ja taask\u00e4ivitamisfunktsiooni, et muuta v\u00e4\u00e4rtusi kahe t\u00fc\u00fcbi vahel.<\/p>\n<p><\/p>\n<p>Darkis p\u00e4\u00e4seb andmehoidlatesse versioonitud muutujanimede kaudu. N\u00e4iteks nimetatakse Users andmehoidlat algselt Users-v0. Kui luuakse uus versioon teistsuguse t\u00fc\u00fcbiga, muutub nimi Users-v1. Kui andmed on salvestatud Users-v0 kaudu ja p\u00e4\u00e4sete neile ligi Users-v1 kaudu, rakendatakse taask\u00e4ivitamisfunktsiooni. Kui andmed on salvestatud Users-v1 kaudu ja p\u00e4\u00e4sete neile ligi Users-v0 kaudu, rakendatakse taastamisfunktsiooni.<\/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=\"Kuidas Dark k\u00e4ivitab koodi 50 ms jooksul\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Andmebaasi migratsiooni ekraan koos vana andmebaasi v\u00e4ljanimedega, taask\u00e4ivitamis- ja taastamisavaldistega ning juhistega migratsiooni v\u00f5imaldamiseks.<\/em><\/p>\n<p><\/p>\n<p>Kasutage funktsioonide l\u00fcliteid, et suunata kutseid Users-v0 versioonile Users-v1. Seda saab teha \u00fche HTTP-osta k\u00e4sitleja kaupa, et v\u00e4hendada riske, ja l\u00fclitid t\u00f6\u00f6tavad individuaalsetele kasutajatele, et saaksite kontrollida, kas k\u00f5ik t\u00f6\u00f6tab nagu oodatud. Kui Users-v0 kasutajad on kadunud, teisendab Dark k\u00f5ik \u00fclej\u00e4\u00e4nud andmed taustal vanast formaadist uude. Te ei pruugi seda isegi m\u00e4rgata.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testimine<\/h3>\n<p><\/p>\n<p>Dark on <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">funktsionaalne programmeerimiskeel staatilise t\u00fcpiseerimisega<\/a><\/noindex> ja muutumatute v\u00e4\u00e4rtustega, seet\u00f5ttu on selle testimise pind v\u00e4henenud v\u00f5rreldes objektorienteeritud keeltesse d\u00fcnaamilise t\u00fcpiseerimisega. Kuid testimine on ikkagi vajalik.<br \/>\nDarkis k\u00e4ivitab redaktor automaatselt moodultestid taustal redigeeritava koodi jaoks ja koos standardse testimise k\u00f5igi funktsioonide l\u00fclitite jaoks. Tulevikus tahame staatiliste t\u00fc\u00fcpide abil automaatselt teostada koodi fuzzingut, et avastada vigu.<\/p>\n<p><\/p>\n<p>Lisaks sellele haldab Dark teie infrastruktuuri tootmises, avades uusi v\u00f5imalusi. Me salvestame automaatselt HTTP-p\u00e4ringud Dark infrastruktuuris (hetkel salvestame k\u00f5ik p\u00e4ringud, kuid plaanime hiljem minna valikule). Testime nende p\u00f5hjal uut koodi ja teeme moodulitestid, ning soovi korral saate h\u00f5lpsasti huvitavad p\u00e4ringud mootuli testideks muuta.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">Mille me oleme l\u00f5petanud<\/h3>\n<p><\/p>\n<p>Kuna meil ei ole juurutamist, kuid on funktsioonide l\u00fclitid, j\u00e4\u00e4b umbes 60% juurutusts\u00fcklist k\u00f5rvale. Me ei vaja git harusid v\u00f5i pull-requeste, backend-ressursside ja konteinerite koostamist, ressursside ja konteinerite saatmist registritesse ega juurutamise samme Kuberneteses.<\/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=\"Kuidas Dark k\u00e4ivitab koodi 50 ms jooksul\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Tavap\u00e4rase j\u00e4tkuva tarnetoru (vasakul) ja Darki pideva tarnimise (paremal) v\u00f5rdlus. Darkis koosneb tarnimine 6 sammust ja \u00fchest ts\u00fcklist, samas kui traditsiooniline versioon sisaldab 35 sammu ja 3 ts\u00fcklit.<\/em><\/p>\n<p><\/p>\n<p>Darkis on juurutamiseks vaid 6 sammu ja 1 ts\u00fckkel (sammud, mis korduvad mitu korda), samas kui kaasaegne pideva tarnimise torujuhe koosneb 35 sammust ja 3 ts\u00fcklist. Darkis k\u00e4ivitatakse testid automaatselt, ja te isegi ei m\u00e4rka seda; s\u00f5ltuvused installitakse automaatselt; k\u00f5ik, mis on seotud gitiga v\u00f5i Githubiga, pole enam vajalik; Docker konteinerite kogumine, testimine ja saatmine pole vajalik; juurutamine Kuberneteses pole enam vajalik.<\/p>\n<p><\/p>\n<p>I isegi j\u00e4\u00e4nud sammud Darkis on muutunud lihtsamaks. Kuna funktsioonide l\u00fclititega saab hallata \u00fche tegevusega, ei ole enam vajalik terve juurutamistorujuhe l\u00e4bi k\u00e4ia, et vana kood eemaldada.<\/p>\n<p><\/p>\n<p>Oleme kodeerimise tarnimise lihtsustamiseks kasutusele v\u00f5tnud meetodeid, mis v\u00e4hendavad pideva tarnimise aega ja riske. Samuti oleme oluliselt lihtsustanud pakettide uuendamist, andmebaasi migreerimist, testimist, versioonihaldust, s\u00f5ltuvuste installimist, arendus- ja tootmis keskkonna v\u00f5rdsustamist ning kiireid ja turvalisi keele versiooniuuendusi.<\/p>\n<p><\/p>\n<p>Vastan neile k\u00fcsimustele <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNewsis<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Kuna soovite rohkem teada Darki seadistuse kohta, lugege <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">artiklit Darkist<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">ja j\u00e4lgige meid Twitteris<\/a><\/noindex> (v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">mind<\/a><\/noindex>) v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">registreeru beetaversioon ja saa teateid j\u00e4rgmistest postitustest<\/a><\/noindex>. Kui suundud Septembris StrangeLoop'i, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">tule meie avamisele<\/a><\/noindex>.<\/p>\n<p>Allikas: <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 4.9.10 - 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 \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.\" \/>\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\/et\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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 \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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Kuidas Dark juurutab koodi 50 ms jooksul | ProHoster","description":"Mida kiiremini toimub arendamine, seda kiiremini areneb tehnoloogiaettev\u00f5te. Kahjuks t\u00f6\u00f6tavad t\u00e4nap\u00e4evased rakendused meile vastu \u2014 meie s\u00fcsteemid peavad t\u00f6\u00f6tama reaalajas, samal ajal mitte kedagi h\u00e4irima ega p\u00f5hjustama mitte mingit seisakut v\u00f5i katkestust. T\u00fckkide juurutamine sellistes s\u00fcsteemides on keeruline \u00fclesanne ja n\u00f5uab keerulisi pideva tarnimise torujuhtmeid isegi v\u00e4ikestes meeskondades.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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 \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.","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}