Hoe Postman Engineering een miljoen gelijktijdige verbindingen afhandelt

Het Server Foundation-team van Postman deelt het oorsprongsverhaal van de Bifrost websocket-gateway

(22 december 2020)

In het Marvel Cinematic Universe is Bifrost de naam van de regenboogbrug die het mogelijk maakt om onmiddellijk te reizen tussen de rijken van goden en de mensheid. Evenzo en even magisch laat onze Bifrost websocket-gateway Postman-klanten onmiddellijk verbinding maken met Postman-services.

Foto door Toni Reed op Unsplash

Zoals ik eerder heb gedeeld in (How Postman Engineering Does Microservices), zijn alle softwarearchitecturen een continu werk in uitvoering. Opereren in de echte wereld betekent af en toe oude manieren van denken opnieuw evalueren om aan nieuwe omstandigheden aan te passen. Dat is de natuurlijke evolutie van software-ontwerp.

Hier is het verhaal van hoe Postman-ingenieurs de Bifrost websocket-gateway ontwikkelden door weg te denken aan een dienst die te groot werd.

Ontwikkelingsteams bij Postman

De meeste ontwikkelingsteams bij Postman werken in multifunctionele squadrons die zich richten op één kerndomein, zoals documentatie of versiebeheer . Geleid door de principes van domeingestuurd ontwerp , ontwikkelt elk team interne microservices en Postman-functies voor Postman-gebruikers.

Terwijl de meeste ingenieurs in squadrons, sommige werken in functionele teams die componenten bouwen die door de hele technische organisatie worden gedeeld. Het Server Foundation-team is een voorbeeld van een functioneel team bij Postman. Deze ingenieurs creëren de hulpprogrammas die door andere squadrons worden gebruikt om hun eigen functies te bouwen, te verzenden en te observeren. Dit team is ook waar de resident AWS en infrastructuurexperts verblijven.

the Server Foundation team is een voorbeeld van een functioneel team bij Postman dat dingen maakt en beheert die in de hele technische organisatie worden gebruikt.

De meeste microservices bij Postman zijn losjes gekoppeld zodat ze onafhankelijk van andere teams kunnen evolueren. Helaas kan een dienst soms te groot worden en een scala aan schijnbaar niet-gerelateerde diensten bieden. Deze services stellen het team in staat om snel te herhalen, maar kunnen zich meer gaan gedragen als een opgeblazen monoliet, een grote bal modder of hoe je deze onhandige wezens ook wilt noemen.

Wanneer dit bij Postman gebeurt, moeten veel ingenieurs tussen verschillende teams dragen uiteindelijk bij aan de code, wat een zorgvuldige coördinatie tussen elk team vereist voor elke update.

De monolithische synchronisatieservice

Een van de Postman-services die te groot werd om efficiënt beheerd worden heet Sync. Het heeft de ontmoedigende taak om alle activiteiten in de Postman-client op uw lokale computer te synchroniseren met Postman-servers. Elke gebruikersactie in Postman resulteert in een reeks API-aanroepen die worden afgehandeld via websocket-verbindingen, volgens een publish-subscribe-patroon , zodat informatie in realtime tussen gebruikers en tussen teams.

Dit is bijvoorbeeld wat er gebeurt als je inlogt bij Postman en een collectie bijwerkt:

  1. Je voegt een parameter toe aan de Postman-collectie.
  2. Postbode houdt de update in versiebeheer bij die is opgeslagen met uw profiel.
  3. Postbode geeft de nieuwste informatie in realtime weer aan kijkers van de collectie.

Sync was oorspronkelijk bedoeld om databasetransacties af te handelen, zoals het bijwerken van een collectie. Vorig jaar deze keer beheerde Sync echter ook aanvullende activiteiten, zoals het melden en weergeven van de nieuwste versie aan iedereen die op de collectie is geabonneerd.

Synchroniseren onder druk

Wanneer je een auto bouwt, is het frame de belangrijkste ondersteunende structuur waaraan alle andere componenten zijn bevestigd. Een klein scheurtje in het frame lijkt misschien niet zo erg. Het kan waarschijnlijk onopgemerkt blijven rondrijden met lage snelheden. Bij hogere snelheden is er echter een rimpeleffect dat uitlijningsfouten escaleert. Door de schijnbaar onbeduidende scheur kunnen trillingen door de rest van het voertuig worden versterkt totdat het escaleert tot een brandend wrak.

“Dingen die onopgemerkt blijft in kleinere systemen wordt onontkoombaar in meer complexe systemen.”
Kunal Nagpal , engineering manager bij Postman

Synchronisatie was een van de eerste diensten bij Postman, en dankzij de monolithische architectuur kon het team Postman-functies snel verzenden. Na verloop van tijd begon het steeds meer verantwoordelijkheden op zich te nemen. Tot op de dag van vandaag heeft de Sync-service nog steeds een brede invloed binnen de engineeringorganisatie, en veel ingenieurs voelen de pijn wanneer Sync zich onverwacht gedraagt ​​of er geplande uitvaltijd is.

In 2019 behandelde Sync zowel websocket-verbindingen als database transacties. Met steeds meer samenwerking tussen onze 11 miljoen gebruikers op dat moment, naderde Postman een miljoen gelijktijdige verbindingen met een piekbelasting.

Als basis voor vrijwel elke microservice bij Postman, nam de druk op Sync toe.

  • Trapsgewijze mislukking vanwege tegendruk: Elke implementatie om te synchroniseren resulteert in het verbreken van de verbinding met Postman-clients over websockets. Wanneer een miljoen sockets opnieuw verbinding maken, worden de serverbronnen verslechterd, wat vervolgens kan resulteren in meer verbroken verbindingen, wat een voorspelbare maar onvermijdelijke piek veroorzaakt die 6 tot 8 uur kan duren om te herstellen.
  • Beïnvloedende gebruikerservaring: Hoewel het niet vaak voorkwam, betekende verbroken verbindingen af ​​en toe een vertraging bij het zien van de laatste updates en activiteiten in een teamwerkruimte.
  • Hogere onderhoudskosten : aangezien elke ploeg op Sync vertrouwde, moest vrijwel elke technicus bij Postman leren hoe afhandelen van verbroken verbindingen, nieuwe initiëren en vervolgens eventuele conflicten in de gegevens verzoenen.

Het Server Foundation-team wist dat ze de efficiëntie van websocket-verbindingen wilden verhogen, en ze ook los van de Synchronisatieservice. De bestemming was duidelijk, maar de weg ernaartoe was niet.

“Dit is de natuurlijke evolutie van softwareontwerp. Microservices beginnen wendbaar, maar ze bouwen zich op en moeten weer worden afgebroken. We wilden socketverwerking scheiden van synchronisatie omdat we op het punt stonden veel meer functionaliteit te introduceren. “
Yashish Dua , software-engineer bij Postbode

sommige interne services worden te groot en vereisen een zorgvuldige coördinatie tussen teams

Dit is wat er gebeurde

Stap 1: we kregen organisatorische buy-in

De eerste uitdaging die we moesten aanpakken was niet technisch. Dit was niet de eerste ambitieuze uitrol van Postman. Engineering had geleerd van eerdere doorstart om bij de mensen te beginnen. Vanaf oktober 2019 hielden de technici van de Server Foundation een reeks beoordelingen die waren bedoeld om het doel aan de bredere organisatie te communiceren en het voordeel voor alle afhankelijke services uit te leggen.

Als dit nieuwe systeem slaagde, het omgaan met verbroken verbindingen en omgaan met de nasleep zou niet langer gemeengoed zijn. Dit was een echte stimulans voor de andere engineeringteams om te ondersteunen en naar het nieuwe systeem te migreren. Deze open communicatie en coördinatie zou gedurende de hele duur van dit project voortduren.

Stap 2: We identificeerden de onbekende onbekenden

Engineering wist welke richting ze op gingen. Desondanks namen ze enige tijd om alle scenarios te overdenken en de onderliggende concepten beter te begrijpen. De ingenieurs hebben verkennende sessies gepland met andere belanghebbenden om onbekende onbekenden te identificeren, de onvoorziene omstandigheden die een groter risico kunnen vormen dan de bekende bekende.

Hoewel de Postman-organisatie gewend is aan onderzoek en planning, is dit deel van het proces duurde veel langer dan normaal vanwege de kritische aard van deze wijziging. Ze onderzochten verschillende opties, overwogen aanvullende vereisten en kwamen met een plan in de loop van twee maanden.

Stap 3: We hebben de Bifrost websocket-gateway gebouwd

De Bifrost is samengesteld uit twee delen:

  • Openbare gateway : de gateway gebruikt het Fastify-webframework en Amazon AWS ElastiCache voor Redis als centrale berichtenmakelaar om alle websocket-verbindingen te beheren.
  • Private API : de API gebruikt Fastify ook als een webraamwerk met lage overhead om verkeer naar andere interne Postman-services te proxy.
Bifrost bestaat uit twee delen: een openbare gateway en een private API

Stap 4: We hebben de nieuwe gateway getest

Wanneer Postman-technici klaar zijn om een ​​functie te verzenden, van hen wordt verwacht dat ze de functie testen, samen met alle gerelateerde functies. Aangezien bijna elke Postman-functie afhankelijk is van websockets, betekende dit dat elke afzonderlijke functie voor deze release moest worden getest. Bovendien was er nog geen framework voor geautomatiseerd testen van websockets opgezet bij Postman, dus alle tests werden handmatig voltooid vóór Bifrost kan worden gebruikt in de productie.

Dit was een zware reis, maar tegen het einde van januari 2020 had engineering een werkende proof of concept.

Stap 5: we zijn gemigreerd naar het nieuwe gateway

Alle Postman-clients, zoals de Electron-app of het web, vertrouwen op een initiële bootstrap-aanroep naar een andere kernservice genaamd Godserver. Deze server bepaalt de toegang en configuratie van de klanten, en is hoe engineering de incrementele productimplementatie controleert. Omdat dit allemaal vooraf was bepaald en beheerd door de Godserver, was voor het migreren naar de Bifrost-gateway geen enkele update van de Postman-clientcode nodig.

Het Server Foundation-team schetste de migratiestappen van de squads, de vereiste codewijzigingen en configuratie toepassen. In de loop van een paar weken begonnen afhankelijke services over te schakelen van het vertrouwen op Sync naar Bifrost-gebaseerde afhandeling van hun websocket-verbindingen. De Godserver leidde steeds meer verkeer om naar de nieuwe websocket-gateway om te zien hoe Bifrost de belasting afhandelde en reageerde op randgevallen.

“Het is alsof je een motor van een vliegtuig halverwege verandert. flight. ”
Numaan Ashraf , directeur engineering bij Postman

Stap 6: We de service geschaald

De Bifrost-gateway werkte!

Maar Postman had nog een miljoen gebruikers verworven terwijl de gateway bezig was met planning en ontwikkeling. En de andere engineeringteams hadden hun eigen werk gedurende deze tijd niet onderbroken. Nieuwe samenwerkingsfuncties, zoals versiebeheer en op rollen gebaseerd toegangsbeheer (RBAC) , vertrouwden zwaar op websockets om informatie in realtime bij te werken. Er was een vloed van aankomende productreleases die de nieuwe gateway echt zouden testen.

Bifrost was klaar om de toegenomen eisen te ondersteunen en de afhandeling van websockets te schalen.

  • Horizontaal schalen : Meestal verwerken Postman-services een verhoogd gebruik door ofwel te schalen naar instanties met een hogere capaciteit of door meer rekeninstanties aan de vloot toe te voegen. Dus ingenieurs bij Postman schalen omhoog een service door de omvang en de rekenkracht van AWS EC2 te vergroten instanties, bijvoorbeeld door AWS Elastic Beanstalk te gebruiken. Maar voor Bifrost, de afhandeling van schalen door websocket out door meer machines. De optimale efficiëntie wordt bereikt wanneer kleinere exemplaren in grote aantallen worden gebruikt. Dit type hyper-horizontale schaalvergroting werkt goed voor Bifrost, omdat clients geen hoge netwerkdoorvoer nodig hebben, en het beperken van elke machine tot minder verbindingen de explosieradius van storingen beperkt.
  • Nieuwe belastingsfactor van CPU en geheugen : de meeste Postman-services kunnen effectief worden geschaald met een enkele dimensie van schaalstatistieken, zoals CPU, geheugen of latentie. Voor Bifrost worden de zaken echter een beetje genuanceerder omdat zowel het geheugen als het CPU-gebruik verschillende effecten hebben op bewerkingen op verschillende doorvoerniveaus. Om daar rekening mee te houden, gebruikt Bifrost een aangepaste schaalmaatstaf op basis van de belastingsfactor. De belastingsfactor is een multidimensionale berekening die een aangepast niet-lineair schaalprofiel oplevert.

Laten we eens kijken naar de architecturale en technologische beslissingen die door Postman Engineering zijn genomen.

De Bifrost-architectuur en technische stack

Het Bifrost-systeem heeft twee hoofdcomponenten: een gateway en een API. Deze tweedelige architectuur is de geheime saus voor de stabiliteit en schaalbaarheid van het systeem.

De Gateway fungeert als het eindpunt voor alle websocket-verbindingen. Hoewel commerciële gateways beschikbaar zijn voor aankoop, was het belangrijk om de oude bedrijfslogica te behouden die gedurende jaren van optimalisatie is opgebouwd. Postman-ingenieurs wilden ook volledig bepalen hoe websockets worden afgehandeld, bijvoorbeeld als ze gebruik wilden maken van de protocolhandshake. Voor de Bifrost-gateway gebruikten ze Amazon ElastiCache voor Redis, waardoor ze de Redis-cache konden doorzoeken met behulp van reader- en writer-knooppunten.Door het verkeer in twee knooppunten op te splitsen voor lees- en schrijfbewerkingen, kan het team de prestaties verder optimaliseren.

“Bifrost is onze gateway voor alle websocket-verbindingen. Het is een proxy voor alle Postman-clients en verantwoordelijk voor het afhandelen van low-level socketbewerkingen voor interne Postman-services. “
Mudit Mehta , software engineer bij Postman

Bijna elke andere service bij Postman gebruikt Sails als een real-time MVC-framework voor Node.js . Voor de Bifrost-gateway hadden de ingenieurs echter een performant backend-framework nodig dat hoge volumes snel en geoptimaliseerd geheugengebruik kan verwerken. Wederom wilden ze dieper in de kokerlaag gaan, onder de hogere abstracties van Sails. Dus wendden ze zich tot Fastify en gebruikten ze de socketio-adapter middleware om te optimaliseren voor hun eigen gebruik gevallen.

de Bifrost-gateway gebruikte AWS, Redis en Fastify om websockets af te handelen

Naast de gateway is de andere component van Bifrost de privé-API die verkeer naar andere Postman-services proxyset. Het is gebaseerd op flexibele bedrijfsregels en wordt daarom voortdurend opnieuw geëvalueerd voor hoe en waarheen inkomend verkeer moet worden doorgestuurd.

“Eenvoudige componenten. Complexe logica. ”
Kunal Nagpal , engineering manager bij Postman

Voor beide componenten, het technische team besloot hun eigen te rollen. Hoewel het gateway-gedeelte van Bifrost niet regelmatig wordt bijgewerkt, heeft het team volledige controle over wat er gebeurt in de diepere lagen van het afhandelen van websockets. Het API-gedeelte van Bifrost is het brein van de operatie en zet inkomende real-time berichten om naar standaard HTTP-oproepen. Het kan ook sneller worden bijgewerkt als een onafhankelijk onderdeel van Sync en de Bifrost-gateway.

Herinner je je die geheime saus nog? Door Bifrost te ontkoppelen in deze twee discrete systemen, kunnen beide onderdelen optimaliseren voor hun eigen doelstellingen.

De reis is nog lang niet voorbij

Zoals met alle sappige technische verhalen, is dit niet het einde . Ik laat je achter met een paar cliffhangers over wat er gaat komen voor Postman Engineering.

  • Bouwen van extra redundantie : de Redis-cache is een centrale berichtenmakelaar . De afhandeling van websockets is nog steeds afhankelijk van een enkel storingspunt, dus wat gebeurt er als de cache ooit uitvalt?
  • Verhoog bandbreedte en doorvoer : De gateway kan momenteel 10x gelijktijdigheid aan, maar de Postman-gemeenschap groeit snel en engineering bouwt meer samenwerkingsfuncties uit. De behoefte om meer websocket-verkeer te verwerken komt snel op.
  • Ga door met het afbreken van de monoliet: De De synchronisatieservice bevat een wirwar van andere services die in de codebase zijn verstrengeld. Het loskoppelen van socketafhandeling van Sync maakt de grip op andere services losser, zodat andere services nu gemakkelijker kunnen worden afgepeld.

Dit was weer een kijkje achter de schermen van hoe Postman engineering werkt. Blijf op de hoogte voor meer verhalen uit de loopgraven.

🙏🏼 Technische beoordeling door Kunal Nagpal, Yashish Dua, Mudit Mehta en Shamasis Bhattacharya.

Oorspronkelijk gepubliceerd op https://blog.postman.com op 22 december 2020.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *