Cum gestionează Postman Engineering un milion de conexiuni simultane

Echipa Server Foundation de la Postman împărtășește povestea de origine a portalului Bifrost websocket

(22 decembrie 2020)

În Universul cinematografic Marvel, Bifrost este numele podului curcubeu care permite călătoria instantanee între tărâmurile zei și umanitate. În mod similar și la fel de magic, gateway-ul nostru Bifrost websocket permite clienților Postman să se conecteze instantaneu la serviciile Postman.

Fotografie de Toni Reed pe Unsplash

După cum am împărtășit anterior în (How Postman Engineering Does Microservices), toate arhitecturile software sunt o lucrare continuă în proces. A opera în lumea reală înseamnă reevaluarea ocazională a vechilor moduri de gândire pentru a se adapta la circumstanțe noi. Aceasta este evoluția naturală a proiectării software-ului.

Iată povestea modului în care inginerii Postman au dezvoltat gateway-ul web Bifrost prin eliminarea unui serviciu care a crescut prea mult.

Echipele de dezvoltare de la Postman

Majoritatea echipelor de dezvoltare de la Postman lucrează în echipe multifuncționale axate pe un singur domeniu central, cum ar fi documentația sau controlul versiunii . Ghidat de principiile design bazat pe domeniu , fiecare echipă dezvoltă microservicii interne și funcții Postman pentru utilizatorii Postman.

În timp ce majoritatea inginerilor lucrează în echipe, unele lucrează în echipe funcționale care construiesc componente partajate între întreaga organizație de inginerie. Echipa Server Foundation este un exemplu de echipă funcțională la Postman. Acești ingineri creează utilitățile utilizate de alte echipe pentru a construi, expedia și observa propriile caracteristici. Această echipă se află, de asemenea, în rezidenții AWS și experți în infrastructură.

Server Foundation echipa este un exemplu de echipă funcțională la Postman care creează și gestionează lucruri utilizate în întreaga organizație de inginerie

Majoritatea microserviciilor de la Postman sunt vag cuplate astfel încât să poată evolua independent de alte echipe. Din păcate, un serviciu poate crește uneori prea mare, oferind o gamă largă de servicii aparent fără legătură. Aceste servicii permit echipei să itereze rapid, dar pot începe să acționeze mai mult ca un monolit umflat, o minge mare de noroi sau orice altceva doriți să numiți aceste creaturi dificile.

Când se întâmplă acest lucru la Postman, mulți ingineri între diferite echipe ajung să contribuie la cod, necesitând o coordonare atentă între fiecare echipă pentru fiecare actualizare.

Serviciul de sincronizare monolit

Unul dintre serviciile Postman care a crescut prea mult pentru să fie gestionat eficient se numește sincronizare. Are sarcina descurajantă de a sincroniza toată activitatea din clientul Postman de pe mașina dvs. locală cu serverele Postman. Fiecare acțiune de utilizator din Postman are ca rezultat o serie de apeluri API gestionate prin conexiuni websocket, urmând un tipar de publicare-abonare , astfel încât informațiile să curgă în timp real între utilizatori și între echipe.

De exemplu, acest lucru se întâmplă atunci când vă conectați la Postman și actualizați o colecție:

  1. Adăugați un parametru la colecția Postman.
  2. Postman păstrează o înregistrare a actualizării în controlul versiunilor stocate în profilul dvs.
  3. Postman afișează cele mai recente informații pentru spectatorii colecției în timp real.

Sincronizarea a fost inițial destinată să gestioneze tranzacțiile bazei de date, cum ar fi actualizarea unei colecții. Cu toate acestea, de data aceasta anul trecut, Sync a gestionat și activități suplimentare, cum ar fi notificarea și afișarea celei mai recente versiuni tuturor celor abonați la colecție.

Sincronizare sub presiune

Când construiți o mașină, cadrul este principala structură de susținere la care toate celelalte componentele sunt atașate. O crăpătură mică în cadru s-ar putea să nu pară mare lucru. Poate trece neobservat conducând cu viteze mici. Cu toate acestea, la viteze mai mari, există un efect de ondulare care escaladează nealinierile. Crăpătura aparent nesemnificativă permite vibrațiilor să se amplifice în tot restul vehiculului până când escaladează într-o epavă în flăcări.

„Lucruri care trece neobservat în sistemele mai mici devine inevitabil în sistemele mai complexe.”
Kunal Nagpal , inginer manager la Postman

Sincronizarea a fost unul dintre primele servicii de la Postman, iar arhitectura sa monolitică a permis echipei să livreze rapid funcțiile Postman. De-a lungul timpului, a început să se ocupe de tot mai multe responsabilități. Până în prezent, serviciul Sync are încă o influență larg răspândită în întreaga organizație de inginerie și mulți ingineri simt durerea atunci când Sync se comportă în mod neașteptat sau când există perioade de nefuncționare programate.

În 2019, Sync gestiona atât conexiunile de web port, cât și baza de date. tranzacții. Odată cu colaborarea din ce în ce mai mare între cei 11 milioane de utilizatori ai noștri la acel moment, Postman se apropia de un milion de conexiuni simultane la sarcină maximă.

Ca bază pentru practic fiecare microserviciu de la Postman, tensiunea pe Sync crește.

  • Eșec în cascadă din cauza presiunii din spate: Fiecare implementare către Sincronizare duce la deconectarea clienților Postman conectați peste mufe web. Când un milion de socketuri se reconectează, resursele serverului sunt degradate, ceea ce poate duce la mai multe deconectări, provocând o creștere previzibilă, dar inevitabilă, care poate dura 6 până la 8 ore până la recuperare.
  • Experiența utilizatorului cu impact: Chiar dacă nu s-a întâmplat des, conexiunile renunțate au însemnat o întârziere ocazională în a vedea ultimele actualizări și activitate într-un spațiu de lucru în echipă.
  • Cost mai mare de întreținere : Deoarece fiecare echipă s-a bazat pe Sync, practic fiecare inginer de la Postman a trebuit să învețe cum să gestionați conexiunile abandonate, inițiați altele noi și apoi reconciliați eventualele conflicte din date.

Echipa Server Foundation știa că doresc să crească eficiența conexiunilor WebSocket și, de asemenea, să le gestioneze separat de Serviciu de sincronizare. Destinația era clară, dar calea de a ajunge acolo nu era.

„Aceasta este evoluția naturală a proiectării software-ului. Microserviciile încep să fie agile, dar se acumulează și trebuie reduse înapoi. Am vrut să separăm gestionarea socketului de sincronizare, deoarece eram pe punctul de a introduce mult mai multe funcționalități. ”
Yashish Dua , inginer software la Poștaș

unele servicii interne cresc prea mare necesitând o coordonare atentă între echipe

Iată ce s-a întâmplat

Pasul 1: am primit buy-in organizațional

Prima provocare abordată nu a fost una tehnică. Aceasta nu a fost prima lansare ambițioasă a lui Postman. Ingineria învățase din trecutul trecut pentru a începe cu oamenii. Începând din octombrie 2019, inginerii Server Foundation au organizat o serie de recenzii dedicate comunicării obiectivului către organizația mai largă și explicând avantajul pentru toate serviciile dependente.

Dacă acest nou sistem a reușit, gestionarea conexiunilor abandonate și a face față consecințelor nu ar mai fi ceva obișnuit. Acesta a fost un real stimulent pentru celelalte echipe de ingineri pentru a sprijini și a migra către noul sistem. Această comunicare deschisă și coordonare ar continua pe toată durata acestui proiect.

Pasul 2: Am identificat necunoscutele necunoscute

Ingineria știa direcția în care se îndreptau. În ciuda acestui fapt, au luat ceva timp pentru a analiza toate scenariile și a înțelege mai bine conceptele de bază. Inginerii au programat sesiuni exploratorii cu alte părți interesate pentru a identifica necunoscute necunoscute, condițiile imprevizibile care pot prezenta un risc mai mare decât cele cunoscute.

În timp ce organizația Postman este obișnuită să cerceteze și să planifice, această parte a procesului a durat mult mai mult decât în ​​mod normal datorită naturii critice a acestei schimbări. Au cercetat diferite opțiuni, au considerat cerințe auxiliare și au elaborat un plan pe parcursul a două luni.

Pasul 3: Am construit gateway-ul web Bifrost

Bifrost este compus din două părți:

  • Gateway public : gateway-ul folosește cadrul web Fastify și Amazon AWS ElastiCache pentru Redis ca un broker de mesaje central pentru gestionarea tuturor conexiunilor web.
  • API privat : API folosește, de asemenea, Fastify ca un cadru web cu cheltuieli reduse pentru proxy trafic către alte servicii interne de poștal.
Bifrost este compus din două părți: un gateway public și un API privat

Pasul 4: Am testat noul gateway

Când inginerii Postman sunt gata să livreze o caracteristică, se așteaptă să testeze caracteristica, împreună cu orice caracteristici conexe. Deoarece aproape fiecare caracteristică Postman se bazează pe websockets, acest lucru a însemnat că fiecare caracteristică a trebuit testată pentru această versiune. Mai mult, un cadru pentru testare automată a websocket-urilor nu a fost încă configurat la Postman, astfel încât toate testele au fost finalizate manual înainte de Bifrost ar putea fi folosit în producție.

Aceasta a fost o călătorie dificilă, dar până la sfârșitul lunii ianuarie 2020, ingineria avea o dovadă de concept funcțională.

Pasul 5: Am migrat la noul gateway

Toți clienții Postman, cum ar fi aplicația Electron sau Web, se bazează pe un apel de bootstrap inițial către un alt serviciu de bază numit Godserver. Acest server determină accesul și configurația clienților și este modul în care ingineria controlează lansările de produse incrementale. Deoarece toate acestea erau predeterminate și controlate de Godserver, migrarea către gateway-ul Bifrost nu ar necesita o singură actualizare a codului clientului Postman.

Echipa Server Foundation a prezentat pașii de migrare ai echipelor, modificările codului și configurația necesare a aplica. De-a lungul a câteva săptămâni, serviciile dependente au început să treacă de la a se baza pe sincronizare la gestionarea bazată pe Bifrost a conexiunilor lor de socket web. Godserver a redirecționat din ce în ce mai mult trafic către noul gateway web pentru a vedea cum Bifrost a gestionat sarcina și a răspuns la cazurile de margine.

„Este ca și cum ai schimba un motor pe o aeronavă în mijlocul zbor. ”
Numaan Ashraf , director inginerie la Postman

Pasul 6: Noi a scalat serviciul

Gateway-ul Bifrost funcționa!

Dar Postman a mai achiziționat încă un milion de utilizatori în timp ce gateway-ul era în planificare și dezvoltare. Și celelalte echipe de ingineri nu și-au întrerupt propria muncă în acest timp. S-au bazat pe funcții noi de colaborare, cum ar fi control versiune și control acces pe rol (RBAC) foarte mult pe web-porturi pentru ca informațiile să fie actualizate în timp real. A existat o inundație de lansări de produse viitoare care ar testa cu adevărat noul gateway.

Bifrost a fost gata să susțină cererile crescute și să mărească manevrarea web-porturilor. „573e9f9583”> Scalare orizontală : De cele mai multe ori, serviciile Postman gestionează utilizarea crescută fie prin scalarea la instanțe cu capacitate mai mare, fie prin adăugarea mai multor instanțe de calcul la flotă. Așadar, inginerii de la Postman scalează de obicei up un serviciu prin creșterea dimensiunii și puterii de calcul a AWS EC2 de exemplu, utilizând AWS Elastic Beanstalk. Dar pentru Bifrost, scalele de manipulare a portalului web out utilizând mai multe mașini. Eficiența sa optimă este atinsă atunci când instanțele de dimensiuni mai mici sunt utilizate în număr mare. Acest tip de scalare hiperorizontală funcționează bine pentru Bifrost, deoarece clienții nu necesită un flux de rețea ridicat, iar limitarea fiecărei mașini la mai puține conexiuni limitează raza de explozie a eșecurilor.

  • Factor de încărcare nou al procesorului și al memoriei : majoritatea serviciilor Postman pot scala cu o singură dimensiune a metricii de scalare, cum ar fi CPU, memorie sau latență. Cu toate acestea, pentru Bifrost, lucrurile devin puțin mai nuanțate, deoarece atât memoria, cât și utilizarea procesorului au impacturi diferite asupra operațiunilor la diferite niveluri de transfer. Pentru a explica acest lucru, Bifrost folosește o valoare personalizată de scalare bazată pe factorul de încărcare. Factorul de încărcare este un calcul multidimensional care conferă un profil de scalare neliniar personalizat.
  • Să ne adâncim în deciziile arhitecturale și tehnologice luate de Postman Engineering.

    Arhitectura și stiva tehnologică Bifrost

    Sistemul Bifrost are două componente majore – un Gateway și un API. Această arhitectură în două părți este sosul secret al stabilității și scalabilității sistemului.

    Gateway-ul acționează ca punctul de terminare pentru toate conexiunile websocket. Chiar dacă gateway-urile comerciale sunt disponibile pentru cumpărare, a fost important să se păstreze vechea logică de afaceri acumulată de-a lungul anilor de optimizare. Inginerii poștași au dorit, de asemenea, să controleze pe deplin modul în care sunt tratate porturile web, de exemplu, dacă doreau să folosească protocolul de strângere de mână. Pentru gateway-ul Bifrost, au folosit Amazon ElastiCache pentru Redis, permițându-le să interogheze memoria cache Redis utilizând noduri de citire și scriere.Împărțirea traficului în două noduri pentru operații de citire și scriere permite echipei să optimizeze performanțele.

    „Bifrost este gateway-ul nostru pentru toate conexiunile websocket. Este un proxy pentru toți clienții Postman și este responsabil pentru gestionarea operațiunilor de socket de nivel scăzut pentru serviciile interne Postman. ”
    Mudit Mehta , inginer software la Postman

    Majoritatea celorlalte servicii de la Postman folosesc Sails ca cadru MVC în timp real pentru Node.js . Cu toate acestea, pentru gateway-ul Bifrost, inginerii aveau nevoie de un cadru backend performant capabil să gestioneze volume mari cu viteză și utilizarea optimă a memoriei. Din nou, au vrut să intre mai adânc în stratul de soclu, sub abstracțiile de nivel superior furnizate de Sails. Așa că au apelat la Fastify și au furnizat middleware-ul socketio-adapter pentru a-l optimiza pentru propria utilizare cazuri.

    gateway-ul Bifrost a folosit AWS, Redis și Fastify pentru a gestiona websockets

    În plus față de gateway, cealaltă componentă a Bifrost este API-ul privat care transmite proxy trafic către alte servicii Postman. Se bazează pe reguli de afaceri flexibile și, prin urmare, este reevaluat în mod constant pentru cum și unde să redirecționați traficul de intrare.

    „Componente simple. Logică complexă. ”
    Kunal Nagpal , inginer manager la Postman

    Pentru ambele componente, echipa de ingineri a decis să-și lanseze propria lor. Deși partea de gateway a Bifrost nu este actualizată frecvent, echipa are control deplin asupra a ceea ce se întâmplă în straturile mai profunde de manipulare a portalului web. Partea API a Bifrost este creierul operației și convertește mesajele primite în timp real în apeluri HTTP standard. De asemenea, poate fi actualizat mai rapid ca o componentă independentă de Sync și gateway-ul Bifrost.

    Vă amintiți acel sos secret? Decuplarea Bifrost în aceste două sisteme discrete permite ambelor părți să se optimizeze pentru propriile obiective.

    Călătoria este departe de a se termina

    La fel ca în toate poveștile inginerești suculente, acesta nu este sfârșitul . Vă voi lăsa cu câțiva cliffhangers despre ce urmează să urmeze pentru ingineria Postman.

    • Construiți o redundanță suplimentară : cache-ul Redis este un broker de mesaje central . Manipularea Websocket-ului se bazează încă pe un singur punct de eșec, așa că ce se întâmplă dacă cache-ul cade vreodată?
    • Creșteți lățimea de bandă și randamentul : Gateway-ul este în prezent capabil să gestioneze simultanitatea de 10 ori, dar comunitatea Postman crește rapid, iar ingineria dezvoltă mai multe caracteristici de colaborare. Necesitatea de a gestiona mai mult trafic websocket apare rapid.
    • Continuați să descompuneți monolitul: Serviciul de sincronizare conține o mulțime de alte servicii legate în baza sa de cod. Decuplarea manevrării soclului de Sync slăbește controlul asupra altor servicii, astfel încât alte servicii pot fi acum mai ușor decupate.

    Aceasta a fost o altă privire în culise a modului în care funcționează ingineria Postman. Rămâneți la curent pentru mai multe povești din tranșee.

    🙏🏼 Recenzie tehnică de Kunal Nagpal, Yashish Dua, Mudit Mehta și Shamasis Bhattacharya.

    Publicat inițial la https://blog.postman.com pe 22 decembrie 2020.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *