Hvordan Postman Engineering håndterer en million samtidige forbindelser

Server Foundation-teamet hos Postman deler oprindelseshistorien om Bifrost websocket gateway

(22. december 2020)

I Marvel Cinematic Universe er Bifrost navnet på regnbue broen, der tillader øjeblikkelig rejse mellem verdener af guder og menneskehed. På samme måde og lige så magisk tillader vores Bifrost websocket-gateway Postman-klienter øjeblikkeligt at oprette forbindelse til Postman-tjenester.

Foto af Toni Reed Uplash

Som jeg tidligere har delt i (How Postman Engineering Does Microservices), er alle softwarearkitekturer et kontinuerligt arbejde i gang. At operere i den virkelige verden betyder lejlighedsvis at revurdere gamle måder at tænke på for at tilpasse sig nye forhold. Det er den naturlige udvikling af softwaredesign.

Her er historien om, hvordan Postman-ingeniører udviklede Bifrost websocket gateway ved at chippe væk til en tjeneste, der blev for stor.

Udviklingsteam på Postbud

De fleste udviklingsteams hos Postman arbejder i tværfunktionelle hold fokuseret på et enkelt kernedomæne, såsom dokumentation eller versionskontrol . Vejledt af principperne for domænestyret design udvikler hvert hold interne mikrotjenester og Postman-funktioner til Postman-brugere.

Mens de fleste ingeniører arbejder i hold, nogle arbejder i funktionelle hold, der bygger komponenter, der deles på tværs af hele ingeniørorganisationen. Server Foundation-teamet er et eksempel på et funktionelt team hos Postman. Disse ingeniører opretter de værktøjer, der bruges af andre hold til at bygge, sende og observere deres egne funktioner. Dette hold er også, hvor AWS og infrastruktureksperter er bosiddende.

Server Foundation team er et eksempel på et funktionelt team hos Postman, der opretter og administrerer ting, der bruges på tværs af hele ingeniørorganisationen

De fleste mikrotjenester på Postman er løst koblet, så de kan udvikle sig uafhængigt af andre hold. Desværre kan en tjeneste undertiden vokse for stor og levere en bredde af tilsyneladende ikke-relaterede tjenester. Disse tjenester giver holdet mulighed for hurtigt at gentage, men kan begynde at virke mere som en oppustet monolit, en stor mudderkugle eller hvad du end vil kalde disse uhåndterlige væsner.

Når dette sker hos Postman, er der mange ingeniører på tværs af forskellige hold ender med at bidrage til koden, hvilket kræver omhyggelig koordinering på tværs af hvert hold til hver opdatering.

Den monolitiske synkroniseringstjeneste

En af Postman-tjenesterne, der blev for store til administreres effektivt kaldes Sync. Det har den skræmmende opgave at synkronisere al aktiviteten i Postman-klienten på din lokale maskine med Postman-serverne. Hver brugerhandling i Postman resulterer i en række API-opkald, der håndteres via websocket-forbindelser, efter et publish-subscribe-mønster , så information flyder i realtid mellem brugere og på tværs af hold.

Dette er f.eks. hvad der sker, når du logger ind på Postman og opdaterer en samling:

  1. Du tilføjer en parameter til Postman-samlingen.
  2. Postbud fører en oversigt over opdateringen i versionskontrol, der er gemt med din profil.
  3. Postbud viser de nyeste oplysninger til seerne i samlingen i realtid.

Sync var oprindeligt beregnet til at håndtere databasetransaktioner som at opdatere en samling. Denne gang sidste år administrerede Sync imidlertid også yderligere aktiviteter, såsom at underrette og vise den nyeste version til alle, der abonnerer på samlingen.

Synkroniser under tryk

Når du bygger en bil, er rammen den vigtigste understøttende struktur, som alle andre komponenter er fastgjort. En lille revne i rammen virker måske ikke som en big deal. Det kunne sandsynligvis gå ubemærket hen ved at køre rundt ved lave hastigheder. Ved højere hastigheder er der imidlertid en krusningseffekt, der eskalerer fejljusteringer. Den tilsyneladende ubetydelige revne tillader vibrationer at forstærkes i resten af ​​køretøjet, indtil det eskalerer til et flammende vrag.

“Ting der går ubemærket hen i mindre systemer bliver uundgåelig i mere komplekse systemer.”
Kunal Nagpal , ingeniørchef hos Postman

Sync var en af ​​de tidligste tjenester hos Postman, og dens monolitiske arkitektur tillod holdet at sende Postmans funktioner hurtigt. Over tid begyndte det at håndtere flere og flere ansvarsområder. Den dag i dag har Sync-tjenesten stadig stor indflydelse på tværs af ingeniørorganisationen, og mange ingeniører føler smerten, når Sync opfører sig uventet, eller der er planlagt nedetid.

I 2019 håndterede Sync både websocket-forbindelser og database transaktioner. Da mere og mere samarbejde skete blandt vores 11 millioner brugere på det tidspunkt, nærmede sig Postman en million samtidige forbindelser ved maksimal belastning.

Som grundlaget for stort set enhver mikroservice hos Postman voksede belastningen på Sync.

  • Kaskadefejl på grund af modtryk: Hver implementering til synkronisering resulterer i afbrydelse af tilsluttede Postman-klienter over websockets. Når en million sockets genopretter forbindelse, nedbrydes serverressourcer, hvilket kan resultere i flere afbrydelser, hvilket medfører en forudsigelig, men uundgåelig bølge, der kan tage 6 til 8 timer at komme sig.
  • Påvirker brugeroplevelse: Selvom det ikke skete ofte, betød forbindelser, der blev droppet, lejlighedsvis forsinkelse med at se de seneste opdateringer og aktiviteter i et Team Workspace.
  • Højere vedligeholdelsesomkostninger : Da hvert hold stod på Sync, var næsten enhver ingeniør hos Postman nødt til at lære at håndter droppede forbindelser, start nye og afstem derefter eventuelle konflikter i dataene.

Server Foundation-teamet vidste, at de ville øge effektiviteten af ​​websocket-forbindelser og også håndtere dem separat fra Synkroniseringstjeneste. Destinationen var klar, men vejen derhen var ikke.

“Dette er den naturlige udvikling af software design. Microservices starter fede, men de opbygges og skal nedbrydes. Vi ønskede at adskille sokkelhåndtering fra Sync, fordi vi var ved at introducere meget mere funktionalitet. ”
Yashish Dua , softwareingeniør hos Postbud

nogle interne tjenester vokser for store og kræver omhyggelig koordinering på tværs af hold

Her er hvad der skete

Trin 1: Vi fik organisatorisk buy-in

Den første udfordring at tackle var ikke teknisk. Dette var ikke Postmans første ambitiøse udrulning. Ingeniørvidenskab havde lært af tidligere ting at begynde med folket. Fra oktober 2019 afholdt Server Foundation-ingeniører en række anmeldelser dedikeret til at kommunikere målet til den bredere organisation og forklare fordelen for alle afhængige tjenester.

Hvis dette nye system lykkedes, håndterede droppede forbindelser. og håndtering af eftervirkningerne ville ikke længere være almindeligt. Dette var et reelt incitament for de andre ingeniørhold til at støtte og migrere til det nye system. Denne åbne kommunikation og koordinering ville fortsætte gennem hele projektets varighed.

Trin 2: Vi identificerede de ukendte ukendte

Ingeniørvidenskab vidste den retning, de var i. På trods af det tog de noget tid til at tænke igennem alle scenarierne og bedre forstå de underliggende begreber. Ingeniørerne planlagde udforskningssessioner med andre interessenter for at identificere ukendte ukendte, de uforudsigelige forhold, der kan udgøre en større risiko end de kendte kendskab.

Mens Postman-organisationen er vant til at undersøge og planlægge, er denne del af processen tog meget længere tid end normalt på grund af denne ændrings kritiske karakter. De undersøgte forskellige muligheder, overvejede hjælpekrav og kom med en plan i løbet af to måneder.

Trin 3: Vi byggede Bifrost websocket gateway

Bifrost er sammensat af to dele:

  • Offentlig gateway : Gatewayen bruger Fastify web framework og Amazon AWS ElastiCache for Redis som en central meddelelsesmægler til at administrere alle websocket-forbindelser.
  • Privat API : API bruger også Fastify som en lav overhead-webramme til proxy-trafik til andre interne Postman-tjenester.
Bifrost består af to dele: en offentlig gateway og en privat API

Trin 4: Vi testede den nye gateway

Når Postman-ingeniører er klar til at sende en funktion, de forventes at teste funktionen sammen med alle relaterede funktioner. Da næsten hver Postman-funktion er afhængig af websockets, betyder det, at hver eneste funktion skulle testes for denne udgivelse. Desuden var der ikke oprettet en ramme for automatiseret test af websockets endnu hos Postman, så al test blev afsluttet manuelt inden Bifrost kunne bruges i produktionen.

Dette var en besværlig rejse, men inden udgangen af ​​januar 2020 havde ingeniørarbejde et fungerende bevis på konceptet.

Trin 5: Vi migrerede til det nye gateway

Alle Postman-klienter, såsom Electron-appen eller Internettet, er afhængige af et indledende bootstrap-opkald til en anden kernetjeneste ved navn Godserver. Denne server bestemmer klienternes adgang og konfiguration, og det er sådan, hvordan teknik styrer inkrementelle produktudrulninger. Fordi alt dette var forudbestemt og kontrolleret af Godserver, ville migrering til Bifrost-gatewayen ikke kræve en enkelt Postman-klientkodeopdatering.

Server Foundation-teamet skitserede holdets migreringstrin, de krævede kodeændringer og konfiguration at ansøge. I løbet af et par uger begyndte afhængige tjenester at overgå fra at stole på Sync til Bifrost-baseret håndtering af deres websocket-forbindelser. Godserver omdirigerede mere og mere trafik til den nye websocket-gateway for at se, hvordan Bifrost håndterede belastningen og reagerede på kanttilfælde.

“Det er som at skifte motor på et fly midt i flight. ”
Numaan Ashraf , direktør for ingeniør hos Postbud

Trin 6: Vi skalerede tjenesten

Bifrost-gatewayen fungerede!

Men Postman havde erhvervet endnu en million brugere, mens gatewayen var i planlægning og udvikling. Og de andre ingeniørhold havde ikke sat deres eget arbejde på pause i løbet af denne periode. Nye samarbejdsfunktioner, som versionskontrol og rollebaseret adgangskontrol (RBAC) , påberåbte sig meget på websockets for information, der skal opdateres i realtid. Der var en strøm af kommende produktudgivelser, der virkelig ville teste den nye gateway.

Bifrost var klar til at understøtte de øgede krav og skaleringshåndtering af websocket.

  • Vandret skalering : Postman-tjenester håndterer det meste af tiden øget brug ved enten at skalere til forekomster med højere kapacitet eller ved at tilføje flere beregningsinstanser til flåden. Så ingeniører hos Postman skalerer normalt op en tjeneste ved at øge størrelsen og computerkraften på AWS EC2 for eksempel ved at bruge AWS Elastic Beanstalk. Men for Bifrost skalerer websocket-håndtering out ved hjælp af mere maskiner. Dens optimale effektivitet opnås, når forekomster af mindre størrelse bruges i stort antal. Denne type hyperhorisontal skalering fungerer godt for Bifrost, fordi klienter ikke kræver høj netværksgennemstrømning, og begrænsning af hver maskine til færre forbindelser begrænser eksplosionsradiusen af ​​fejl.
  • Ny belastningsfaktor for CPU og hukommelse : De fleste Postman-tjenester kan effektivt skaleres med en enkelt dimension af skaleringsmåling, såsom CPU, hukommelse eller latenstid. For Bifrost bliver tingene dog lidt mere nuancerede, fordi både hukommelse og CPU-brug har forskellige virkninger på operationer på forskellige gennemstrømningsniveauer. For at tage højde for det bruger Bifrost en brugerdefineret skaleringsmåling baseret på belastningsfaktor. Belastningsfaktoren er en flerdimensionel beregning, der giver en tilpasset ikke-lineær skaleringsprofil.

Lad os grave i de arkitektoniske og teknologiske beslutninger, der er truffet af Postman engineering.

Bifrost-arkitekturen og tech-stacken

Bifrost-systemet har to hovedkomponenter – en gateway og en API. Denne todelte arkitektur er den hemmelige sauce til systemets stabilitet og skalerbarhed.

Gatewayen fungerer som afslutningspunktet for alle websocket-forbindelser. Selvom kommercielle gateways er tilgængelige for køb, var det vigtigt at bevare den ældre forretningslogik, der var akkumuleret gennem mange års optimering. Postbudsingeniører ønskede også fuldt ud at kontrollere, hvordan websockets håndteres, for eksempel hvis de ville bruge protokolhåndtrykket. Til Bifrost-gatewayen brugte de Amazon ElastiCache til Redis, så de kunne søge på Redis-cachen ved hjælp af læser- og forfatternoder.Ved at opdele trafikken i to noder til læse- og skriveoperationer kan teamet optimere ydeevnen.

“Bifrost er vores gateway for alle websocket-forbindelser. Det er en proxy for alle Postman-klienter og ansvarlig for håndtering af socket-operationer på lavt niveau til interne Postman-tjenester. ”
Mudit Mehta , softwareingeniør hos Postman

De fleste andre tjenester hos Postman bruger Sails som en realtids MVC-ramme til Node.js . Til Bifrost-gatewayen havde ingeniørerne imidlertid brug for en performant backend-ramme, der var i stand til at håndtere store mængder med hastighed og optimeret hukommelsesforbrug. Endnu en gang ønskede de at gå dybere ind i sokkellaget under de abstraktioner på højere niveau, der leveres af Sails. Så de vendte sig til Fastify og gaffelede socketio-adapter middleware for at optimere til eget brug sager.

Bifrost-gatewayen brugte AWS, Redis og Fastify til at håndtere websockets

Ud over gatewayen er den anden komponent i Bifrost den private API, der proxiserer trafik til andre Postman-tjenester. Det er baseret på fleksible forretningsregler og evalueres så konstant for, hvordan og hvor man skal videresende indgående trafik.

“Enkle komponenter. Kompleks logik. ”
Kunal Nagpal , ingeniørchef hos Postman

For begge komponenter, ingeniørholdet besluttede at rulle deres egne. Selvom gateway-delen af ​​Bifrost ikke opdateres hyppigt, har holdet fuld kontrol over, hvad der sker i de dybere lag af websocket-håndtering. API-delen af ​​Bifrost er hjernen i operationen og konverterer indgående realtidsbeskeder til standard HTTP-opkald. Det kan også opdateres hurtigere som en uafhængig komponent fra Sync og Bifrost-gatewayen.

Kan du huske den hemmelige sauce? Afkobling af Bifrost til disse to adskilte systemer giver begge dele mulighed for at optimere til deres egne mål.

Rejsen er langt fra forbi

Som med alle saftige tekniske historier er dette ikke slutningen . Jeg efterlader dig med et par klipper om, hvad der kommer næste gang for Postman engineering.

  • Byg ekstra redundans : Redis-cachen er en central meddelelsesmægler . Håndtering af websocket er stadig afhængig af et enkelt fejlpunkt, så hvad sker der, hvis cachen nogensinde går ned?
  • Forøg båndbredde og kapacitet : Gatewayen er i øjeblikket i stand til at håndtere 10 gange samtidighed, men Postman-samfundet vokser hurtigt, og ingeniørarbejde bygger flere samarbejdsfunktioner. Behovet for at håndtere mere websocket-trafik kommer hurtigt op.
  • Fortsæt med at nedbryde monolitten: Synkroniseringstjeneste indeholder et virvar af andre tjenester, der er flettet ind i dens codebase. Afkobling af sokkelhåndtering fra Sync løsner grebet om andre tjenester, så andre tjenester nu lettere kan skrælles af.

Dette var endnu et kig bag kulisserne på, hvordan Postman engineering fungerer. Hold øje med flere historier fra skyttegravene.

🙏🏼 Teknisk gennemgang af Kunal Nagpal, Yashish Dua, Mudit Mehta og Shamasis Bhattacharya.

Oprindeligt udgivet på https://blog.postman.com den 22. december 2020.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *