Hur Postman Engineering hanterar en miljon samtidiga anslutningar

Publicerad

Server Foundation-teamet på Postman delar ursprungshistorien om Bifrost websocket-gateway

(22 dec 2020)

I Marvel Cinematic Universe är Bifrost namnet på regnbågsbroen som möjliggör omedelbar resa mellan världarna i gudar och mänsklighet. På samma sätt och lika magiskt låter vår Bifrost-nätverksgateway Postman-klienter direkt ansluta till Postman-tjänster.

Foto av Toni Reed Unsplash

Som jag tidigare har delat i (How Postman Engineering Does Microservices) är all programvaruarkitektur ett kontinuerligt arbete i processen. Att arbeta i den verkliga världen betyder ibland att omvärdera gamla sätt att tänka för att anpassa sig till nya omständigheter. Det här är den naturliga utvecklingen av programvarudesign.

Här är historien om hur Postman-ingenjörer utvecklade Bifrost-nätverksporten genom att skära bort en tjänst som blev för stor.

Utvecklingsteam på Brevbäraren

De flesta utvecklingsteam på Postboken arbetar i tvärfunktionella grupper med fokus på en enda kärndomän, till exempel dokumentation eller versionskontroll . Styrd av principerna för domänstyrd design , utvecklar varje grupp interna mikrotjänster och Postman-funktioner för Postman-användare.

Medan de flesta ingenjörer arbetar inom grupper, vissa arbetar i funktionella team som bygger komponenter som delas över hela ingenjörsorganisationen. Server Foundation-teamet är ett exempel på ett funktionellt team på Postman. Dessa ingenjörer skapar de verktyg som används av andra grupper för att bygga, leverera och observera sina egna funktioner. Detta team är också där bosatta AWS och infrastrukturexperter bor.

Server Foundation team är ett exempel på ett funktionellt team på Postman som skapar och hanterar saker som används i hela ingenjörsorganisationen

De flesta mikrotjänster på Postman är löst kopplade så att de kan utvecklas oberoende av andra lag. Tyvärr kan en tjänst ibland växa för stor, vilket ger en bredd av till synes orelaterade tjänster. Dessa tjänster gör det möjligt för teamet att snabbt itera, men kan börja fungera mer som en uppsvälld monolit, en stor lera boll eller vad du än vill kalla dessa besvärliga varelser.

När detta händer hos Postman, många ingenjörer i olika team bidrar till koden och kräver noggrann samordning mellan varje team för varje uppdatering.

Den monolitiska synkroniseringstjänsten

En av Postman-tjänsterna som växte för stor till hanteras effektivt kallas Sync. Det har den skrämmande uppgiften att synkronisera all aktivitet i Postman-klienten på din lokala maskin med Postmans servrar. Varje användaråtgärd i Postman resulterar i en serie API-samtal som hanteras via webbanslutningsanslutningar, efter ett publicerings-prenumerationsmönster , så att information flödar i realtid mellan användare och över lag.

Det här är till exempel vad som händer när du loggar in på Postman och uppdaterar en samling:

  1. Du lägger till en parameter i Postman-samlingen.
  2. Brevbäraren registrerar uppdateringen i versionskontroll lagrad med din profil.
  3. Brevbäraren visar den senaste informationen för tittarna i samlingen i realtid.

Sync var ursprungligen avsedd att hantera databastransaktioner, som att uppdatera en samling. Men den här gången förra året lyckades Sync också med ytterligare aktiviteter, som att meddela och visa den senaste versionen för alla som prenumererar på samlingen.

Synkronisera under tryck

När du bygger en bil är ramen den huvudsakliga stödkonstruktionen som alla andra komponenter är anslutna. En liten spricka i ramen kanske inte verkar vara en stor sak. Det kan nog gå obemärkt att köra runt i låga hastigheter. Vid högre hastigheter uppstår dock en krusningseffekt som eskalerar feljusteringar. Den till synes obetydliga sprickan tillåter vibrationer att förstärkas i resten av fordonet tills det eskalerar till ett flammande vrak.

“Stuff som går obemärkt förbi i mindre system blir oundviklig i mer komplexa system.”
Kunal Nagpal , ingenjörschef på Postman

Sync var en av de tidigaste tjänsterna på Postman, och dess monolitiska arkitektur gjorde det möjligt för teamet att snabbt skicka Postmans funktioner. Med tiden började hantera allt fler ansvarsområden. Till denna dag har Sync-tjänsten fortfarande ett stort inflytande över ingenjörsorganisationen, och många ingenjörer känner smärtan när Sync beter sig oväntat eller det finns planerad stillestånd.

Under 2019 hanterade Sync både webbanslutningsanslutningar och databas transaktioner. Med allt mer samarbete mellan våra 11 miljoner användare vid den tiden närmade sig Postman en miljon samtidiga anslutningar vid toppbelastning.

Som grunden för praktiskt taget alla mikrotjänster på Postman växte belastningen på Sync.

  • Kaskadfel på grund av mottryck: Varje distribution för att synkronisera resulterar i att koppla bort Postman-klienter anslutna över nätuttag. När en miljon uttag återansluts försämras serverresurserna, vilket kan leda till fler kopplingar, vilket orsakar en förutsägbar men oundviklig ökning som kan ta 6 till 8 timmar att återhämta sig.
  • Påverkar användarupplevelsen: Även om det inte hände ofta innebar tappade anslutningar en tillfällig fördröjning av att se de senaste uppdateringarna och aktiviteten i ett Team Workspace. >
  • Högre underhållskostnader : Eftersom varje grupp förlitade sig på Sync, var praktiskt taget varje ingenjör på Postman tvungen att lära sig att hantera tappade anslutningar, initiera nya och sedan förena eventuella konflikter i datan.

Server Foundation-teamet visste att de ville öka effektiviteten i webbanslutningsanslutningar och hanterade dem också separat från Synkroniseringstjänst. Målet var tydligt, men vägen dit kom inte.

“Detta är den naturliga utvecklingen av programvarudesign. Mikrotjänster börjar fina, men de byggs upp och måste brytas ner. Vi ville skilja på sockelhantering från Sync eftersom vi skulle introducera mycket mer funktionalitet. ”
Yashish Dua , programvaruingenjör på Brevbärare

vissa interna tjänster blir för stora och kräver noggrann samordning mellan team

Här är vad som hände

Steg 1: Vi fick organisatoriskt inköp

Den första utmaningen att tackla var inte teknisk. Detta var inte Postmans första ambitiösa lansering. Ingenjörskunskap hade lärt sig från tidigare omgångar till att börja med folket. Från och med oktober 2019 höll Server Foundation-ingenjörerna en serie recensioner för att kommunicera målet till den bredare organisationen och förklara nyttan för alla beroende tjänster.

Om detta nya system lyckades hanterade hanterade anslutningar och att hantera efterdyningarna skulle inte längre vara vanligt. Detta var ett verkligt incitament för de andra ingenjörsteamen att stödja och migrera till det nya systemet. Denna öppna kommunikation och samordning skulle fortsätta under hela projektets varaktighet.

Steg 2: Vi identifierade de okända okända

Engineering visste vilken riktning de var på väg. Trots det tog de lite tid att tänka igenom alla scenarier och bättre förstå de underliggande begreppen. Ingenjörerna planerade undersökningsmöten med andra intressenter för att identifiera okända okända, de oförutsebara förhållandena som kan utgöra en större risk än de kända kunskaperna.

Medan Postman-organisationen är van vid att undersöka och planera, är denna del av processen tog mycket längre tid än normalt på grund av den kritiska karaktären av denna förändring. De undersökte olika alternativ, betraktade hjälpkrav och kom fram till en plan under två månader.

Steg 3: Vi byggde Bifrost-nätverksgatewayen

Bifrost består av två delar:

  • Offentlig gateway : Gatewayen använder Fastify-webbramverket och Amazon AWS ElastiCache för Redis som en central meddelandemäklare för att hantera alla webbanslutningsanslutningar.
  • Privat API : API använder också Fastify som ett webbramverk med låg kostnad för proxy-trafik till andra interna Postman-tjänster.
Bifrost består av två delar: en offentlig gateway och en privat API

Steg 4: Vi testade den nya gatewayen

När Postman-ingenjörer är redo att skicka en funktion, de förväntas testa funktionen tillsammans med alla relaterade funktioner. Eftersom nästan alla Postman-funktioner är beroende av webbuttag, innebar detta att varje enskild funktion måste testas för den här utgåvan. Dessutom hade ett ramverk för automatiserad testning av webbsockets inte skapats ännu på Postman, så all testning slutfördes manuellt innan Bifrost kunde användas i produktion.

Detta var en svår resa, men i slutet av januari 2020 hade ingenjörskonsten ett fungerande bevis på konceptet.

Steg 5: Vi migrerade till det nya gateway

Alla Postman-klienter, till exempel Electron-appen eller webben, förlitar sig på ett första bootstrap-samtal till en annan kärntjänst som heter Godserver. Den här servern bestämmer klienternas åtkomst och konfiguration och är hur ingenjörskontroll styr inkrementell produktutbyggnad. Eftersom allt detta var förutbestämt och kontrollerat av Godserver, skulle migrering till Bifrost-gateway inte kräva en enda uppdatering av Postman-klientkoden.

Server Foundation-teamet skisserade gruppernas migreringssteg, de nödvändiga kodändringarna och konfigurationen att ansöka. Under några veckor började beroende tjänster övergå från att förlita sig på Sync till Bifrost-baserad hantering av deras webbanslutningsanslutningar. Godserver avledde mer och mer trafik till den nya nätverksporten för att se hur Bifrost hanterade lasten och svarade på kantfall.

“Det är som att byta motor på ett flygplan mitt i flight. ”
Numaan Ashraf , ingenjör för Postman

Steg 6: Vi skalade tjänsten

Bifrost-gatewayen fungerade!

Men Postman hade förvärvat ytterligare en miljon användare medan gatewayen var i planering och utveckling. Och de andra ingenjörsgrupperna hade inte pausat sitt eget arbete under denna tid. Nya samarbetsfunktioner, som versionskontroll och rollbaserad åtkomstkontroll (RBAC) , baserade sig på starkt på nätuttag för att information ska uppdateras i realtid. Det var en översvämning av kommande produktreleaser som verkligen skulle testa den nya gatewayen.

Bifrost var redo att stödja de ökade kraven och skala webbhantering.

  • Horisontell skalning : För det mesta hanterar Postman-tjänster ökad användning genom antingen skalning till högre kapacitetstillfällen eller genom att lägga till fler beräkningsinstanser i flottan. Så ingenjörer hos Postman brukar skala upp en tjänst genom att öka storleken och datorkraften hos AWS EC2 till exempel, med hjälp av AWS Elastic Beanstalk. Men för Bifrost skalar websockthantering ut genom att använda mer maskiner. Dess optimala effektivitet uppnås när instanser av mindre storlek används i stort antal. Denna typ av hyperhorisontell skalning fungerar bra för Bifrost eftersom klienter inte kräver hög nätverksgenomströmning och att begränsa varje maskin till färre anslutningar begränsar sprängradien för fel.
  • Ny belastningsfaktor för CPU och minne : De flesta Postman-tjänster kan effektivt skalas med en enda dimension av skalningsvärde, som CPU, minne eller latens. För Bifrost blir sakerna dock lite mer nyanserade eftersom både minne och CPU-användning har olika inverkan på operationerna på olika genomströmningsnivåer. För att ta hänsyn till det använder Bifrost ett anpassat skalningsvärde baserat på belastningsfaktor. Lastfaktorn är en flerdimensionell beräkning som ger en anpassad icke-linjär skalningsprofil.

Låt oss gräva i de arkitektoniska och tekniska beslut som fattas av Postman engineering.

Bifrost-arkitekturen och tech stacken

Bifrost-systemet har två huvudkomponenter – en gateway och ett API. Denna tvådelade arkitektur är den hemliga såsen för systemets stabilitet och skalbarhet.

Gatewayen fungerar som avslutningspunkt för alla webbanslutningsanslutningar. Även om kommersiella gateways finns att köpa, var det viktigt att bevara den äldre affärslogik som samlats under åratal av optimering. Postman-ingenjörer ville också helt kontrollera hur webbhanteringar hanteras, till exempel om de ville utnyttja protokollhandskakningen. För Bifrost-gatewayen använde de Amazon ElastiCache för Redis så att de kunde fråga Redis-cachen med hjälp av läsar- och skrivarnoder.Genom att dela upp trafiken i två noder för läs- och skrivoperationer kan teamet optimera prestandan.

“Bifrost är vår gateway för alla webbanslutningsanslutningar. Det är en proxy för alla Postman-klienter och ansvarar för hantering av sockeloperationer på låg nivå för interna Postman-tjänster. ”
Mudit Mehta , programvarutekniker på Postman

De flesta andra tjänster på Postman använder Sails som en realtids MVC-ram för Node.js . För Bifrost-gatewayen behövde ingenjörerna dock ett performant backend-ramverk som kan hantera höga volymer med hastighet och optimerad minnesanvändning. Återigen ville de gå djupare in i sockelskiktet, under de högre abstraktionerna som Sails tillhandahöll. Så de vände sig till Fastify och gafflade socketio-adapter mellanprogramvara för att optimera för eget bruk fall.

Bifrost-gateway använde AWS, Redis och Fastify för att hantera webbhylsor

Förutom gatewayen är den andra komponenten i Bifrost det privata API: et som tillhandahåller trafik till andra Postman-tjänster. Den är baserad på flexibla affärsregler och utvärderas ständigt för hur och var man ska vidarebefordra inkommande trafik.

“Enkla komponenter. Komplex logik. ”
Kunal Nagpal , ingenjörschef på Postman

För båda komponenterna, ingenjörsteamet bestämde sig för att rulla sina egna. Även om gateway-delen av Bifrost inte uppdateras ofta har teamet full kontroll över vad som händer i de djupare lagren av websockethantering. API-delen av Bifrost är hjärnan i operationen och konverterar inkommande realtidsmeddelanden till vanliga HTTP-samtal. Det kan också uppdateras snabbare som en oberoende komponent från Sync och Bifrost-gatewayen.

Kommer du ihåg den hemliga såsen? Att frikoppla Bifrost till dessa två diskreta system gör att båda delarna kan optimera för sina egna mål.

Resan är långt ifrån över

Som med alla saftiga tekniska berättelser är det inte slutet. . Jag lämnar dig några klippor om vad som händer härnäst för Postman engineering.

  • Skapa ytterligare redundans : Redis-cache är en central meddelandemäklare . Hantering av webbsocket är fortfarande beroende av en enda felpunkt, så vad händer om cachen någonsin går ner?
  • Öka bandbredd och genomströmning : Gatewayen kan för närvarande hantera 10 gånger samtidighet, men Postman-gruppen växer snabbt och teknik bygger upp fler samarbetsfunktioner. Behovet av att hantera mer webbtrafik kommer snabbt upp.
  • Fortsätt bryta ner monoliten: Synkroniseringstjänsten innehåller en virvel av andra tjänster som är sammanflätade i dess kodbas. Att frikoppla sockelhantering från Sync minskar greppet om andra tjänster, så andra tjänster kan nu lättare avskalas.

Detta var en annan bakom kulisserna titt på hur Postman engineering fungerar. Håll ögonen öppna för fler berättelser från diken.

🙏🏼 Teknisk recension av Kunal Nagpal, Yashish Dua, Mudit Mehta och Shamasis Bhattacharya.

Ursprungligen publicerad på https://blog.postman.com den 22 december 2020.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *