Hur Dark implementerar kod pÄ 50 ms

Hur Dark implementerar kod pÄ 50 ms

Ju snabbare utvecklingsprocessen Àr, desto snabbare utvecklas teknologi företaget.

TyvÀrr arbetar moderna applikationer emot oss - vÄra system mÄste uppdateras i realtid utan att störa eller orsaka driftstopp. Utplacering i sÄdana system blir en komplex uppgift och krÀver avancerade kontinuerliga leveranspipeline Àven i smÄ team.

Dessa pipeline har vanligtvis ett smalt anvÀndningsomrÄde, arbetar lÄngsamt och Àr inte pÄlitliga. Utvecklare mÄste först skapa dem manuellt och sedan hantera dem, och företag anstÀller ofta hela DevOps-team för detta.

Hastigheten pĂ„ dessa pipeline avgör hastigheten pĂ„ utvecklingen. För de bĂ€sta teamen tar utplacering 5–10 minuter, men i allmĂ€nhet tar allt mycket lĂ€ngre tid och en enda utplacering kan ta flera timmar.

I Dark tar det 50 ms. Femtio. Millisekunder.. Dark - Àr en omfattande lösning med ett programmeringssprÄk, en redigerare och infrastruktur, skapad specifikt för kontinuerlig leverans, och alla aspekter av Dark, inklusive sprÄket, Àr utformade för sÀker och omedelbar utplacering.

Varför Àr kontinuerliga leveranspipeline sÄ lÄngsamma?

Anta att vi har en Python-webbapplikation och vi redan har skapat en fantastisk och modern kontinuerlig leveranspipeline. För en utvecklare som arbetar med detta projekt dagligen kommer utplaceringen av en liten förÀndring att se ut ungefÀr sÄ hÀr:

Gör Àndringar

  • Skapa en ny gren i git
  • Gör Ă€ndringar bakom funktionsvĂ€xlaren
  • Modultestning för att kontrollera Ă€ndringarna med och utan funktionsvĂ€xlaren

Pull-begÀran

  • Gör commit av Ă€ndringarna
  • Skicka Ă€ndringarna till det externa arkivet pĂ„ github
  • Pull-begĂ€ran
  • CI-byggning körs automatiskt i bakgrunden
  • Kodgranskning
  • Ytterligare nĂ„gra granskningar om det behövs
  • Sammanfoga Ă€ndringarna med master-grenen i git.

CI körs pÄ master.

  • Installera frontend-beroenden via npm
  • Bygga och optimera HTML+CSS+JS-resurser
  • Köra modulĂ€ra och funktionella tester i frontend
  • Installera Python-beroenden frĂ„n PyPI
  • Köra modulĂ€ra och funktionella tester i backend
  • Integreringstestning i bĂ„da Ă€ndar
  • Skicka frontend-resurser till CDN
  • Bygga containern för Python-programmet
  • Skicka containern till registret
  • Uppdatera Kubernetes-manifestet

ErsÀtt gammal kod med ny

  • Kubernetes startar flera instanser av den nya containern
  • Kubernetes vĂ€ntar pĂ„ att instanserna ska bli aktiva
  • Kubernetes lĂ€gger till instanserna i HTTP-lastbalanseraren
  • Kubernetes vĂ€ntar pĂ„ att de gamla instanserna ska sluta anvĂ€ndas
  • Kubernetes stoppar de gamla instanserna
  • Kubernetes upprepar dessa operationer tills de nya instanserna har ersatt alla gamla

Aktivera den nya funktionens vÀxel

  • Den nya koden aktiveras endast för sig sjĂ€lv för att sĂ€kerstĂ€lla att allt fungerar
  • Den nya koden aktiveras för 10% av anvĂ€ndarna, operativa och affĂ€rsmĂ„tt övervakas
  • Den nya koden aktiveras för 50% av anvĂ€ndarna, operativa och affĂ€rsmĂ„tt övervakas
  • Den nya koden aktiveras för 100% av anvĂ€ndarna, operativa och affĂ€rsmĂ„tt övervakas
  • Slutligen upprepar du hela proceduren för att ta bort den gamla koden och vĂ€xeln

Processen beror pÄ verktygen, sprÄket och anvÀndningen av tjÀnstearkitekturer, men i stora drag ser den ut sÄ hÀr. Jag har inte nÀmnt utplaceringar med databasmigrationer eftersom det krÀver noggrant planerande, men nedan förklarar jag hur Dark hanterar detta.

Det finns mÄnga komponenter hÀr, och mÄnga av dem kan enkelt försena, krascha, orsaka temporÀr konkurrens eller kollapsa det fungerande systemet.

Och eftersom dessa pipeliner nÀstan alltid Àr skapade för ett specifikt fall Àr de svÄra att lita pÄ. MÄnga har dagar nÀr koden Àr omöjlig att distribuera, eftersom det finns problem i Dockerfile, ett av dussintals tjÀnster har kraschat eller den nödvÀndiga experten Àr pÄ semester.

VÀrre Àn sÄ Àr att mÄnga av dessa steg i sjÀlva verket inte gör nÄgot anvÀndbart. De var nödvÀndiga tidigare nÀr vi distribuerade koden direkt till anvÀndarna, men nu har vi omkopplare för den nya koden, vilket har separerat dessa processer. Resultatet Àr att steget dÀr koden distribueras (den gamla ersÀtts av den nya) nu har blivit en onödig risk.

SjÀlvklart Àr detta en mycket genomtÀnkt pipeline. Teamet som skapade den har inte snÄlat med tid och pengar för snabb distribution. Vanligtvis Àr distributionspipelines mycket lÄngsammare och mindre pÄlitliga.

Implementering av kontinuerlig leverans i Dark

Den kontinuerliga leveransen Àr sÄ viktig för Dark att vi frÄn början satte ett mÄl pÄ mindre Àn en sekund. Vi gick igenom alla steg i pipelinen för att ta bort överflödiga moment, och finslipade det övriga. SÄ hÀr tog vi bort steg.

Jessie Frazelle (Jessie Frazelle) myntade det nya ordet deployless (utplacering utan behov av deployment) pÄ konferensen Future of Software Development i Reykjavik.

Vi bestÀmde oss genast för att Dark skulle baseras pÄ konceptet «deployless» (tack till Jessie Frazelle för neologismen). Deployless innebÀr att all kod omedelbart deployeras och Àr redo för produktion. SjÀlvklart hoppar vi inte över defekt eller ofullstÀndig kod (sÀkerhetsprinciper kommer jag att beskriva nedan).

Vid presentationen av Dark blev vi ofta frÄgade hur vi lyckats snabba upp deployment. En mÀrklig frÄga. Folk kanske tror att vi har kommit pÄ nÄgon superteknologi som jÀmför kod, kompilerar den, paketerar i en container, startar en virtuell maskin, lanserar containern kall och allt sÄnt dÀr pÄ 50 ms. Det Àr osannolikt. Men vi har skapat en speciell deployment-motor som inte behöver allt det dÀr.

Dark startar tolkar i molnet. Anta att du skriver kod i en funktion eller en HTTP- eller hĂ€ndelsehanterare. Vi skickar diffen till det abstrakta syntaxtrĂ€det (implementeringen av koden som vĂ„r editor och servrar internt anvĂ€nder) till vĂ„ra servrar och kör sedan den koden nĂ€r förfrĂ„gningar kommer in. SĂ„ deployment ser ut som en enkel post i databasen — ögonblicklig och elementĂ€r. Deployment sker sĂ„ snabbt eftersom det inkluderar det mest grundlĂ€ggande.

I framtiden planerar vi att göra Dark till en infrastruktur kompilator som kommer att skapa och köra den perfekta infrastrukturen för hög prestation och tillförlitlighet av applikationer. Omiddelbar deployment kommer sjÀlvklart att vara kvar.

SĂ€ker deployment

Strukturerad editor

Koden i Dark skrivs i Dark-editorn. Den strukturerade editorn tillÄter inte syntaktiska fel. I praktiken har Dark inte ens en parser. Medan du skriver text arbetar vi direkt med det abstrakta syntaxtrÀdet (AST), precis som Paredit, Sketch-n-Sketch, Tofu, Prune och MPS.

All kod som Àr ofullstÀndig i Dark har en giltig körsemantik, ungefÀr som typed holes i Hazel. Till exempel, om du Àndrar funktionsanropet, sparar vi den gamla funktionen tills den nya Àr anvÀndbar.

Varje program i Dark har sin egen mening, sÄ ofullstÀndig kod stör inte att fÀrdig kod fungerar.

RedigeringslÀgen

Du skriver kod i Dark i tvÄ situationer. Första: du skriver ny kod och Àr den enda anvÀndaren. Till exempel, den Àr i REPL, och andra anvÀndare fÄr aldrig tillgÄng till den, eller det Àr en ny HTTP-rutt som du inte refererar till nÄgonstans. HÀr kan du arbeta utan nÄgra försiktighetsÄtgÀrder, och för tillfÀllet fungerar du ungefÀr sÄ i utvecklingsmiljön.

Den andra situationen: koden anvÀnds redan. Om trafik passerar genom koden (funktioner, hÀndelsehanterare, databaser, etc.) mÄste du vara försiktig. För detta lÄser vi all anvÀnd kod och krÀver att mer strukturerade verktyg anvÀnds för att redigera den. Jag kommer att berÀtta om strukturella verktyg nedan: funktionsswitchar för HTTP- och hÀndelsehanterare, en kraftfull migrationsplattform för databaser och en ny metod för versionshantering för funktioner och typer.

Funktionsswitchar

Ett sÀtt att ta bort onödig komplexitet i Dark Àr att lösa flera problem med en lösning. Funktionsswitchar utför mÄnga olika uppgifter: ersÀttning av lokal utvecklingsmiljö, git-grenar, koddistribution och naturligtvis den traditionella lÄngsamma och kontrollerade lanseringen av ny kod.

Skapandet och distributionen av en funktionsswitch sker i vÄr editor i en operation. Den skapar ett tomt utrymme för ny kod och tillhandahÄller kontroller för Ätkomst till bÄde gammal och ny kod, samt knappar och kommandon för gradvis övergÄng till ny kod eller dess uteslutning.

Funktionsswitchar Ă€r inbyggda i Dark-sprĂ„ket, och Ă€ven ofullstĂ€ndiga switchar gör sitt jobb — om villkoret i switchen inte uppfylls kommer den gamla blockerade koden att köras.

Utvecklingsmiljö

Funktionerna för switchar ersÀtter den lokala utvecklingsmiljön. Idag har team svÄrt att se till att alla anvÀnder samma versioner av verktyg och bibliotek (kodformatterare, linters, paketförvaltare, kompilatorer, preprocessorer, testverktyg, osv.). Med Dark behöver man inte installera beroenden lokalt, hantera en lokal Docker-installation eller vidta andra ÄtgÀrder för att sÀkerstÀlla ensartighet mellan utvecklingsmiljön och produktionen. Med tanke pÄ att sÄdan enhetlighet ÀndÄ Àr omöjlig, kommer vi inte ens att lÄtsas att vi strÀvar efter den.

IstÀllet för att skapa en klonad lokal miljö skapar switcharna i Dark en ny sandlÄda i produktionen som ersÀtter utvecklingsmiljön. I framtiden planerar vi ocksÄ att skapa sandlÄdor för andra delar av applikationen (till exempel omedelbara kloner av databasen), Àven om det just nu inte verkar sÄ viktigt.

Grenar och distributioner

Nu finns det flera sĂ€tt att införa ny kod i systemen: git-grenar, distributionssteg och funktionsswitchar. De löser ett problem i olika delar av arbetsflödet: git – i stegen före distribution, distribution – nĂ€r man gĂ„r frĂ„n gammal kod till ny, och funktionsswitchar – för kontrollerad utrullning av ny kod.

Det mest effektiva sĂ€ttet Ă€r funktionsswitchar (som dessutom Ă€r det enklaste att förstĂ„ och anvĂ€nda). Med dem kan man helt hoppa över de andra tvĂ„ metoderna. SĂ€rskilt anvĂ€ndbart Ă€r att ta bort distribution – om vi Ă€ndĂ„ anvĂ€nder funktionsswitchar för att aktivera kod, sĂ„ skapar steget att flytta servrar till ny kod bara onödiga risker.

Git Àr svÄrt att anvÀnda, sÀrskilt för nybörjare, vilket begrÀnsar det mycket, men Ä andra sidan har det bekvÀma grenar. Vi har slÀtat ut mÄnga av git:s nackdelar. Dark redigeras i realtid och erbjuder samarbetsmöjligheter i stil med Google Docs, sÄ att man inte behöver skicka kod och kan göra ombasering och sammanslagningar mindre ofta.

Funktionsomkopplare ligger till grund för sÀker distribution. Tillsammans med omedelbara distributioner möjliggör de snabb testning av koncept i smÄ bitar med lÄg risk istÀllet för att göra en stor Àndring som kan krascha systemet.

Versionshantering

För att Àndra funktioner och typer anvÀnder vi versionering. Om du vill Àndra en funktion skapar Dark en ny version av den. Sedan kan du anropa denna version med hjÀlp av en omkopplare i HTTP- eller hÀndelsehanteraren. (Om det Àr en funktion djupt inne i anropsgrafen, skapas en ny version av varje funktion pÄ vÀgen. Det kan verka överdrivet, men funktioner störs inte om du inte anvÀnder dem, sÄ du mÀrker det knappt.)

Av samma skÀl versionerar vi typer. Vi har pratat om vÄrt typ-system i detalj. i det föregÄende inlÀgget.

Tack vare versioneringen av funktioner och typer kan du göra förÀndringar i applikationen stegvis. Du kan kontrollera att varje enskild hanterare fungerar med den nya versionen, du behöver inte göra alla Àndringar i applikationerna pÄ en gÄng (men vi har verktyg för att snabbt göra det om du vill).

Detta Àr mycket sÀkrare Àn att distribuera allt pÄ en gÄng, vilket Àr vad som hÀnder nu.

Nya versioner av paket och standardbiblioteket

NÀr du uppdaterar ett paket i Dark, ersÀtter vi inte omedelbart anvÀndningen av varje funktion eller typ i hela kodbasen. Det Àr osÀkert. Koden fortsÀtter att anvÀnda den version den har anvÀnt, och du uppdaterar anvÀndningen av funktionerna och typerna till den nya versionen för varje enskilt fall med hjÀlp av omkopplare.

Hur Dark implementerar kod pÄ 50 ms
SkÀrmdump av en del av den automatiska processen i Dark, som visar tvÄ versioner av funktionen Dict::get. Dict::get_v0 returnerade typen Any (som vi överger), medan Dict::get_v1 returnerar typen Option.

Vi tillhandahÄller ofta en ny funktion i standardbiblioteket och utesluter gamla versioner. AnvÀndare med gamla versioner i koden fÄr fortfarande tillgÄng till dem, men nya anvÀndare kommer inte att kunna fÄ dem. Vi planerar att tillhandahÄlla verktyg för att enkelt föra anvÀndare frÄn gamla versioner till nya med ett steg, Äterigen med hjÀlp av funktionsomkopplare.

Dark erbjuder ocksÄ en unik möjlighet: eftersom vi kör din arbetskod kan vi sjÀlva testa nya versioner, jÀmföra utdata för nya och gamla begÀrningar och informera dig om förÀndringar. Resultatet Àr att uppdateringar av paket, som ofta görs i blindo (eller krÀver noggranna tester för sÀkerhet), innebÀr mycket mindre risk och kan ske automatiskt.

Nya versioner av Dark

ÖvergĂ„ngen frĂ„n Python 2 till Python 3 strĂ€ckte sig över ett decennium och Ă€r fortfarande en utmaning. Eftersom vi bygger Dark för kontinuerlig leverans mĂ„ste vi ta hĂ€nsyn till dessa sprĂ„kliga förĂ€ndringar.

NÀr vi gör smÄ Àndringar i sprÄket skapar vi en ny version av Dark. Den gamla koden förblir i den tidigare versionen av Dark, medan den nya koden anvÀnds i den nya versionen. För att vÀxla till den nya versionen av Dark kan man anvÀnda switchar eller funktionsversioner.

Detta Àr sÀrskilt anvÀndbart med tanke pÄ att Dark har kommit nyligen. MÄnga förÀndringar i sprÄket eller biblioteket kan visa sig vara misslyckade. Gradvis versionering av sprÄket gör att vi kan göra smÄ uppdateringar, vilket innebÀr att vi kan ta vÄr tid och skjuta upp mÄnga beslut om sprÄket tills vi har fler anvÀndare, vilket ocksÄ ger oss mer information.

Databasmigrationer

För sÀker databasmigration finns det en standardformel:

  • Omarbeta koden för att stödja nya och gamla format
  • Omvandla alla data till det nya formatet
  • Ta bort gammal Ă„tkomst till data

Som ett resultat fördröjs databasmigrationen och krÀver mycket resurser. Gamla scheman samlas pÄ hög, eftersom Àven enkla uppgifter som att Àndra namnet pÄ en tabell eller kolumn inte Àr vÀrda den insats som krÀvs.

Dark har en effektiv plattform för databasmigration, som (vi hoppas) kommer att förenkla processen sÄ mycket att du slutar att vara rÀdd för den. Alla datalager i Dark (lagringssÀtt för nyckel-vÀrde-par eller permanenta hash-tabeller) har en typ. För att flytta ett datalager tilldelar du helt enkelt en ny typ och en rollback- och redo- funktion för att omvandla vÀrden mellan de tvÄ typerna.

Åtkomst till datalager i Dark sker via versionshanterade variabelnamn. Till exempel kommer datalager Users ursprungligen att kallas Users-v0. NĂ€r en ny version med en annan typ skapas, Ă€ndras namnet till Users-v1. Om data sparas via Users-v0 och du fĂ„r Ă„tkomst till dem via Users-v1, tillĂ€mpas funktionerna för Ă„terstĂ€llning. Om data sparas via Users-v1 och du fĂ„r Ă„tkomst till dem via Users-v0, tillĂ€mpas funktionen för bakĂ„tkompatibilitet.

Hur Dark implementerar kod pÄ 50 ms
SkÀrmen för databas-migrering med namnen pÄ fÀlten frÄn den gamla databasen, uttrycken för ÄterstÀllning och bakÄtkompatibilitet samt instruktioner för att aktivera migreringen.

AnvÀnd funktionsvÀxlar för att dirigera anrop till Users-v0 i version Users-v1. Detta kan göras en HTTP-hanterare i taget för att minska riskerna, och vÀxlarna fungerar för enskilda anvÀndare sÄ att du kan kontrollera att allt fungerar som förvÀntat. NÀr det inte finns nÄgra anvÀndare kvar i Users-v0 kommer Dark att konvertera alla ÄterstÄende data i bakgrunden frÄn det gamla formatet till det nya. Du kommer knappt att mÀrka det.

Testning

Dark Àr en funktionell programmeringssprÄk med statisk typning och oförÀnderliga vÀrden, vilket gör testytan betydligt mindre jÀmfört med objektorienterade sprÄk med dynamisk typning. Men tester mÄste fortfarande genomföras.
I Dark kör redigeraren automatiskt enhetstester i bakgrunden för redigerad kod och kör dessa tester som standard för alla funktionsvÀxlar. I framtiden vill vi anvÀnda statiska typer för att automatiskt utföra fuzzing av koden för att hitta buggar.

Dessutom kör Dark din infrastruktur i produktion, vilket öppnar upp för nya möjligheter. Vi sparar automatiskt HTTP-anrop i Dark-infrastrukturen (för nÀrvarande sparar vi alla anrop, men vi planerar att gÄ över till sampling). Vi testar ny kod med dem och kör enhetstester, och om du vill kan du enkelt konvertera intressanta anrop till enhetstester.

Vad vi har tagit bort

Eftersom vi inte har nÄgon distribution, men har funktionsvÀxlar, blir cirka 60% av distributionspipeline överflödig. Vi behöver ingen git-grenar eller pull-förfrÄgningar, bygga backend-resurser och containrar, skicka resurser och containrar till register eller distribuera steg i Kubernetes.

Hur Dark implementerar kod pÄ 50 ms
JÀmförelse mellan en standard pipelinemodell för kontinuerlig leverans (vÀnster) och Dark leverans (höger). I Dark leverans bestÄr av 6 steg och en cykel, medan den traditionella versionen omfattar 35 steg och 3 cykler.

I Dark bestÄr distributionen av endast 6 steg och 1 cykel (stegen som upprepas flera gÄnger), medan den moderna pipelinemodellen för kontinuerlig leverans bestÄr av 35 steg och 3 cykler. I Dark körs tester automatiskt, och det ser du inte ens; beroenden installeras automatiskt; allt som rör git eller Github behövs inte lÀngre; bygga, testa och skicka Docker-containrar behövs inte; distribution till Kubernetes behövs inte lÀngre.

Till och med de ÄterstÄende stegen i Dark har blivit enklare. Eftersom funktionerna kan hanteras med ett enda kommando behöver man inte gÄ igenom hela distributionspipeline igen för att ta bort gammal kod.

Vi har förenklat kodleveransen sÄ mycket som möjligt, minskat tid och risker i den kontinuerliga leveransen. Dessutom har vi betydligt förenklat uppdatering av paket, databas-migreringar, testning, versionhantering, installation av beroenden, lika villkor mellan utvecklings- och produktionsmiljöer samt snabba och sÀkra uppgraderingar av sprÄkversioner.

Jag svarar pÄ frÄgor om detta pÄ HackerNews.

För att fÄ veta mer om Dark-enheten, lÀs artikeln om Dark, följ oss pÄ Twitter (eller pÄ mig) eller anmÀla dig till beta-versionen och fÄ meddelanden om kommande inlÀgg. Om du Äker till StrangeLoop i september, kom till vÄr lansering.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster