{"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 toimub arendamine, seda kiiremini areneb tehnoloogiaettev\u00f5te.<\/p>\n<p><\/p>\n<p>Kahjuks t\u00f6\u00f6tavad t\u00e4nap\u00e4eva rakendused meie vastu - meie s\u00fcsteemid peavad olema reaalajas uuendatud, segamata samas kedagi ning p\u00f5hjustamata viivitusi ja katkestusi. Sellistes s\u00fcsteemides on juurutamine keeruline \u00fclesanne ja n\u00f5uab isegi v\u00e4ikestes meeskondades keerulisi pideva tarnimise vooge.<\/p>\n<p><\/p>\n<p>Need vooged on tavaliselt kitsaste rakendustega, t\u00f6\u00f6tavad aeglaselt ja ei ole usaldusv\u00e4\u00e4rsed. Arendajad peavad need esmalt k\u00e4sitsi looma ja seej\u00e4rel haldama ning ettev\u00f5tted palgavad sageli selleks eraldi DevOps meeskondi.<\/p>\n<p><\/p>\n<p>Need vood m\u00f5jutavad arendamise kiirus. Parimate meeskondade puhul kestab juurutamine 5\u201310 minutit, kuid tavaliselt v\u00f5tab see aega palju kauem ja \u00fche juurutuse 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 - <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">see on integreeritud lahendus programmeerimiskeele, redigeerija ja infrastruktuuriga<\/a><\/noindex>, mis on loodud spetsiaalselt pidevaks tarnimiseks, ja k\u00f5ik Darki aspektid, sealhulgas keele loomine, on \u00fcles ehitatud ohutuks koheseks juurutamiseks.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Miks on pideva tarnimise vood nii aeglased?<\/h3>\n<p><\/p>\n<p>Oletame, et meil on olemas Python veebirakendus ja me oleme juba loonud suurep\u00e4rase ja kaasaegse pideva tarnimise voo. Arendaja jaoks, kes igap\u00e4evaselt selle projektiga tegeleb, n\u00e4eb \u00fche v\u00e4ikese muudatuse juurutamine v\u00e4lja enam-v\u00e4hem selline:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">Muutuste tegemine<\/h3>\n<p><\/p>\n<ul>\n<li>Uue haru loomine git'is<\/li>\n<li>Muutuste tegemine funktsioonide vahetamise korral<\/li>\n<li>Moodulitestimine muudatuste kontrollimiseks funktsioonide vahetamisega ja ilma selleta<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">Pull-request<\/h3>\n<p><\/p>\n<ul>\n<li>Muutuste commitimine<\/li>\n<li>Muutuste saatmine kaugrepositoriosse github'is<\/li>\n<li>Pull-request<\/li>\n<li>CI kokkupanekut teostatakse automaatselt taustal<\/li>\n<li>Koodi \u00fclevaatus<\/li>\n<li>Veel m\u00f5ned \u00fclevaatused, kui on vaja<\/li>\n<li>Muudatuste sulandumine git masteriga.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI teostatakse masteris<\/h3>\n<p><\/p>\n<ul>\n<li>Frontend s\u00f5ltuvuste installimine l\u00e4bi npm<\/li>\n<li>HTML + CSS + JS ressursside kokkupanek ja optimeerimine<\/li>\n<li>Frontendis moodul- ja funktsionaalsete testide l\u00e4biviimine<\/li>\n<li>Python s\u00f5ltuvuste installimine PyPI-st<\/li>\n<li>Backendis moodul- ja funktsionaalsete testide l\u00e4biviimine<\/li>\n<li>Integreerimistestide l\u00e4biviimine m\u00f5lemas otsas<\/li>\n<li>Frontend ressursside saatmine CDN-i<\/li>\n<li>Python programmi konteineri kokkupanek<\/li>\n<li>Konteineri registreerimine<\/li>\n<li>Kubernetes'i manifesti v\u00e4rskendamine<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Vana koodi asendamine uuega<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes k\u00e4ivitab mitu uue konteineri eksemplari<\/li>\n<li>Kubernetes ootab, et eksemplarid saaksid t\u00f6\u00f6korda<\/li>\n<li>Kubernetes lisab eksemplarid HTTP koormuse tasakaalustajasse<\/li>\n<li>Kubernetes ootab, kuni vanad eksemplarid l\u00f5petavad kasutamise<\/li>\n<li>Kubernetes peatab vanad eksemplarid<\/li>\n<li>Kubernetes kordab neid toiminguid, kuni uued eksemplarid asendavad k\u00f5ik vanad<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Uue funktsiooni l\u00fcliti aktiveerimine<\/h3>\n<p><\/p>\n<ul>\n<li>Uus kood aktiveeritakse vaid endale, et veenduda, et k\u00f5ik on korras<\/li>\n<li>Uus kood aktiveeritakse 10% kasutajatest, j\u00e4lgitakse operatiiv- ja \u00e4rim\u00f5\u00f5dikuid<\/li>\n<li>Uus kood aktiveeritakse 50% kasutajatest, j\u00e4lgitakse operatiiv- ja \u00e4rim\u00f5\u00f5dikuid<\/li>\n<li>Uus kood aktiveeritakse 100% kasutajatest, j\u00e4lgitakse operatiiv- ja \u00e4rim\u00f5\u00f5dikuid<\/li>\n<li>L\u00f5puks t\u00f5state 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 teenustele orienteeritud arhitektuuride kasutamisest, kuid \u00fcldiselt n\u00e4eb see v\u00e4lja nii. Ma ei maininud andmebaasi migreerimisega seotud juurutusi, kuna nende jaoks on vajalik hoolikas planeerimine, kuid allpool r\u00e4\u00e4gin, kuidas Dark sellega tegeleb.<\/p>\n<p><\/p>\n<p>Siin on palju komponente ning paljud neist v\u00f5ivad kergesti aeglustuda, kokku kukkuda, p\u00f5hjustada ajutist konkurentsi v\u00f5i crashida t\u00f6\u00f6s\u00fcsteemi.<\/p>\n<p><\/p>\n<p>Ja kuna need torujuhtmed on peaaegu alati loodud erijuhtumiks, on neile raske toetuda. Paljudel on p\u00e4evi, mil koodi ei saa juurutada, kuna Dockerfile\u2019is on probleeme, m\u00f5nes k\u00fcmnes teenuses on t\u00f5rge v\u00f5i vajalik spetsialist on puhkusel.<\/p>\n<p><\/p>\n<p>Halvem on see, et paljud neist sammudest ei tee \u00fcle\u00fcldse midagi kasulikku. Need olid vajalikud varem, kui juurutasime koodi otse kasutajatele, kuid n\u00fc\u00fcd on meil uue koodi jaoks l\u00fclitid ja need protsessid on eraldi. L\u00f5pptulemusena on samm, kus kood juurutatakse (vana asendatakse uuega), n\u00fc\u00fcd lihtsalt \u00fclem\u00e4\u00e4rane risk.<\/p>\n<p><\/p>\n<p>Muidugi on see v\u00e4ga l\u00e4bi m\u00f5eldud torujuhtme lahendus. Meeskond, kes selle l\u00f5i, ei kahetsenud aega ja raha kiiresti juurutamiseks. \u00dcldiselt on juurutustorud palju aeglasemad ja ebausaldusv\u00e4\u00e4rsemad.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">J\u00e4tkuva tarnimise rakendamine Darkis<\/h3>\n<p><\/p>\n<p>Constant supply is so important for Dark that we aimed for under one second from the very beginning. We went through every step of the pipeline to eliminate anything unnecessary and refined the rest. Here\u2019s how we removed steps.<\/p>\n<p><\/p>\n<blockquote><p>Jessie Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) coined the term deployless at the Future of Software Development conference in Reykjavik.<\/p><\/blockquote>\n<p>We immediately decided that Dark would be based on the concept of 'deployless' (thanks to <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex> for the neologism). Deployless means that any code is instantly deployed and ready for production use. Of course, we won\u2019t miss any broken or incomplete code (I will outline the safety principles below).<\/p>\n<p><\/p>\n<p>At the Dark demonstration, we were often asked how we managed to accelerate deployments so much. A strange question. People probably think we invented some super technology that compares code, compiles it, packages it into a container, launches a virtual machine, cold starts the container, and all that in 50 ms. That\u2019s hardly possible. But we created a special deployment engine that doesn\u2019t need that.<\/p>\n<p><\/p>\n<p>Dark runs interpreters in the cloud. Suppose you write code in a function or an HTTP or event handler. We send a diff to the abstract syntax tree (the code representation that our editor and servers internally use) to our servers and then run that code when requests come in. So deployment looks just like a simple database record \u2014 instantaneous and straightforward. Deployment happens so fast because it includes only the essentials.<\/p>\n<p><\/p>\n<p>In the future, we plan to make Dark an infrastructure compiler that will create and launch the perfect infrastructure for high performance and reliability of applications. Instant deployment, of course, will not go away.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Safe deployment<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Structured editor<\/h3>\n<p><\/p>\n<p>Code in Dark is written in the Dark editor. The structured editor does not allow syntax errors. Essentially, Dark doesn't even have a parser. While you are typing, we work directly with the abstract syntax tree (AST), just like <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>Any unfinished code in Dark has valid execution semantics, somewhat like <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">typed holes in Hazel<\/a><\/noindex>. N\u00e4iteks, kui muudate funktsiooni kutsumistingimusi, hoiame vanad funktsioonid kuni uus on rakendatav.<\/p>\n<p><\/p>\n<p>Igal programmil Darkis on oma t\u00e4hendus, seega ei sega l\u00f5petamata kood l\u00f5petatud koodi t\u00f6\u00f6d.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Redigeerimisre\u017eiimid<\/h3>\n<p><\/p>\n<p>Te kirjutate Darkis koodi kahes olukorras. Esimene: kirjutate uut koodi ja olete ainus kasutaja. N\u00e4iteks on see REPL-is ja teised kasutajad ei saa sellele kunagi ligi, v\u00f5i see on uus HTTP marsruut, millele te kusagil viitate. Sellisel juhul saate t\u00f6\u00f6tada ilma ettevaatusabin\u00f5udeta ja praegu t\u00f6\u00f6tate just nii arenduskeskkonnas.<\/p>\n<p><\/p>\n<p>Teine olukord: kood on juba kasutuses. Kui koodis liigub liiklus (funktsioonid, s\u00fcndmusk\u00e4itlejad, andmebaasid jne), tuleb olla ettevaatlik. Selleks blokeerime kogu kasutatava koodi ja n\u00f5uame, et kasutate selle redigeerimiseks struktureeritumaid t\u00f6\u00f6riistu. Struktureeritud t\u00f6\u00f6riistade kohta r\u00e4\u00e4gin allpool: funktsioonide l\u00fclitid HTTP ja s\u00fcndmusk\u00e4itlejate jaoks, tugeva andmebaasi migratsiooni platvorm ja 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 eemaldamiseks<\/a><\/noindex> Darkis \u2014 on lahendada mitu probleemi \u00fche lahendusega. Funktsioonide l\u00fclitid t\u00e4idavad palju erinevaid \u00fclesandeid: asendavad kohalikku arenduskeskkonda, git haru, koodi kasutuselev\u00f5ttu ja muidugi traditsioonilise aeglaselt kontrollitud uue koodi v\u00e4ljasuretuse.<\/p>\n<p><\/p>\n<p>Funktsiooni l\u00fclitite loomine ja kasutuselev\u00f5tt toimub meie redigeerijas \u00fche toiminguna. See loob t\u00fchja ruumi uuele koodile ja pakub juurdep\u00e4\u00e4sukontrolli vanale ja uuele koodile, samuti nuppe ja k\u00e4ske uue koodi sujuvaks kasutuselev\u00f5tuks v\u00f5i selle eraldamiseks.<\/p>\n<p><\/p>\n<p>Funktsioonide l\u00fclitid on sisseehitatud Darki keelde ja isegi l\u00f5petamata l\u00fclitid t\u00e4idavad oma \u00fclesande \u2014 kui l\u00fcliti tingimus ei ole t\u00e4idetud, k\u00e4ivitatakse vana blokeeritud kood.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Arenduskeskkond<\/h3>\n<p><\/p>\n<p>Funktsionaalsuse l\u00fclitid asendavad kohaliku arenduskeskkonna. Praegu on meeskondadel keeruline j\u00e4lgida, et k\u00f5ik kasutaksid sama versiooni t\u00f6\u00f6riistadest ja teeki (koodiformaatimise t\u00f6\u00f6riistad, lintreid, paketihaldurid, kompilaatorid, eelprotsessorid, testimist\u00f6\u00f6riistad jne). Darki abil ei pea s\u00f5ltuvusi kohaliku taseme, Dockerit seadistama ega v\u00f5tma muid meetmeid, et tagada mingigi v\u00f5rdsus arenduskeskkonna ja tootmise vahel. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Arvestades, et selline v\u00f5rdsus on ikkagi v\u00f5imatu,<\/a><\/noindex>, me isegi ei teeselda, et p\u00fc\u00fcame selle poole.<\/p>\n<p><\/p>\n<p>Kohaliku keskkonna kloonimise asemel loob Darki l\u00fcliti uue liivakasti tootmises, mis asendab arenduskeskkonna. Tulevikus plaanime luua liivakaste ka rakenduse teistele osadele (n\u00e4iteks andmebaasi kohesed kloonid), kuigi praegu ei tundu see nii t\u00e4htis.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Oksad ja juurutamised<\/h3>\n<p><\/p>\n<p>Praegu on mitu viisi uue koodi sisestamiseks s\u00fcsteemidesse: git-oksad, juurutamisetapid ja funktsionaalsuse l\u00fclitid. Need lahendavad \u00fche probleemi erinevates t\u00f6\u00f6voogudes: git - juurutamise eelsetes etappides, juurutamine - vana koodilt uuele \u00fcleminekul, ja funktsionaalsuse l\u00fclitid - kontrollitud uue koodi avaldamiseks.<\/p>\n<p><\/p>\n<p>K\u00f5ige t\u00f5husam viis on funktsionaalsuse l\u00fclitid (samuti k\u00f5ige lihtsam m\u00f5ista ja kasutada). Nende abil saab t\u00e4ielikult loobuda \u00fclej\u00e4\u00e4nud kahest meetodist. Eriti kasulik on juurutamine eemaldada - kui me ikkagi kasutame funktsionaalsuse l\u00fcliteid koodi aktiveerimiseks, siis serverite \u00fcleviimise samm uuele koodile tekitab vaid liigseid riske.<\/p>\n<p><\/p>\n<p>Giti kasutamine on keeruline, eriti algajatele, ja see piirab seda suuresti, kuid sellel on mugavad oksad. Oleme siledanud palju giti puudusi. Dark muudab reaalajas ja pakub koost\u00f6\u00f6d sarnasel viisil nagu Google Docs, et ei peaks koodi saatma ja saaksime harvemini rebase ja merge l\u00e4bi viia.<\/p>\n<p><\/p>\n<p>Funktsioonide l\u00fclitid on ohutu juurutamise aluseks. Koos kiirete juurutamistega v\u00f5imaldavad need kiiresti testida kontseptsioone v\u00e4ikestes fragmentides, millel on madal risk, selle asemel et rakendada \u00fchte suurt muudatust, mis v\u00f5ib s\u00fcsteemi kokku kukutada.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versioonihaldus<\/h3>\n<p><\/p>\n<p>Funktsioonide ja t\u00fc\u00fcpide muutmiseks kasutame versioonihaldust. Kui soovite funktsiooni muuta, loob Dark selle funktsiooni jaoks uue versiooni. Siis saate seda versiooni kutsuda v\u00e4lja l\u00fcliti abil HTTP- v\u00f5i s\u00fcndmuste t\u00f6\u00f6tlejas. (Kui see funktsioon on kutsumisgraafis s\u00fcgaval, luuakse igal kutsumisel uus versioon. See v\u00f5ib tunduda liialdusena, kuid funktsioonid ei sega \u00fcksteist, kui te neid ei kasuta, nii et te isegi ei m\u00e4rka seda.)<\/p>\n<p><\/p>\n<p>Samadel p\u00f5hjustel haldame ka t\u00fc\u00fcpide versioone. Me oleme p\u00f5hjalikult r\u00e4\u00e4kinud oma t\u00fc\u00fcpide s\u00fcsteemist. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">eelmisel postitusel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Funktsioonide ja t\u00fc\u00fcpide versioonihaldus v\u00f5imaldab teil rakenduses muudatusi j\u00e4rk-j\u00e4rgult sisse viia. Saate kontrollida, et iga \u00fcksik t\u00f6\u00f6tleja t\u00f6\u00f6tab uue versiooniga, kuid ei pea kohe k\u00f5iki muudatusi rakendustesse tegema (kuid meil on t\u00f6\u00f6riistad, et seda kiiresti teha, kui soovite).<\/p>\n<p><\/p>\n<p>See on palju ohutum kui k\u00f5igi asjade korraga juurutamine, nagu toimub praegu.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Uued pakettide versioonid ja standardraamatukogu<\/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 j\u00e4tkab sama versiooni kasutamist, mida ta kasutas, ja te v\u00e4rskendate funktsioonide ja t\u00fc\u00fcpide kasutamist uue versiooni jaoks igas eraldi juhtumis 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>Ekraanipilt osast automatiseeritud protsessist Darkis, mis n\u00e4itab kahte versiooni funktsioonist Dict::get. Dict::get_v0 tagastas t\u00fc\u00fcbi Any (mille kasutamisest me loobume), kuid Dict::get_v1 tagastab t\u00fc\u00fcbi Option.<\/em><\/p>\n<p><\/p>\n<p>Meie standardraamatukogus pakume sageli uusi funktsioone ning v\u00e4listame vanad versioonid. Vanade versioonidega kasutajad saavad endiselt neile juurde p\u00e4\u00e4seda, kuid uued kasutajad ei saa neid. Kavatseme pakkuda t\u00f6\u00f6riistu, et aidata vanade versioonide kasutajatel uutele versioonidele \u00fcleminekul \u00fche sammu teha, samuti l\u00fclitite abil.<\/p>\n<p><\/p>\n<p>Dark pakub ka ainulaadset v\u00f5imalust: kuna me t\u00e4idame teie t\u00f6\u00f6koode, saame ise testida uusi versioone, v\u00f5rreldes v\u00e4ljundit uute ja vanade p\u00e4ringute jaoks, et teavitada teid muudatustest. L\u00f5ppkokkuv\u00f5ttes esindab pakettide v\u00e4rskendamine, mida tihti tehakse orienteerumata (v\u00f5i mis n\u00f5uab p\u00f5hjalikku testimist turvalisuse nimel), palju v\u00e4hem riske ja 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 kestis k\u00fcmme aastat ja on endiselt probleem. Kuna me loome Darki pidevaks tarnimiseks, tuleb neid keele muudatusi arvesse v\u00f5tta.<\/p>\n<p><\/p>\n<p>Kui me teeme keeles v\u00e4ikseid muudatusi, loome uue versiooni Dark. Vana kood j\u00e4\u00e4b vanasse versiooni Dark, samas kui uus kood kasutatakse uues versioonis. Uuele versioonile \u00fclemiseks saab kasutada vahetusl\u00fcliteid v\u00f5i funktsiooniversioone.<\/p>\n<p><\/p>\n<p>See on eriti kasulik, arvestades, et Dark on ilmunud suhteliselt hiljuti. Paljud keele v\u00f5i teeki muudatused v\u00f5ivad osutuda eba\u00f5nnestunuks. Ahnede versioonide kasutamine v\u00f5imaldab meil teha v\u00e4ikesi uuendusi, st me ei pea kiirustama ja saame paljusid otsuseid keele kohta edasi l\u00fckata, kuni meil on rohkem kasutajaid ja seega rohkem teavet.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Andmebaasi migreerimine<\/h3>\n<p><\/p>\n<p>Ohutuks andmebaasi migreerimiseks on olemas <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">standardne valem<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>Koodi \u00fcmberkirjutamine uute ja vanade formaatide toetamiseks<\/li>\n<li>K\u00f5ik andmed uude vormingusse konverteerimine<\/li>\n<li>Vana andmete juurde p\u00e4\u00e4su eemaldamine<\/li>\n<\/ul>\n<p><\/p>\n<p>L\u00f5ppkokkuv\u00f5ttes pikendab andmebaasi migreerimine aega ja n\u00f5uab palju ressursse. Meil kogunevad vananenud skeemid, kuna isegi lihtsad \u00fclesanded, nagu tabeli v\u00f5i veeru nime muutmine, ei ole vaeva v\u00e4\u00e4rt.<\/p>\n<p><\/p>\n<p>Darkil on t\u00f5hus andmebaasi migreerimise platvorm, mis (loodame) muudab protsessi nii lihtsaks, et te ei karda seda enam. K\u00f5ik Darki andmesalvestid (v\u00f5tme-v\u00e4\u00e4rtuse paaride salvestid v\u00f5i p\u00fcsivad hash-tabelid) on t\u00fc\u00fcbiga. Andmesalvestuse \u00fcleviimiseks m\u00e4\u00e4rate lihtsalt uue t\u00fc\u00fcbi ning funktsiooni v\u00e4\u00e4rtuste konverteerimiseks kahe t\u00fc\u00fcbi vahel.<\/p>\n<p><\/p>\n<p>Andmete salvestamise s\u00fcsteemid Darkis on ligip\u00e4\u00e4setavad versioonitud muutujanimede kaudu. N\u00e4iteks andmehoidla Users kannab algselt nime Users-v0. Kui luuakse uus versioon teistsuguse t\u00fc\u00fcbiga, siis muudetakse nimeks Users-v1. Kui andmed on salvestatud Users-v0 kaudu ja te p\u00f6\u00f6rdute nende poole Users-v1 kaudu, rakendatakse taastamisfunktsiooni. Kui andmed on salvestatud Users-v1 kaudu ja te p\u00f6\u00f6rdute nende poole Users-v0 kaudu, rakendatakse tagasiulatuva funktsiooni.<\/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 migratsiooniekraan koos vana andmebaasi v\u00e4lja nimedega, taastamis- ja tagasiulatuvate v\u00e4ljenditega ning juhistega migreerimise v\u00f5imaldamiseks.<\/em><\/p>\n<p><\/p>\n<p>Kasutage funktsioonide l\u00fcliteid, et suunata kutsed Users-v0 versiooni Users-v1. Seda saab teha \u00fche HTTP k\u00e4itleja korraga, et v\u00e4hendada riske, ning l\u00fclitid t\u00f6\u00f6tavad ka eraldi kasutajate jaoks, et saaksite kontrollida, et k\u00f5ik t\u00f6\u00f6tab ootusp\u00e4raselt. Kui Users-v0 kasutajaid enam ei j\u00e4\u00e4, konverteerib Dark k\u00f5ik \u00fclej\u00e4\u00e4nud andmed taustal vanast formaadist uude. Te ei m\u00e4rkagi seda.<\/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, seega on selle testimise ulatus oluliselt v\u00e4iksem v\u00f5rreldes objektorienteeritud d\u00fcnaamilise t\u00fcpiseerimisega keeltega. Kuid testimist on siiski vaja.<br \/>\nDarkis k\u00e4ivitab redaktor taustal automaatselt moodulitestid muudetud koodi jaoks ja vaikimisi l\u00e4biviib neid teste k\u00f5igi funktsioonide l\u00fclitite jaoks. Tulevikus tahame staatiliste t\u00fcpiseerimise abil automaatselt koodifuzzimist teostada, et leida vigu.<\/p>\n<p><\/p>\n<p>Lisaks rakendab Dark teie infrastruktuuri tootmisre\u017eiimis, mis avab uusi v\u00f5imalusi. Salvestame automaatselt HTTP p\u00e4ringud Dark infrastruktuuris (praegu salvestame k\u00f5iki p\u00e4ringuid, kuid hiljem plaanime liikuda valimise suunal). Testime nende p\u00f5hjal uut koodi ja viime l\u00e4bi mooduliteste, ning soovi korral saate h\u00f5lpsasti muuta huvitavad p\u00e4ringud moodulitestideks.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">Mille me k\u00f5rvaldame<\/h3>\n<p><\/p>\n<p>Kuna meil ei ole juurutamist, vaid on funktsioonide l\u00fclitid, j\u00e4\u00e4b umbes 60% juurutuse protsessist k\u00f5rvale. Me ei vaja git harusid ega t\u00f5mbep\u00e4ringuid, taustades ressursside ja konteinerite koostamist, ressursside ja konteinerite saatmist registritesse ega juurutamisprotsesside samme Kubernetesis.<\/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>Tavaline pidev tarnetoru v\u00f5rrelduna Darkiga (vasakul) ja pidev tarnetoru Darkis (paremal). Darkis tarnetoru koosneb 6 sammust ja \u00fchest ts\u00fcklist, samas kui traditsiooniline versioon h\u00f5lmab 35 sammu ja 3 ts\u00fcklit.<\/em><\/p>\n<p><\/p>\n<p>Darkis on k\u00f5igest 6 sammu ja 1 ts\u00fckkel (sammud, mis korduvad mitu korda) juurutamises, samas kui t\u00e4nap\u00e4eva pidev tarnetoru koosneb 35 sammust ja 3 ts\u00fcklist. Darkis k\u00e4ivitatakse testid automaatselt, ja te ei m\u00e4rkagi seda; s\u00f5ltuvused installitakse automaatselt; k\u00f5ik, mis on seotud git v\u00f5i Githubiga, pole enam vajalik; Docker konteinerite kogumine, testimine ja saatmine pole enam vajalik; Kuberneteses juurutamine ei ole enam vajalik.<\/p>\n<p><\/p>\n<p>Ievenenud sammud Darkis on lihtsamad. Kuna funktsioonide l\u00fclititega saab hallata \u00fche tegevusega, pole vaja uuesti l\u00e4bida kogu juurutustoru, et eemaldada vana kood.<\/p>\n<p><\/p>\n<p>Oleme koodi tarnimist niipalju lihtsustanud, et v\u00e4hendasime pideva tarnimise aega ja riske. Lisaks oleme oluliselt lihtsustanud pakettide uuendamist, andmebaaside migreerimist, testimist, versioonihaldust, s\u00f5ltuvuste installimist, arenduskeskkonna ja tootmiskeskkonna v\u00f5rdset kohtlemist ning kiireid ja turvalisi keeleversioonide uuendusi.<\/p>\n<p><\/p>\n<p>Vastan sellele k\u00fcsimusele <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNewsis<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Darki seadme kohta rohkem teada saamiseks 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---------------------------\">j\u00e4rgige meid Twitteris<\/a><\/noindex> (v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">minu<\/a><\/noindex>) v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">registreerige betaversiooni ja saage teateid j\u00e4rgmiste postituste kohta<\/a><\/noindex>. Kui k\u00fclastate StrangeLoopi septembris, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">tulge meie k\u00e4ivitamisele<\/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 5.0.1.1 - 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\/et\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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.\" \/>\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 on arendusprotsess, seda kiiremini.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}