{"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\/de\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"Wie Dark Code in 50 ms bereitstellt","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wie Dark Code in 50 ms bereitstellt\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je schneller der Entwicklungsprozess, desto schneller entwickelt sich das Technologieunternehmen.<\/p>\n<p><\/p>\n<p>Leider arbeiten moderne Anwendungen gegen uns \u2013 unsere Systeme m\u00fcssen in Echtzeit aktualisiert werden, ohne dabei zu st\u00f6ren oder Ausf\u00e4lle zu verursachen. Die Bereitstellung in solchen Systemen wird zu einer komplexen Herausforderung und erfordert selbst in kleinen Teams anspruchsvolle Continuous-Delivery-Pipelines.<\/p>\n<p><\/p>\n<p>Diese Pipelines haben in der Regel eine eingeschr\u00e4nkte Anwendung, funktionieren langsam und sind nicht besonders zuverl\u00e4ssig. Entwickler m\u00fcssen sie zuerst manuell erstellen und dann verwalten, was h\u00e4ufig dazu f\u00fchrt, dass ganze DevOps-Teams eingestellt werden.<\/p>\n<p><\/p>\n<p>Die Geschwindigkeit dieser Pipelines bestimmt die Entwicklungsgeschwindigkeit. Bei den besten Teams dauert das Bereitstellen 5\u201310 Minuten, aber in der Regel dauert es viel l\u00e4nger, und f\u00fcr eine Bereitstellung werden mehrere Stunden ben\u00f6tigt.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Bei Dark dauert dies 50 ms. <em>F\u00fcnfzig. Millisekunden<\/em>. Dark \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">ist eine umfassende L\u00f6sung mit einer Programmiersprache, einem Editor und der entsprechenden Infrastruktur.<\/a><\/noindex>, speziell f\u00fcr kontinuierliche Bereitstellung entwickelt, und alle Aspekte von Dark, einschlie\u00dflich der Sprache selbst, sind mit Blick auf sichere, sofortige Bereitstellung aufgebaut.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Warum sind Pipelines f\u00fcr kontinuierliche Bereitstellung so langsam?<\/h3>\n<p><\/p>\n<p>Angenommen, wir haben eine Python-Webanwendung und haben bereits eine hervorragende und moderne Pipeline f\u00fcr die kontinuierliche Bereitstellung erstellt. F\u00fcr einen Entwickler, der t\u00e4glich an diesem Projekt arbeitet, sieht die Bereitstellung einer kleinen \u00c4nderung ungef\u00e4hr so aus:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">\u00c4nderungen vornehmen<\/h3>\n<p><\/p>\n<ul>\n<li>Erstellen eines neuen Branches in git<\/li>\n<li>\u00c4nderungen \u00fcber den Funktionsschalter vornehmen<\/li>\n<li>Modultests zur \u00dcberpr\u00fcfung der \u00c4nderungen mit und ohne Funktionsschalter<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">Pull-Request<\/h3>\n<p><\/p>\n<ul>\n<li>\u00c4nderungen committen<\/li>\n<li>\u00c4nderungen in das entfernte Repository auf GitHub senden<\/li>\n<li>Pull-Request<\/li>\n<li>CI-Bau l\u00e4uft automatisch im Hintergrund<\/li>\n<li>Code-\u00dcberpr\u00fcfung<\/li>\n<li>Noch ein paar \u00dcberpr\u00fcfungen, wenn n\u00f6tig<\/li>\n<li>\u00c4nderungen mit dem Master von git mergen.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI wird auf dem Master ausgef\u00fchrt<\/h3>\n<p><\/p>\n<ul>\n<li>Installation der Frontend-Abh\u00e4ngigkeiten \u00fcber npm<\/li>\n<li>Bau und Optimierung der HTML+CSS+JS-Ressourcen<\/li>\n<li>Durchf\u00fchrung von modularen und funktionalen Tests im Frontend<\/li>\n<li>Installation der Python-Abh\u00e4ngigkeiten aus PyPI<\/li>\n<li>Durchf\u00fchrung von modularen und funktionalen Tests im Backend<\/li>\n<li>Integrationstests an beiden Enden<\/li>\n<li>Bereitstellung von Frontend-Ressourcen im CDN<\/li>\n<li>Container f\u00fcr das Python-Programm erstellen<\/li>\n<li>Container in das Registry hochladen<\/li>\n<li>Kubernetes-Manifest aktualisieren<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Alten Code durch neuen ersetzen<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes startet mehrere Instanzen des neuen Containers<\/li>\n<li>Kubernetes wartet, bis die Instanzen betriebsbereit sind<\/li>\n<li>Kubernetes f\u00fcgt die Instanzen dem HTTP-Load-Balancer hinzu<\/li>\n<li>Kubernetes wartet, bis die alten Instanzen nicht mehr verwendet werden<\/li>\n<li>Kubernetes stoppt die alten Instanzen<\/li>\n<li>Kubernetes wiederholt diese Vorg\u00e4nge, bis alle alten Instanzen ersetzt sind<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Neuen Funktionsschalter aktivieren<\/h3>\n<p><\/p>\n<ul>\n<li>Neuer Code wird zun\u00e4chst nur f\u00fcr sich selbst aktiviert, um sicherzustellen, dass alles funktioniert<\/li>\n<li>Neuer Code wird f\u00fcr 10% der Nutzer aktiviert, betriebliche und gesch\u00e4ftliche Metriken werden \u00fcberwacht<\/li>\n<li>Neuer Code wird f\u00fcr 50% der Nutzer aktiviert, betriebliche und gesch\u00e4ftliche Metriken werden \u00fcberwacht<\/li>\n<li>Neuer Code wird f\u00fcr 100% der Nutzer aktiviert, betriebliche und gesch\u00e4ftliche Metriken werden \u00fcberwacht<\/li>\n<li>Schlie\u00dflich wiederholen Sie den gesamten Prozess, um den alten Code und den Schalter zu entfernen<\/li>\n<\/ul>\n<p><\/p>\n<p>Der Prozess h\u00e4ngt von den Werkzeugen, der Sprache und der Nutzung serviceorientierter Architekturen ab, sieht aber im Gro\u00dfen und Ganzen so aus. Ich habe die Bereitstellungen mit Datenbankmigrationen nicht erw\u00e4hnt, da hierf\u00fcr eine sorgf\u00e4ltige Planung erforderlich ist, aber weiter unten erkl\u00e4re ich, wie Dark damit umgeht.<\/p>\n<p><\/p>\n<p>Es gibt viele Komponenten, von denen viele leicht ins Stocken geraten, abst\u00fcrzen, zeitliche Konflikte verursachen oder das Arbeitssystem zum Absturz bringen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Da diese Pipelines fast immer f\u00fcr spezielle Anl\u00e4sse erstellt werden, ist es schwierig, sich auf sie zu verlassen. Viele erleben Tage, an denen der Code nicht bereitgestellt werden kann, weil es Probleme mit der Dockerfile gibt, einer der vielen Services ausgefallen ist oder der ben\u00f6tigte Spezialist im Urlaub ist.<\/p>\n<p><\/p>\n<p>Schlimmer noch, viele dieser Schritte bringen \u00fcberhaupt keinen Nutzen. Sie waren fr\u00fcher notwendig, als wir den Code direkt f\u00fcr die Nutzer bereitstellten, aber jetzt haben wir Umschalter f\u00fcr neuen Code, und diese Prozesse haben sich getrennt. Dadurch ist der Schritt, bei dem der Code bereitgestellt wird (alter Code wird durch neuen ersetzt), zu einem unn\u00f6tigen Risiko geworden.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich ist dies ein sehr durchdachter Pipeline. Das Team, das ihn erstellt hat, hat keine Zeit und Kosten gescheut, um eine schnelle Implementierung zu gew\u00e4hrleisten. \u00dcblicherweise sind Deployment-Pipelines deutlich langsamer und unzuverl\u00e4ssiger.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Implementierung der kontinuierlichen Lieferung bei Dark<\/h3>\n<p><\/p>\n<p>Die kontinuierliche Lieferung ist f\u00fcr Dark so wichtig, dass wir von Anfang an auf eine Zeit von weniger als einer Sekunde abgezielt haben. Wir haben alle Schritte der Pipeline durchgesehen, um \u00dcberfl\u00fcssiges zu eliminieren und den Rest zu optimieren. So haben wir Schritte entfernt.<\/p>\n<p><\/p>\n<blockquote><p>Jessie Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) pr\u00e4gte das neue Wort \u201edeployless\u201c (keine Bereitstellung erforderlich) auf der Konferenz Future of Software Development in Reykjavik.<\/p><\/blockquote>\n<p>Wir haben sofort entschieden, dass Dark auf dem Konzept \u201edeployless\u201c basieren wird (danke <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex> f\u00fcr das Neologismus). Deployless bedeutet, dass jeder Code sofort bereitgestellt wird und zur Verwendung in der Produktion bereit ist. Nat\u00fcrlich \u00fcberspringen wir keinen fehlerhaften oder unvollst\u00e4ndigen Code (die Sicherheitsprinzipien werde ich weiter unten erl\u00e4utern).<\/p>\n<p><\/p>\n<p>W\u00e4hrend der Dark-Demo wurden wir h\u00e4ufig gefragt, wie wir die Bereitstellung so schnell beschleunigen konnten. Eine seltsame Frage. Die Leute scheinen zu denken, wir h\u00e4tten eine Supertechnologie erfunden, die den Code vergleicht, ihn kompiliert, in ein Container-Paket packt, eine virtuelle Maschine startet und den Container kalt startet \u2014 und das alles in 50 ms. Wahrscheinlich ist das nicht m\u00f6glich. Aber wir haben einen speziellen Bereitstellungs-Engine entwickelt, der all das nicht ben\u00f6tigt.<\/p>\n<p><\/p>\n<p>Dark startet Interpreter in der Cloud. Angenommen, Sie schreiben Code in einer Funktion oder einem HTTP-Handler oder Ereignis. Wir senden die Differenz zu einem abstrakten Syntaxbaum (die Code-Implementierung, die intern von unserem Editor und unseren Servern verwendet wird) an unsere Server und f\u00fchren diesen Code aus, sobald Anfragen eintreffen. So sieht die Bereitstellung einfach wie ein bescheidener Datensatz in der Datenbank aus \u2013 sofort und elementar. Die Bereitstellung erfolgt so schnell, weil sie das absolute Minimum umfasst.<\/p>\n<p><\/p>\n<p>In Zukunft planen wir, Dark zu einem Infrastrukturkompiler zu machen, der die ideale Infrastruktur f\u00fcr hohe Leistung und Zuverl\u00e4ssigkeit von Anwendungen erstellen und bereitstellen kann. Die sofortige Bereitstellung wird dabei selbstverst\u00e4ndlich nicht wegfallen.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Sichere Bereitstellung<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Strukturierter Editor<\/h3>\n<p><\/p>\n<p>Der Code in Dark wird im Dark-Editor geschrieben. Der strukturierte Editor verhindert syntaktische Fehler. Tats\u00e4chlich gibt es in Dark nicht einmal einen Parser. W\u00e4hrend Sie Text eingeben, arbeiten wir direkt mit dem abstrakten Syntaxbaum (AST), so wie <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> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Jeder unvervollst\u00e4ndigte Code in Dark hat eine zul\u00e4ssige Ausf\u00fchrungssemantik, \u00e4hnlich wie <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">typed holes in Hazel<\/a><\/noindex>. Zum Beispiel, wenn Sie einen Funktionsaufruf \u00e4ndern, speichern wir die alte Funktion, bis die neue brauchbar ist.<\/p>\n<p><\/p>\n<p>Jedes Programm in Dark hat seine eigene Bedeutung, sodass unvollst\u00e4ndiger Code nicht die Ausf\u00fchrung des vollst\u00e4ndigen Codes beeintr\u00e4chtigt.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Bearbeitungsmodi<\/h3>\n<p><\/p>\n<p>In Dark schreiben Sie Code in zwei F\u00e4llen. Erster Fall: Sie schreiben neuen Code und sind der einzige Benutzer. Zum Beispiel, wenn er sich in REPL befindet und andere Benutzer niemals darauf zugreifen k\u00f6nnen, oder es sich um einen neuen HTTP-Routen handelt, auf den Sie nirgendwo verweisen. Hier k\u00f6nnen Sie ohne besondere Vorsichtsma\u00dfnahmen arbeiten, und genau so arbeiten Sie derzeit in der Entwicklungsumgebung.<\/p>\n<p><\/p>\n<p>Zweite Situation: Der Code wird bereits verwendet. Wenn \u00fcber den Code Verkehr l\u00e4uft (Funktionen, Ereignis-Handler, Datenbanken usw.), ist Vorsicht geboten. Daher blockieren wir den gesamten verwendeten Code und fordern, dass strukturiert gearbeitet wird, um ihn zu bearbeiten. Dazu informiere ich Sie weiter unten \u00fcber strukturelle Werkzeuge: Funktions-Schalter f\u00fcr HTTP-Handler und Events, eine leistungsstarke Migrationsplattform f\u00fcr Datenbanken und eine neue Methoden zur Versionsverwaltung f\u00fcr Funktionen und Datentypen.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Funktions-Schalter<\/h3>\n<p><\/p>\n<p>Eine der M\u00f6glichkeiten <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">\u00fcberfl\u00fcssige Komplexit\u00e4t zu entfernen<\/a><\/noindex> In Dark k\u00f6nnen mehrere Probleme mit einer einzigen L\u00f6sung behoben werden. Funktionstaster erf\u00fcllen viele verschiedene Aufgaben: Sie ersetzen die lokale Entwicklungsumgebung, verwalten Git-Zweige, setzen Code in Betrieb und erm\u00f6glichen nat\u00fcrlich eine herk\u00f6mmliche, langsame und kontrollierte Ver\u00f6ffentlichung neuer Codes.<\/p>\n<p><\/p>\n<p>Die Erstellung und Bereitstellung eines Funktionstasters erfolgt in unserem Editor in einem einzigen Schritt. Er schafft einen leeren Raum f\u00fcr neuen Code und bietet Zugriffskontrolle f\u00fcr den alten und neuen Code sowie Schaltfl\u00e4chen und Befehle f\u00fcr einen schrittweisen \u00dcbergang zu neuem Code oder dessen Ausschluss.<\/p>\n<p><\/p>\n<p>Funktionstaster sind in die Dark-Sprache integriert, und selbst unvollst\u00e4ndige Taster erf\u00fcllen ihre Aufgabe \u2013 wenn die Bedingung im Taster nicht erf\u00fcllt ist, wird der alte blockierte Code ausgef\u00fchrt.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Entwicklungsumgebung<\/h3>\n<p><\/p>\n<p>Funktionsschalter ersetzen die lokale Entwicklungsumgebung. Heute f\u00e4llt es Teams schwer, sicherzustellen, dass alle dieselben Versionen von Tools und Bibliotheken (Code-Formatter, Linter, Paketmanager, Compiler, Preprozessoren, Testwerkzeuge usw.) verwenden. Mit Dark ist es nicht erforderlich, Abh\u00e4ngigkeiten lokal zu installieren, die lokale Docker-Installation zu verwalten oder andere Ma\u00dfnahmen zu ergreifen, um zumindest eine Art Gleichheit zwischen Entwicklungs- und Produktionsumgebung zu erreichen. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Angesichts der Tatsache, dass eine solche Gleichheit ohnehin unm\u00f6glich ist<\/a><\/noindex>, werden wir nicht einmal so tun, als ob wir danach streben.<\/p>\n<p><\/p>\n<p>Anstatt eine geklonte lokale Umgebung zu schaffen, erstellt Dark mit den Schaltern eine neue Sandbox in der Produktion, die die Entwicklungsumgebung ersetzt. In Zukunft planen wir auch, Sandboxes f\u00fcr andere Teile der Anwendung zu erstellen (z. B. sofortige Klone von Datenbanken), obwohl dies derzeit nicht so wichtig erscheint.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Branches und Deployments<\/h3>\n<p><\/p>\n<p>Es gibt jetzt mehrere M\u00f6glichkeiten, neuen Code in Systeme einzuf\u00fchren: Git-Branches, Bereitstellungsstufen und Feature-Flags. Sie l\u00f6sen dasselbe Problem in unterschiedlichen Teilen des Workflows: Git \u2013 in den Phasen vor der Bereitstellung, die Bereitstellung \u2013 beim Wechsel von altem zu neuem Code, und Feature-Flags \u2013 f\u00fcr die kontrollierte Einf\u00fchrung neuen Codes.<\/p>\n<p><\/p>\n<p>Der effektivste Weg sind Feature-Flags (dabei auch der einfachste zu verstehen und zu nutzen). Damit kann man vollst\u00e4ndig auf die anderen beiden Methoden verzichten. Es ist besonders vorteilhaft, die Bereitstellung zu eliminieren \u2013 wenn wir ohnehin Feature-Flags nutzen, um den Code zu aktivieren, dann birgt der Schritt, Server auf neuen Code zu \u00fcbertragen, nur unn\u00f6tige Risiken.<\/p>\n<p><\/p>\n<p>Git ist schwer zu bedienen, besonders f\u00fcr Anf\u00e4nger, und das schr\u00e4nkt seine Nutzung stark ein, aber es verf\u00fcgt \u00fcber n\u00fctzliche Branches. Wir haben viele Nachteile von Git gemildert. Dark wird in Echtzeit bearbeitet und erm\u00f6glicht die Zusammenarbeit im Stil von Google Docs, sodass man den Code nicht verschicken und weniger h\u00e4ufig das Rebase und Mergen durchf\u00fchren muss.<\/p>\n<p><\/p>\n<p>Funktionsumschalter sind die Grundlage f\u00fcr eine sichere Bereitstellung. Zusammen mit sofortigen Bereitstellungen erm\u00f6glichen sie es, Konzepte schnell in kleinen, risikoarmen Fragmenten zu testen, anstatt eine gro\u00dfe \u00c4nderung vorzunehmen, die das System zum Absturz bringen k\u00f6nnte.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versionsverwaltung<\/h3>\n<p><\/p>\n<p>F\u00fcr \u00c4nderungen an Funktionen und Typen verwenden wir Versionsverwaltung. Wenn Sie eine Funktion \u00e4ndern m\u00f6chten, erstellt Dark eine neue Version dieser Funktion. Sie k\u00f6nnen dann diese Version mit einem Schalter im HTTP-Handler oder in Ereignissen aufrufen. (Wenn diese Funktion tief im Aufrufgraphen liegt, wird w\u00e4hrenddessen f\u00fcr jede Funktion eine neue Version erstellt. Das mag \u00fcbertrieben erscheinen, aber die Funktionen st\u00f6ren sich nicht, solange Sie sie nicht verwenden, sodass Sie es nicht einmal bemerken werden.)<\/p>\n<p><\/p>\n<p>Aus denselben Gr\u00fcnden verwalten wir auch die Typen versioniert. \u00dcber unser Typensystem haben wir ausf\u00fchrlich berichtet. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">unserem vorherigen Beitrag<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Dank der Versionierung von Funktionen und Typen k\u00f6nnen Sie \u00c4nderungen schrittweise am Programm vornehmen. Sie k\u00f6nnen \u00fcberpr\u00fcfen, ob jeder einzelne Handler mit der neuen Version funktioniert, ohne sofort alle \u00c4nderungen im Programm umzusetzen (aber wir haben Werkzeuge, um dies schnell zu tun, wenn Sie m\u00f6chten).<\/p>\n<p><\/p>\n<p>Das ist viel sicherer, als alles auf einmal auszurollen, wie es derzeit der Fall ist.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Neue Versionen von Paketen und der Standardbibliothek<\/h3>\n<p><\/p>\n<p>Wenn Sie ein Paket in Dark aktualisieren, ersetzen wir nicht sofort die Verwendung jeder Funktion oder jedes Typs im gesamten Code. Das w\u00e4re unsicher. Der Code verwendet weiterhin die gleiche Version, die zuvor verwendet wurde, und Sie aktualisieren die Verwendung von Funktionen und Typen auf die neue Version f\u00fcr jeden einzelnen Fall mit Hilfe von Schaltern.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"Wie Dark Code in 50 ms bereitstellt\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Screenshot eines Teils des automatischen Prozesses in Dark, der zwei Versionen der Funktion Dict::get zeigt. Dict::get_v0 gab den Typ Any zur\u00fcck (von dem wir absehen), w\u00e4hrend Dict::get_v1 den Typ Option zur\u00fcckgibt.<\/em><\/p>\n<p><\/p>\n<p>Wir f\u00fchren h\u00e4ufig neue Funktionen in der Standardbibliothek ein und entfernen alte Versionen. Nutzer mit \u00e4lteren Versionen im Code haben weiterhin Zugriff darauf, w\u00e4hrend neue Nutzer diese nicht erhalten k\u00f6nnen. Wir planen, Werkzeuge bereitzustellen, die den Wechsel von alten zu neuen Versionen in nur einem Schritt erm\u00f6glichen, auch mithilfe von Funktion-Umschaltern.<\/p>\n<p><\/p>\n<p>Dark bietet au\u00dferdem eine einzigartige M\u00f6glichkeit: Da wir Ihren Arbeitscode ausf\u00fchren, k\u00f6nnen wir neue Versionen selbst testen, indem wir die Ausgaben f\u00fcr neue und alte Anfragen vergleichen, um Sie \u00fcber \u00c4nderungen zu informieren. Dadurch wird das Aktualisieren von Paketen, welches oft blind (oder mit sorgf\u00e4ltigen Sicherheitstests) erfolgt, erheblich risikominimiert und kann automatisch geschehen.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Neue Versionen von Dark<\/h3>\n<p><\/p>\n<p>Der \u00dcbergang von Python 2 zu Python 3 zog sich \u00fcber ein Jahrzehnt und bleibt ein Problem. Da wir Dark f\u00fcr kontinuierliche Lieferung entwickeln, m\u00fcssen diese Sprach\u00e4nderungen ber\u00fccksichtigt werden.<\/p>\n<p><\/p>\n<p>Bei kleinen \u00c4nderungen an der Sprache erstellen wir eine neue Version von Dark. Der alte Code bleibt in der alten Version von Dark, w\u00e4hrend der neue Code in der neuen Version verwendet wird. Zum Wechsel zur neuen Version von Dark k\u00f6nnen Schalter oder Funktionsversionen eingesetzt werden.<\/p>\n<p><\/p>\n<p>Dies ist besonders hilfreich, da Dark erst vor kurzem eingef\u00fchrt wurde. Viele \u00c4nderungen an der Sprache oder Bibliothek k\u00f6nnten sich als problematisch erweisen. Die schrittweise Versionierung der Sprache erm\u00f6glicht es uns, kleinere Updates durchzuf\u00fchren, das hei\u00dft, wir k\u00f6nnen uns Zeit nehmen und viele Entscheidungen zur Sprache aufschieben, bis wir mehr Nutzer haben, was wiederum mehr Informationen bedeutet.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Datenbankmigrationen<\/h3>\n<p><\/p>\n<p>F\u00fcr eine sichere Migration der Datenbank gibt es <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">eine standardisierte Vorgehensweise<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>den Code so umzuschreiben, dass er neue und alte Formate unterst\u00fctzt<\/li>\n<li>alle Daten in das neue Format umzuwandeln<\/li>\n<li>den alten Datenzugriff zu entfernen<\/li>\n<\/ul>\n<p><\/p>\n<p>Letztendlich zieht sich die Migration der Datenbank in die L\u00e4nge und erfordert viele Ressourcen. Dabei sammeln sich veraltete Schemata an, denn selbst einfache Aufgaben wie die Korrektur des Namens einer Tabelle oder Spalte rechtfertigen nicht den Aufwand.<\/p>\n<p><\/p>\n<p>Dark bietet eine effiziente Plattform zur Migration von Datenbanken, die den Prozess so stark vereinfachen sollte, dass Sie keine Angst mehr davor haben. Alle Datenspeicher in Dark (entweder \"Key-Value\"-Stores oder persistente Hashtabellen) haben einen Typ. Um einen Datenspeicher zu migrieren, weisen Sie ihm einfach einen neuen Typ zu und verwenden eine Rollback- und Rollforward-Funktion, um die Werte zwischen den beiden Typen zu konvertieren.<\/p>\n<p><\/p>\n<p>Der Zugriff auf die Datenspeicher in Dark erfolgt \u00fcber versionierte Variablenamen. Zum Beispiel wird der Datenspeicher \"Users\" zun\u00e4chst \"Users-v0\" genannt. Wenn eine neue Version mit einem anderen Typ erstellt wird, \u00e4ndert sich der Name in \"Users-v1\". Wenn Daten \u00fcber \"Users-v0\" gespeichert wurden und Sie diese \u00fcber \"Users-v1\" abfragen, wird die Rollforward-Funktion angewendet. Wenn Daten \u00fcber \"Users-v1\" gespeichert wurden und Sie diese \u00fcber \"Users-v0\" abfragen, kommt die Rollback-Funktion zur Anwendung.<\/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=\"Wie Dark Code in 50 ms bereitstellt\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Der Bildschirm zur Migration der Datenbank zeigt die Feldnamen der alten Datenbank, die Rollforward- und Rollback-Ausdr\u00fccke sowie Anweisungen zur Aktivierung der Migration an.<\/em><\/p>\n<p><\/p>\n<p>Verwenden Sie die Funktionstaster, um Anrufe von Users-v0 auf die Version Users-v1 umzuleiten. Dies kann handlerweise erfolgen, um Risiken zu minimieren, und die Taster arbeiten benutzerspezifisch, sodass Sie \u00fcberpr\u00fcfen k\u00f6nnen, ob alles wie erwartet funktioniert. Wenn keine Benutzer mehr in Users-v0 vorhanden sind, wird Dark alle verbleibenden Daten im Hintergrund vom alten Format in das neue konvertieren. Sie werden es kaum bemerken.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testen<\/h3>\n<p><\/p>\n<p>Dark ist <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">eine funktionale Programmiersprache mit statischer Typisierung<\/a><\/noindex> und unver\u00e4nderlichen Werten, weshalb die Testoberfl\u00e4che im Vergleich zu objektorientierten Sprachen mit dynamischer Typisierung deutlich kleiner ist. Dennoch muss alles getestet werden.<br \/>\nIn Dark f\u00fchrt der Editor automatisch im Hintergrund Modul-Tests f\u00fcr den bearbeiteten Code aus und f\u00fchrt standardm\u00e4\u00dfig diese Tests f\u00fcr alle Funktionstasten durch. In Zukunft m\u00f6chten wir durch statische Typen automatisch Fuzz-Testing des Codes durchf\u00fchren, um Fehler zu finden.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus betreibt Dark Ihre Infrastruktur in der Produktion, was neue M\u00f6glichkeiten er\u00f6ffnet. Wir speichern HTTP-Anfragen automatisch in der Dark-Infrastruktur (derzeit speichern wir alle Anfragen, planen jedoch, auf eine Auswahl umzusteigen). Wir testen neuen Code anhand dieser Anfragen und f\u00fchren Modultests durch. Wenn Sie w\u00fcnschen, k\u00f6nnen Sie interessante Anfragen problemlos in Modultests umwandeln.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">Wovon wir uns getrennt haben<\/h3>\n<p><\/p>\n<p>Da wir kein Deployment haben, sondern Funktionsschalter, bleiben etwa 60 % des Deployment-Pipelines au\u00dfen vor. Wir ben\u00f6tigen keine Git-Branches oder Pull-Requests, keinen Bau von Backend-Ressourcen und Containern, kein Hochladen von Ressourcen und Containern in Repositories oder Deployment-Schritte in 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=\"Wie Dark Code in 50 ms bereitstellt\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Vergleich zwischen einem Standard-Pipeline f\u00fcr kontinuierliche Lieferung (links) und der kontinuierlichen Lieferung von Dark (rechts). Bei Dark besteht die Lieferung aus 6 Schritten und einem Zyklus, w\u00e4hrend die traditionelle Version 35 Schritte und 3 Zyklen umfasst.<\/em><\/p>\n<p><\/p>\n<p>In Dark umfasst die Bereitstellung nur 6 Schritte und 1 Zyklus (Schritte, die mehrmals wiederholt werden), w\u00e4hrend moderne Continuous Delivery-Pipelines aus 35 Schritten und 3 Zyklen bestehen. In Dark werden Tests automatisch gestartet, und das geschieht, ohne dass Sie es bemerken; Abh\u00e4ngigkeiten werden automatisch installiert; alles, was mit Git oder Github zu tun hat, ist nicht mehr erforderlich; das Erstellen, Testen und Bereitstellen von Docker-Containern entf\u00e4llt; die Bereitstellung in Kubernetes entf\u00e4llt ebenfalls.<\/p>\n<p><\/p>\n<p>Selbst die verbleibenden Schritte in Dark sind einfacher geworden. Da die Feature-Flags mit einer einzigen Aktion gesteuert werden k\u00f6nnen, m\u00fcssen Sie den gesamten Bereitstellungs-Pipeline nicht erneut durchlaufen, um alten Code zu entfernen.<\/p>\n<p><\/p>\n<p>Wir haben die Bereitstellung von Code so weit wie m\u00f6glich vereinfacht, indem wir die Zeit und Risiken der kontinuierlichen Bereitstellung minimiert haben. Au\u00dferdem haben wir das Aktualisieren von Paketen, die Migration von Datenbanken, das Testen, das Version Management, die Installation von Abh\u00e4ngigkeiten, die Gleichheit zwischen Entwicklungs- und Produktionsumgebungen sowie schnelle und sichere Version-Upgrades des Programmiersprachen erheblich vereinfacht.<\/p>\n<p><\/p>\n<p>Ich beantworte Fragen dazu auf <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNews<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Um mehr \u00fcber Dark zu erfahren, lesen Sie die <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">Artikel \u00fcber Dark<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">folgen Sie uns auf Twitter<\/a><\/noindex> (oder <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">mich<\/a><\/noindex>) oder <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">Melden Sie sich f\u00fcr die Beta-Version an und erhalten Sie Benachrichtigungen \u00fcber die n\u00e4chsten Beitr\u00e4ge.<\/a><\/noindex>. Wenn Sie im September zur StrangeLoop fahren, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">besuchen Sie uns zur Er\u00f6ffnung.<\/a><\/noindex>.<\/p>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47 So deployt Dark Code in 50 ms | ProHoster","description":"Je schneller der Entwicklungsprozess, desto schneller w\u00e4chst das Technologieunternehmen. Leider arbeiten moderne Anwendungen gegen uns \u2013 unsere Systeme m\u00fcssen in Echtzeit aktualisiert werden, ohne dabei zu st\u00f6ren oder Ausfallzeiten zu verursachen. Das Deployment in solchen Systemen wird zu einer komplexen Aufgabe und erfordert anspruchsvolle Continuous Delivery-Pipelines, selbst in kleinen Teams.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/36721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}