Jak Postman Engineering obsługuje milion jednoczesnych połączeń

Zespół Server Foundation w Postman dzieli się historią powstania bramy sieciowej Bifrost

(22 grudnia 2020 r.)

W kinowym uniwersum Marvela Bifrost to nazwa tęczowego mostu, który umożliwia natychmiastową podróż między królestwami bogowie i ludzkość. Podobnie, i równie magicznie, nasza brama sieciowa Bifrost umożliwia klientom Postman natychmiastowe łączenie się z usługami Postman.

Zdjęcie: Toni Reed z Unsplash

Jak już wspominałem w (How Postman Engineering Does Microservices), wszystkie architektury oprogramowania są nieustannie w toku. Działanie w prawdziwym świecie oznacza od czasu do czasu przewartościowanie starych sposobów myślenia w celu dostosowania się do nowych okoliczności. To naturalna ewolucja projektowania oprogramowania.

Oto historia o tym, jak inżynierowie firmy Postman opracowali bramę sieciową Bifrost, wykorzystując usługę, która urosła zbytnio.

Zespoły programistyczne w Postman

Większość zespołów programistycznych w firmie Postman pracuje w zespołach wielofunkcyjnych skupionych na jednej podstawowej domenie, takiej jak dokumentacja lub kontrola wersji . Kierując się zasadami projektowania opartego na domenie , każdy oddział opracowuje wewnętrzne mikrousługi i funkcje programu Postman dla użytkowników programu Postman.

Podczas gdy większość inżynierów pracuje w zespoły, niektórzy pracują w zespołach funkcjonalnych, które tworzą komponenty wspólne dla całej organizacji inżynierskiej. Zespół Server Foundation jest przykładem funkcjonalnego zespołu w firmie Postman. Inżynierowie ci tworzą narzędzia używane przez inne drużyny do budowania, wysyłania i obserwacji ich własnych cech. W tym zespole mieszkają również lokalni eksperci od AWS i infrastruktury.

the Server Foundation team jest przykładem funkcjonalnego zespołu w Postman, który tworzy i zarządza materiałami używanymi w całej organizacji inżynierskiej

Większość mikrousług w Postman jest luźno połączone, aby mogły ewoluować niezależnie od innych zespołów. Niestety, czasami usługa może być zbyt duża, zapewniając szeroki wachlarz pozornie niepowiązanych usług. Usługi te pozwalają zespołowi na szybkie iteracje, ale mogą zacząć zachowywać się bardziej jak rozdęty monolit, wielka kula błota lub jakkolwiek chcesz nazwać te nieporęczne stworzenia.

Kiedy dzieje się to w Postman, wielu inżynierów w różnych zespołach w końcu współtworzy kod, wymagając starannej koordynacji w każdym zespole dla każdej aktualizacji.

Monolityczna usługa synchronizacji

Jedna z usług Postman, która urosła zbyt duża, aby efektywne zarządzanie nazywa się synchronizacją. Ma on zniechęcające zadanie synchronizowania całej aktywności klienta Postman na komputerze lokalnym z serwerami Postman. Każde działanie użytkownika w programie Postman skutkuje serią wywołań API obsługiwanych przez połączenia Websocket zgodnie z wzorcem publikowania-subskrybowania , dzięki czemu informacje przepływają w czasie rzeczywistym między użytkownikami i między zespołami.

Na przykład dzieje się tak, gdy logujesz się do programu Postman i aktualizujesz kolekcję:

  1. Dodajesz parametr do kolekcji Postman.
  2. Listonosz prowadzi zapis aktualizacji w kontroli wersji przechowywany w Twoim profilu.
  3. Listonosz wyświetla najnowsze informacje przeglądającym kolekcję w czasie rzeczywistym.

Synchronizacja była pierwotnie przeznaczona do obsługi transakcji bazy danych, takich jak aktualizowanie kolekcji. Jednak tym razem w zeszłym roku Sync zarządzał również dodatkowymi czynnościami, takimi jak powiadamianie i wyświetlanie najnowszej wersji wszystkim subskrybentom kolekcji.

Synchronizacja pod ciśnieniem

Kiedy budujesz samochód, rama jest główną konstrukcją nośną, do której komponenty są dołączone. Małe pęknięcie w ramie może nie wydawać się wielką sprawą. Prawdopodobnie mógłby pozostać niezauważony podczas jazdy z małą prędkością. Jednak przy wyższych prędkościach występuje efekt tętnienia, który zwiększa niewspółosiowość. Pozornie nieznaczne pęknięcie pozwala na wzmocnienie wibracji w pozostałej części pojazdu, aż przekształci się w płonący wrak.

„Rzeczy, które pozostaje niezauważony w mniejszych systemach staje się nieunikniony w bardziej złożonych systemach.”
Kunal Nagpal , kierownik techniczny w Postman

Synchronizacja była jedną z najwcześniejszych usług w firmie Postman, a jej monolityczna architektura umożliwiła zespołowi szybkie dostarczanie funkcji programu Postman. Z biegiem czasu zaczął wykonywać coraz więcej obowiązków. Do dziś usługa Sync nadal ma szeroki wpływ na całą organizację inżynieryjną, a wielu inżynierów odczuwa ból, gdy Sync zachowuje się nieoczekiwanie lub występuje zaplanowany przestój.

W 2019 roku Sync obsługiwał zarówno połączenia sieciowe, jak i bazę danych transakcje. Wraz z coraz większą współpracą między 11 milionami naszych użytkowników w tamtym czasie, Postman zbliżał się do miliona jednoczesnych połączeń przy szczytowym obciążeniu.

Jako podstawa praktycznie każdej mikrousługi w Postman, obciążenie Sync rosło.

  • Kaskadowa awaria z powodu przeciwciśnienia: Każde wdrożenie w Sync powoduje rozłączenie połączonych klientów Postman przez gniazda sieciowe. Gdy milion gniazd ponownie się łączy, zasoby serwera ulegają degradacji, co może skutkować większą liczbą rozłączeń, powodując przewidywalny, ale nieunikniony wzrost, którego przywrócenie może zająć od 6 do 8 godzin.
  • Wpływ na wrażenia użytkownika: Chociaż nie zdarzało się to często, zerwane połączenia oznaczały sporadyczne opóźnienia w wyświetlaniu najnowszych aktualizacji i aktywności w obszarze roboczym zespołu.
  • Wyższe koszty utrzymania : Ponieważ każdy oddział korzystał z Sync, praktycznie każdy inżynier w Postman musiał się nauczyć, jak obsłużyć zerwane połączenia, inicjować nowe, a następnie rozwiązywać wszelkie konflikty w danych.

Zespół Server Foundation wiedział, że chce zwiększyć wydajność połączeń WebSocket, a także obsługiwał je oddzielnie od Usługa synchronizacji. Cel był jasny, ale droga do niego nie była.

„To jest naturalna ewolucja projektowania oprogramowania. Mikrousługi zaczynają działać zwinnie, ale rosną i trzeba je z powrotem zlikwidować. Chcieliśmy oddzielić obsługę gniazd od Sync, ponieważ mieliśmy zamiar wprowadzić znacznie więcej funkcji. ”
Yashish Dua , inżynier oprogramowania w Listonosz

Niektóre usługi wewnętrzne stają się zbyt duże, co wymaga starannej koordynacji między zespołami

Oto, co się stało

Krok 1: Uzyskaliśmy poparcie organizacji

Pierwsze wyzwanie nie było techniczne. Nie było to pierwsze ambitne wdrożenie firmy Postman. Inżynieria nauczyła się z poprzednich odejść na drugi krąg, aby zacząć od ludzi. Począwszy od października 2019 roku inżynierowie Server Foundation przeprowadzili serię przeglądów poświęconych komunikowaniu celu szerszej organizacji i wyjaśnieniu korzyści dla wszystkich usług zależnych.

Jeśli ten nowy system się powiedzie, obsługa zerwanych połączeń a radzenie sobie z następstwami nie będzie już powszechne. To była prawdziwa zachęta dla innych zespołów inżynierów do wsparcia i migracji do nowego systemu. Ta otwarta komunikacja i koordynacja trwałyby przez cały czas trwania projektu.

Krok 2: Zidentyfikowaliśmy nieznane niewiadome

Inżynierowie wiedzieli, w jakim kierunku zmierzają. Mimo to obrali trochę czasu na przemyślenie wszystkich scenariuszy i lepsze zrozumienie podstawowych pojęć. Inżynierowie zaplanowali sesje badawcze z innymi interesariuszami w celu zidentyfikowania nieznanych niewiadomych, nieprzewidzianych warunków, które mogą stanowić większe ryzyko niż znane znane.

Chociaż organizacja Postman jest przyzwyczajona do badań i planowania, ta część procesu zajęło dużo więcej czasu niż zwykle ze względu na krytyczny charakter tej zmiany. Zbadali różne opcje, rozważali dodatkowe wymagania i opracowali plan na okres dwóch miesięcy.

Krok 3: Zbudowaliśmy bramę sieciową Bifrost

Bifrost składa się z dwie części:

  • Brama publiczna : Brama korzysta ze struktury internetowej Fastify i Amazon AWS ElastiCache for Redis jako centralny broker wiadomości do zarządzania wszystkimi połączeniami w sieci Web.
  • Prywatny interfejs API : API używa również Fastify jako frameworku WWW o niskim narzutie do proxy ruchu do innych wewnętrznych usług Postman.
Bifrost składa się z dwóch części: bramy publicznej i prywatny interfejs API

Krok 4: Przetestowaliśmy nową bramę

Gdy inżynierowie Postman są gotowi do wysłania funkcji, oczekuje się, że przetestują tę funkcję wraz z innymi powiązanymi funkcjami. Ponieważ prawie każda funkcja programu Postman opiera się na gniazdach internetowych, oznaczało to, że każda funkcja musiała zostać przetestowana pod kątem tego wydania. Ponadto platforma automatycznych testów gniazd internetowych nie została jeszcze skonfigurowana w Postman, więc wszystkie testy zostały zakończone ręcznie przed Bifrost może być wykorzystany w produkcji.

To była żmudna podróż, ale pod koniec stycznia 2020 roku inżynierowie mieli sprawdzoną koncepcję.

Krok 5: Przeprowadziliśmy migrację do nowej gateway

Wszyscy klienci Postman, tacy jak aplikacja Electron lub sieć Web, polegają na wstępnym wywołaniu ładowania początkowego do innej usługi podstawowej o nazwie Godserver. Ten serwer określa dostęp i konfigurację klientów oraz jest sposobem, w jaki inżynierowie kontrolują przyrostowe wdrażanie produktów. Ponieważ wszystko to było z góry określone i kontrolowane przez Godserver, migracja do bramy Bifrost nie wymagałaby pojedynczej aktualizacji kodu klienta Postman.

Zespół Server Foundation nakreślił kroki migracji oddziałów, wymagane zmiany kodu i konfigurację aplikować. W ciągu kilku tygodni zależne usługi zaczęły przechodzić z korzystania z Sync na Bifrost do obsługi połączeń websocket. Serwer Godserver kierował coraz większy ruch do nowej bramy sieciowej, aby zobaczyć, jak Bifrost poradził sobie z obciążeniem i zareagował na skrajne przypadki.

„To jak wymiana silnika w samolocie w połowie lot. ”
Numaan Ashraf , dyrektor ds. inżynierii w firmie Postman

Krok 6: My przeskalował usługę

Brama Bifrost działała!

Ale Postman pozyskał około miliona użytkowników, gdy brama była w fazie planowania i rozwoju. Inne zespoły inżynierów nie wstrzymały w tym czasie własnej pracy. Nowe funkcje współpracy, takie jak kontrola wersji i kontrola dostępu oparta na rolach (RBAC) , polegała na w dużej mierze na gniazdach internetowych, aby informacje były aktualizowane w czasie rzeczywistym. Pojawiło się mnóstwo nadchodzących wersji produktów, które naprawdę przetestowałyby nową bramę.

Bifrost był gotowy do obsługi zwiększonych wymagań i skalowania obsługi sieci Web.

  • Skalowanie poziome : W większości przypadków usługi Postman obsługują zwiększone użycie poprzez skalowanie do instancji o większej pojemności lub dodawanie większej liczby instancji obliczeniowych do floty. Dlatego inżynierowie w firmie Postman zwykle skalują w górę usługę, zwiększając rozmiar i moc obliczeniową AWS EC2 instancje, na przykład za pomocą AWS Elastic Beanstalk. Ale w przypadku Bifrost skalowanie obsługi gniazd internetowych out przy użyciu więcej maszyn. Jego optymalną wydajność uzyskuje się, gdy mniejsze egzemplarze są używane w dużych ilościach. Ten typ skalowania hiper-poziomego działa dobrze w przypadku Bifrost, ponieważ klienci nie wymagają dużej przepustowości sieci, a ograniczenie każdej maszyny do mniejszej liczby połączeń ogranicza zasięg awarii.
  • Nowy współczynnik obciążenia procesora i pamięci : Większość usług Postman może efektywnie skalować za pomocą jednego wymiaru skalowania, takiego jak procesor, pamięć lub opóźnienie. Jednak w przypadku Bifrost sprawy stają się nieco bardziej zniuansowane, ponieważ zarówno użycie pamięci, jak i procesora mają różny wpływ na operacje na różnych poziomach przepustowości. Aby to uwzględnić, Bifrost używa niestandardowej metryki skalowania opartej na współczynniku obciążenia. Współczynnik obciążenia to wielowymiarowe obliczenie, które nadaje niestandardowy nieliniowy profil skalowania.

Przyjrzyjmy się decyzjom architektonicznym i technologicznym podjętym przez inżynierów Postmana.

Architektura i stos technologiczny Bifrost

System Bifrost ma dwa główne składniki – bramę i interfejs API. Ta dwuczęściowa architektura jest sekretnym sosem stabilności i skalowalności systemu.

Bramka działa jako punkt końcowy dla wszystkich połączeń typu websocket. Chociaż komercyjne bramki są dostępne w sprzedaży, ważne było zachowanie starszej logiki biznesowej nagromadzonej przez lata optymalizacji. Inżynierowie firmy Postman chcieli również w pełni kontrolować sposób obsługi gniazd sieciowych, na przykład gdyby chcieli wykorzystać protokół uzgadniania protokołu. W przypadku bramy Bifrost wykorzystali Amazon ElastiCache for Redis, umożliwiając im wysyłanie zapytań do pamięci podręcznej Redis za pomocą węzłów odczytujących i zapisujących.Dzielenie ruchu na dwa węzły w celu wykonywania operacji odczytu i zapisu dodatkowo pozwala zespołowi zoptymalizować wydajność.

„Bifrost to nasza brama dla wszystkich połączeń w sieci Web. Jest to proxy dla wszystkich klientów Postman i odpowiada za obsługę niskopoziomowych operacji gniazd dla wewnętrznych usług Postman. ”
Mudit Mehta , inżynier oprogramowania w firmie Postman

Większość innych usług w firmie Postman używa Sails jako platformy MVC czasu rzeczywistego dla Node.js . Jednak w przypadku bramy Bifrost inżynierowie potrzebowali wydajnej struktury zaplecza zdolnej do obsługi dużych wolumenów z szybkością i zoptymalizowanym wykorzystaniem pamięci. Po raz kolejny chcieli wejść głębiej w warstwę gniazd, poniżej abstrakcji wyższego poziomu dostarczonych przez Sails. Dlatego zdecydowali się na Fastify i rozwidlili oprogramowanie pośredniczące socketio-adapter , aby zoptymalizować je do własnego użytku przypadków.

brama Bifrost używała AWS, Redis i Fastify do obsługi gniazd sieciowych

Oprócz bramy, innym składnikiem Bifrost jest prywatny interfejs API, który przekazuje ruch do innych usług Postman. Opiera się na elastycznych regułach biznesowych, dlatego jest stale poddawany ponownej ocenie pod kątem tego, jak i gdzie przekierować ruch przychodzący.

„Proste komponenty. Złożona logika. ”
Kunal Nagpal , kierownik techniczny w firmie Postman

W przypadku obu komponentów zespół inżynierów postanowił stworzyć własną. Chociaż część Bifrost będąca bramą nie jest często aktualizowana, zespół ma pełną kontrolę nad tym, co dzieje się w głębszych warstwach obsługi protokołu internetowego. Część API Bifrost jest mózgiem operacji i konwertuje przychodzące wiadomości w czasie rzeczywistym na standardowe wywołania HTTP. Można go również szybciej aktualizować jako niezależny składnik Sync i bramki Bifrost.

Pamiętasz ten sekretny sos? Oddzielenie Bifrost do tych dwóch dyskretnych systemów umożliwia obu częściom optymalizację pod kątem ich własnych celów.

Podróż jeszcze się nie skończyła

Podobnie jak w przypadku wszystkich soczystych historii inżynieryjnych, to nie koniec . Zostawię was z kilkoma niebezpieczeństwami na temat tego, co będzie dalej w inżynierii Listonosza.

  • Zbuduj dodatkową nadmiarowość : pamięć podręczna Redis jest głównym brokerem wiadomości . Obsługa Websocket nadal opiera się na pojedynczym punkcie awarii, więc co się stanie, jeśli pamięć podręczna kiedykolwiek się zepsuje?
  • Zwiększ przepustowość i przepustowość : Brama może obecnie obsługiwać 10-krotną współbieżność, ale społeczność Postman szybko się rozwija, a inżynierowie opracowują więcej funkcji współpracy. Potrzeba obsługi większego ruchu w sieci pojawia się szybko.
  • Kontynuuj rozkładanie monolitu: Usługa synchronizacji zawiera zbiór innych usług splecionych w jej bazie kodu. Odłączenie obsługi gniazd od Sync rozluźnia kontrolę nad innymi usługami, więc inne usługi można teraz łatwiej odłączyć.

To był kolejny zakulisowy wgląd w sposób działania inżynierii Postmana. Czekajcie na więcej historii z okopów.

review Recenzja techniczna autorstwa Kunala Nagpala, Yashisha Dua, Mudit Mehta i Shamasis Bhattacharya.

Pierwotnie opublikowane pod adresem https://blog.postman.com 22 grudnia 2020 r.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *