Hvordan Postman Engineering håndterer en million samtidige forbindelser (Norsk)

Server Foundation-teamet hos Postman deler opprinnelseshistorien til Bifrost websocket gateway

(22. des 2020)

I Marvel Cinematic Universe er Bifrost navnet på regnbuebroen som tillater øyeblikkelig reise mellom rikene til guder og menneskeheten. På samme måte og like magisk lar Bifrost websocket-gateway Postman-klienter umiddelbart koble seg til Postman-tjenester.

Foto av Toni Reed Uplash

Som jeg tidligere har delt i (How Postman Engineering Does Microservices), er all programvarearkitektur et kontinuerlig arbeid i prosess. Å operere i den virkelige verden betyr av og til å revurdere gamle tenkemåter for å tilpasse seg nye forhold. Dette er den naturlige utviklingen av programvaredesign.

Her er historien om hvordan Postman-ingeniører utviklet Bifrost websocket gateway ved å kutte bort en tjeneste som ble for stor.

Utviklingsteam på Postbud

De fleste utviklingsteam på Postman jobber i tverrfunksjonelle grupper med fokus på et enkelt kjernedomen, for eksempel dokumentasjon eller versjonskontroll . Veiledet av prinsippene for domenedrevet design , utvikler hver gruppe interne mikrotjenester og Postmann-funksjoner for Postman-brukere.

Mens de fleste ingeniører jobber i tropper, noen jobber i funksjonelle team som bygger komponenter som deles over hele ingeniørorganisasjonen. Server Foundation-teamet er et eksempel på et funksjonelt team hos Postman. Disse ingeniørene lager verktøyene som brukes av andre tropper for å bygge, sende og observere sine egne funksjoner. Dette teamet er også der bosatt AWS og infrastruktureksperter holder til.

Server Foundation team er et eksempel på et funksjonelt team hos Postman som oppretter og administrerer ting som brukes over hele ingeniørorganisasjonen

De fleste mikrotjenester på Postman er løst koblet slik at de kan utvikle seg uavhengig av andre lag. Dessverre kan en tjeneste noen ganger vokse for stor og gi en bredde av tilsynelatende ikke-relaterte tjenester. Disse tjenestene gjør at teamet raskt kan iterere, men kan begynne å opptre mer som en oppblåst monolit, en stor ball med søle eller hva du enn vil kalle disse uhåndterlige skapningene.

Når dette skjer hos Postman, er det mange ingeniører. på tvers av forskjellige lag ender med å bidra til koden, og krever nøye koordinering på tvers av hvert team for hver oppdatering.

Den monolitiske synkroniseringstjenesten

En av Postman-tjenestene som ble for store til administreres effektivt kalles Sync. Det har den skremmende oppgaven å synkronisere all aktiviteten i Postman-klienten på din lokale maskin med Postman-serverne. Hver brukerhandling i Postman resulterer i en serie API-samtaler som håndteres via websocket-tilkoblinger, etter et publiser-abonnementsmønster , slik at informasjon flyter i sanntid mellom brukere og på tvers av teamene.

Dette er for eksempel hva som skjer når du logger på Postman og oppdaterer en samling:

  1. Du legger til en parameter i Postman-samlingen.
  2. Postbud fører en oversikt over oppdateringen i versjonskontroll som er lagret med profilen din.
  3. Postmann viser den siste informasjonen til seere på samlingen i sanntid.

Sync var opprinnelig ment for å håndtere databasetransaksjoner, som å oppdatere en samling. Denne gangen i fjor klarte Sync imidlertid også flere aktiviteter, som å varsle og vise den nyeste versjonen til alle som abonnerer på samlingen.

Synkroniser under trykk

Når du bygger en bil, er rammen den viktigste støttestrukturen som alle andre komponenter er festet. En liten sprekk i rammen kan ikke virke som en stor avtale. Det kan nok gå ubemerket å kjøre rundt i lave hastigheter. Ved høyere hastigheter er det imidlertid en ringeffekt som eskalerer feiljusteringer. Den tilsynelatende ubetydelige sprekken lar vibrasjoner forsterke seg i resten av kjøretøyet til det eskalerer til et flammende vrak.

“Ting som blir ubemerket i mindre systemer blir uunngåelig i mer komplekse systemer.”
Kunal Nagpal , ingeniørleder i Postman

Sync var en av de første tjenestene hos Postman, og dens monolitiske arkitektur tillot teamet å sende Postman-funksjoner raskt. Over tid begynte det å håndtere mer og mer ansvar. Den dag i dag har Sync-tjenesten fortsatt stor innflytelse over ingeniørorganisasjonen, og mange ingeniører føler smerten når Sync oppfører seg uventet eller det er planlagt nedetid.

I 2019 håndterte Sync både websocket-tilkoblinger og database transaksjoner. Med stadig mer samarbeid mellom våre 11 millioner brukere på den tiden, nærmet Postman seg en million samtidige tilkoblinger ved toppbelastning.

Som grunnlaget for praktisk talt alle mikrotjenester hos Postman vokste belastningen på Sync.

  • Kaskadesvikt på grunn av mottrykk: Hver distribusjon for å synkronisere resulterer i kobling av Postman-klienter som er tilkoblet over websockets. Når en million stikkontakter kobles til på nytt, blir serverressurser nedbrutt, noe som kan resultere i flere frakoblinger, og forårsake en forutsigbar, men uunngåelig bølge som kan ta 6 til 8 timer å gjenopprette.
  • Påvirker brukeropplevelsen: Selv om det ikke skjedde ofte, betydde bortlagte tilkoblinger en og annen forsinkelse i å se de siste oppdateringene og aktivitetene i et teamarbeidsområde.
  • Høyere vedlikeholdskostnader : Siden hver tropp stolte på Sync, måtte nesten alle ingeniører hos Postman lære hvordan håndtere droppede tilkoblinger, starte nye, og deretter avstemme eventuelle konflikter i dataene.

Server Foundation-teamet visste at de ønsket å øke effektiviteten til tilkoblinger til websocket, og også håndtere dem separat fra Synkroniseringstjeneste. Målet var klart, men veien for å komme dit var ikke.

“Dette er den naturlige utviklingen av programvaredesign. Mikrotjenester begynner å være kvikke, men de bygger seg opp og må brytes ned. Vi ønsket å skille sokkelhåndtering fra Sync fordi vi var i ferd med å introdusere mye mer funksjonalitet. ”
Yashish Dua , programvareingeniør i Postbud

noen interne tjenester blir for store og krever nøye koordinering på tvers av team

Dette er hva som skjedde

Trinn 1: Vi fikk organisatorisk buy-in

Den første utfordringen å takle var ikke teknisk. Dette var ikke Postmans første ambisiøse utrulling. Ingeniørvitenskap hadde lært av tidligere ting å begynne med folket. Fra oktober 2019 holdt Server Foundation-ingeniørene en serie anmeldelser dedikert til å formidle målet til den bredere organisasjonen og forklare fordelen for alle avhengige tjenester.

Hvis dette nye systemet lyktes, håndterte tappede forbindelser og håndtering av etterspillene ville ikke lenger være vanlig. Dette var et reelt incitament for de andre ingeniørteamene til å støtte og migrere til det nye systemet. Denne åpne kommunikasjonen og koordineringen ville fortsette gjennom hele prosjektet.

Trinn 2: Vi identifiserte de ukjente ukjente

Engineering visste hvilken retning de var på vei. Til tross for det tok de litt tid til å tenke gjennom alle scenariene og bedre forstå de underliggende begrepene. Ingeniørene planla utforskende økter med andre interessenter for å identifisere ukjente ukjente, de uforutsigbare forholdene som kan utgjøre en større risiko enn de kjente kjenner.

Mens Postman-organisasjonen er vant til å undersøke og planlegge, er denne delen av prosessen. tok mye lenger tid enn normalt på grunn av denne endringens kritiske natur. De undersøkte forskjellige alternativer, vurderte tilleggskrav og kom med en plan i løpet av to måneder.

Trinn 3: Vi bygde Bifrost websocket gateway

Bifrost er sammensatt av to deler:

  • Offentlig gateway : Gatewayen bruker Fastify web framework og Amazon AWS ElastiCache for Redis som en sentral meldingsmegler for å administrere alle nettilkoblingsforbindelser.
  • Privat API : API bruker også Fastify som et lite rammeverk for web for å proxy-trafikk til andre interne Postman-tjenester.
Bifrost består av to deler: en offentlig gateway og en privat API

Trinn 4: Vi testet den nye gatewayen

Når Postman-ingeniører er klare til å sende en funksjon, de forventes å teste funksjonen, sammen med eventuelle relaterte funksjoner. Siden nesten alle Postman-funksjoner er avhengige av nettkontakter, betydde dette at hver eneste funksjon måtte testes for denne utgivelsen. Videre var det ikke satt opp et rammeverk for automatisert testing av websockets ennå hos Postman, så all testingen ble fullført manuelt før Bifrost kunne brukes i produksjonen.

Dette var en vanskelig reise, men innen utgangen av januar 2020 hadde ingeniørarbeid et bevis på konseptet.

Trinn 5: Vi migrerte til det nye gateway

Alle Postman-klienter, for eksempel Electron-appen eller Internett, er avhengige av en første bootstrap-samtale til en annen kjernetjeneste som heter Godserver. Denne serveren bestemmer klientenes tilgang og konfigurasjon, og er hvordan engineering styrer trinnvise produktutrullinger. Fordi alt dette var forhåndsbestemt og kontrollert av Godserver, ville migrering til Bifrost-gatewayen ikke kreve en eneste oppdatering av Postman-klientkoden.

Server Foundation-teamet skisserte troppenes migreringstrinn, de nødvendige kodene endres og konfigureres å søke. I løpet av noen få uker begynte avhengige tjenester å gå over fra å stole på Sync til Bifrost-basert håndtering av deres websocket-tilkoblinger. Godserver omdirigerte mer og mer trafikk til den nye websocket-gatewayen for å se hvordan Bifrost håndterte lasten og reagerte på kantsaker.

“Det er som å bytte motor på et fly midt i flight. ”
Numaan Ashraf , ingeniørdirektør i Postman

Trinn 6: Vi skalerte tjenesten

Bifrost-gatewayen fungerte!

Men Postman hadde anskaffet ytterligere en million brukere mens porten var i planlegging og utvikling. Og de andre ingeniørteamene hadde ikke stoppet sitt eget arbeid i løpet av denne tiden. Nye samarbeidsfunksjoner, som versjonskontroll og rollebasert tilgangskontroll (RBAC) , støttet seg tungt på websockets for informasjon som skal oppdateres i sanntid. Det var en flom av kommende produktutgivelser som virkelig ville teste den nye gatewayen.

Bifrost var klar til å støtte de økte kravene og omfanget av håndtering av websocket.

  • Horisontal skalering : Mesteparten av tiden håndterer Postman-tjenester økt bruk ved å enten skalere til forekomster med høyere kapasitet eller ved å legge til flere beregningsforekomster i flåten. Så ingeniører hos Postman skalerer vanligvis up en tjeneste ved å øke størrelsen og beregningskraften til AWS EC2 tilfeller, for eksempel ved å bruke AWS Elastic Beanstalk. Men for Bifrost skalerer webhåndteringshåndtering ut ved å bruke mer maskiner. Den optimale effektiviteten oppnås når mindre forekomster brukes i stort antall. Denne typen hyper-horisontal skalering fungerer bra for Bifrost fordi klienter ikke krever høy nettverksgjennomstrømning, og begrenser hver maskin til færre tilkoblinger, begrenser eksplosjonsradiusen til feil.
  • Ny belastningsfaktor for CPU og minne : De fleste Postman-tjenester kan effektivt skaleres med en enkelt dimensjon av skaleringsmåling, som CPU, minne eller ventetid. For Bifrost blir tingene imidlertid litt mer nyanserte fordi både minne og CPU-bruk har ulik innvirkning på operasjoner på forskjellige gjennomstrømningsnivåer. For å gjøre rede for det, bruker Bifrost en tilpasset skaleringsmåling basert på belastningsfaktor. Lastfaktoren er en flerdimensjonal beregning som gir en tilpasset ikke-lineær skaleringsprofil.

La oss grave i arkitektoniske og teknologiske beslutninger tatt av Postman engineering.

Bifrost-arkitekturen og teknologibakken

Bifrost-systemet har to hovedkomponenter – en Gateway og en API. Denne todelte arkitekturen er den hemmelige sausen til systemets stabilitet og skalerbarhet.

Gatewayen fungerer som avslutningspunktet for alle tilkoblinger til websokkelen. Selv om kommersielle gateways er tilgjengelige for kjøp, var det viktig å bevare den eldre forretningslogikken akkumulert gjennom år med optimalisering. Postmann-ingeniører ønsket også å kontrollere fullstendig hvordan websockets håndteres, for eksempel hvis de ønsket å bruke protokollen. For Bifrost-gatewayen brukte de Amazon ElastiCache for Redis, slik at de kunne spørre om Redis-cachen ved hjelp av leser- og forfatternoder.Ved å dele trafikken i to noder for lese- og skriveoperasjoner, kan teamet optimalisere ytelsen.

“Bifrost er vår gateway for alle websocket-tilkoblinger. Det er en fullmektig for alle Postman-klienter, og ansvarlig for å håndtere sokkeloperasjoner på lavt nivå for interne Postman-tjenester. ”
Mudit Mehta , programvareingeniør hos Postman

Mest alle andre tjenester hos Postman bruker Sails som et sanntids MVC-rammeverk for Node.js . For Bifrost-gatewayen trengte ingeniørene imidlertid et performant backend-rammeverk som kunne håndtere høye volumer med hastighet og optimalisert minnebruk. Nok en gang ønsket de å gå dypere inn i sokkellaget, under de høyere abstraksjonene som Sails ga. Så de vendte seg til Fastify og gafflet socketio-adapter mellomvare for å optimalisere for eget bruk tilfeller.

Bifrost-gatewayen brukte AWS, Redis og Fastify for å håndtere websockets

I tillegg til gatewayen, er den andre komponenten i Bifrost den private API-en som proxiserer trafikk til andre Postman-tjenester. Den er basert på fleksible forretningsregler, og blir derfor evaluert kontinuerlig for hvordan og hvor du skal videresende innkommende trafikk.

“Enkle komponenter. Kompleks logikk. ”
Kunal Nagpal , ingeniørleder i Postman

For begge komponentene, ingeniørteamet bestemte seg for å rulle sine egne. Selv om gateway-delen av Bifrost ikke oppdateres ofte, har teamet full kontroll over hva som skjer i de dypere lagene av websocket-håndtering. API-delen av Bifrost er hjernen til operasjonen og konverterer innkommende sanntidsmeldinger til standard HTTP-samtaler. Den kan også oppdateres raskere som en uavhengig komponent fra Sync og Bifrost-gatewayen.

Husker du den hemmelige sausen? Ved å koble Bifrost inn i disse to diskrete systemene, kan begge deler optimalisere for sine egne mål.

Reisen er langt fra over

Som med alle saftige tekniske historier, er dette ikke slutten. . Jeg lar deg få noen klipper om hva som kommer videre for Postman engineering.

  • Bygg ekstra redundans : Redis-cache er en sentral meldingsmegler . Håndtering av websocket er fortsatt avhengig av et enkelt feilpunkt, så hva skjer hvis hurtigbufferen noen gang går ned?
  • Øk båndbredde og gjennomstrømning : Gatewayen er for øyeblikket i stand til å håndtere 10 ganger samtidig, men Postman-samfunnet vokser raskt og engineering bygger ut flere samarbeidsfunksjoner. Behovet for å håndtere mer websocket-trafikk kommer raskt opp.
  • Fortsett å bryte ned monolitten: The Synkroniseringstjeneste inneholder et virvar av andre tjenester flettet inn i kodebasen. Frakobling av sokkelhåndtering fra Sync løsner grepet om andre tjenester, slik at andre tjenester nå lettere kan skrelles av.

Dette var nok en titt bak kulissene på hvordan Postman engineering fungerer. Følg med for flere historier fra skyttergravene.

🙏🏼 Teknisk gjennomgang av Kunal Nagpal, Yashish Dua, Mudit Mehta og Shamasis Bhattacharya.

Opprinnelig publisert på https://blog.postman.com 22. desember 2020.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *