Wie Postman Engineering eine Million gleichzeitiger Verbindungen behandelt

Veröffentlicht

Das Server Foundation-Team von Postman teilt die Entstehungsgeschichte des Bifrost-Websocket-Gateways

(22. Dezember 2020)

. Im Marvel Cinematic Universe ist Bifrost der Name der Regenbogenbrücke, die eine sofortige Reise zwischen den Bereichen von ermöglicht Götter und Menschlichkeit. In ähnlicher und ebenso magischer Weise können Postman-Clients mit unserem Bifrost-Websocket-Gateway sofort eine Verbindung zu Postman-Diensten herstellen.

Foto von Toni Reed auf Unsplash

Wie ich bereits in (Wie Postman Engineering Microservices ausführt) beschrieben habe, sind alle Softwarearchitekturen eine kontinuierliche Arbeit. In der realen Welt zu operieren bedeutet, gelegentlich alte Denkweisen neu zu bewerten, um sich an neue Umstände anzupassen. Das ist die natürliche Entwicklung des Software-Designs.

Hier ist die Geschichte, wie Postman-Ingenieure das Bifrost-Websocket-Gateway entwickelt haben, indem sie einen zu großen Service abgeschafft haben.

Entwicklungsteams bei Postbote

Die meisten Entwicklungsteams bei Postman arbeiten in funktionsübergreifenden Trupps, die sich auf eine einzelne Kerndomäne konzentrieren, z. B. Dokumentation oder Versionskontrolle . Ausgehend von den Prinzipien des domänengesteuerten Designs entwickelt jeder Trupp interne Microservices und Postman-Funktionen für Postman-Benutzer.

Während die meisten Ingenieure arbeiten Einige Teams arbeiten in Funktionsteams, die Komponenten erstellen, die von der gesamten technischen Organisation gemeinsam genutzt werden. Das Server Foundation-Team ist ein Beispiel für ein Funktionsteam bei Postman. Diese Ingenieure erstellen die Dienstprogramme, die von anderen Trupps verwendet werden, um ihre eigenen Funktionen zu erstellen, zu versenden und zu beobachten. In diesem Team befinden sich auch die ansässigen AWS- und Infrastrukturexperten.

der Server Foundation team ist ein Beispiel für ein funktionales Team bei Postman, das Inhalte erstellt und verwaltet, die in der gesamten Engineering-Organisation verwendet werden.

Die meisten Microservices bei Postman sind lose gekoppelt, damit sie sich unabhängig von anderen Teams entwickeln können. Leider kann ein Dienst manchmal zu groß werden und eine Vielzahl von scheinbar nicht zusammenhängenden Diensten bereitstellen. Diese Dienste ermöglichen es dem Team, schnell zu iterieren, verhalten sich jedoch möglicherweise eher wie ein aufgeblähter Monolith, ein großer Schlammball oder wie auch immer Sie diese unhandlichen Kreaturen nennen möchten.

Wenn dies bei Postman passiert, viele Ingenieure Über verschiedene Teams hinweg tragen sie letztendlich zum Code bei und erfordern eine sorgfältige Koordination zwischen jedem Team für jedes Update.

Der monolithische Synchronisierungsdienst

Einer der Postman-Dienste, für die zu groß geworden ist effizient verwaltet werden heißt Sync. Es hat die entmutigende Aufgabe, alle Aktivitäten im Postman-Client auf Ihrem lokalen Computer mit Postman-Servern zu synchronisieren. Jede Benutzeraktion in Postman führt zu einer Reihe von API-Aufrufen, die über Websocket-Verbindungen nach einem Publish-Subscribe-Muster verarbeitet werden, sodass Informationen in Echtzeit zwischen Benutzern und Benutzern fließen Teamübergreifend.

Dies geschieht beispielsweise, wenn Sie sich bei Postman anmelden und eine Sammlung aktualisieren:

  1. Sie fügen der Postman-Sammlung einen Parameter hinzu.
  2. Postman zeichnet das Update in der Versionskontrolle auf, das in Ihrem Profil gespeichert ist.
  3. Postman zeigt den Zuschauern der Sammlung die neuesten Informationen in Echtzeit an.

Die Synchronisierung sollte ursprünglich Datenbanktransaktionen wie das Aktualisieren einer Sammlung verarbeiten. Letztes Jahr um diese Zeit verwaltete Sync jedoch auch zusätzliche Aktivitäten, z. B. das Benachrichtigen und Anzeigen der neuesten Version für alle Abonnenten der Sammlung.

Unter Druck synchronisieren

Wenn Sie ein Auto bauen, ist der Rahmen die Haupttragstruktur für alle anderen Komponenten sind angebracht. Ein winziger Riss im Rahmen scheint keine große Sache zu sein. Es könnte wahrscheinlich unbemerkt bleiben, wenn man mit niedrigen Geschwindigkeiten herumfährt. Bei höheren Geschwindigkeiten kommt es jedoch zu einem Welleneffekt, der zu Fehlausrichtungen führt. Durch den scheinbar unbedeutenden Riss können sich die Vibrationen im gesamten Fahrzeug verstärken, bis sie zu einem brennenden Wrack eskalieren.

bleibt in kleineren Systemen unbemerkt und wird in komplexeren Systemen unausweichlich.”
Kunal Nagpal , technischer Leiter bei Postman

Sync war einer der frühesten Dienste bei Postman, und seine monolithische Architektur ermöglichte es dem Team, Postman-Funktionen schnell zu versenden. Im Laufe der Zeit begann es, immer mehr Verantwortlichkeiten zu übernehmen. Bis heute hat der Sync-Service einen weitreichenden Einfluss auf die gesamte Engineering-Organisation, und viele Ingenieure spüren den Schmerz, wenn sich Sync unerwartet verhält oder geplante Ausfallzeiten auftreten.

Im Jahr 2019 hat Sync sowohl Websocket-Verbindungen als auch Datenbanken verarbeitet Transaktionen. Mit der zunehmenden Zusammenarbeit zwischen unseren 11 Millionen Benutzern zu dieser Zeit näherte sich Postman einer Million gleichzeitiger Verbindungen bei Spitzenlast.

Als Grundlage für praktisch jeden Microservice bei Postman nahm die Belastung von Sync zu.

  • Kaskadierungsfehler aufgrund von Gegendruck: Bei jeder Bereitstellung für die Synchronisierung werden die verbundenen Postman-Clients getrennt über Websockets. Wenn eine Million Sockets wieder verbunden werden, werden die Serverressourcen beeinträchtigt, was zu weiteren Unterbrechungen führen kann. Dies führt zu einem vorhersehbaren, aber unvermeidbaren Anstieg, dessen Wiederherstellung 6 bis 8 Stunden dauern kann.
  • Beeinträchtigung der Benutzererfahrung: Obwohl dies nicht häufig vorkam, bedeuteten unterbrochene Verbindungen eine gelegentliche Verzögerung beim Anzeigen der neuesten Updates und Aktivitäten in einem Teamarbeitsbereich.
  • Höhere Wartungskosten : Da sich jeder Trupp auf Sync stützte, musste praktisch jeder Ingenieur bei Postman lernen, wie man das macht Behandeln Sie unterbrochene Verbindungen, initiieren Sie neue und gleichen Sie dann alle Konflikte in den Daten aus.

Das Server Foundation-Team wusste, dass es die Effizienz von Websocket-Verbindungen steigern und sie auch getrennt von den Verbindungen behandeln wollte Synchronisierungsdienst. Das Ziel war klar, der Weg dorthin jedoch nicht.

„Dies ist die natürliche Entwicklung des Software-Designs. Microservices beginnen flink, aber sie bauen sich auf und müssen wieder abgebaut werden. Wir wollten das Socket-Handling von Sync trennen, weil wir viel mehr Funktionen einführen wollten. “
Yashish Dua , Software-Ingenieur bei Postbote

Einige interne Dienste werden zu groß und erfordern eine sorgfältige Koordination zwischen den Teams

Folgendes ist passiert

Schritt 1: Wir haben ein organisatorisches Buy-in

Die erste Herausforderung war keine technische. Dies war nicht der erste ehrgeizige Rollout von Postman. Das Ingenieurwesen hatte aus früheren Erfahrungen gelernt, um mit den Menschen zu beginnen. Ab Oktober 2019 führten die Ingenieure der Server Foundation eine Reihe von Überprüfungen durch, um das Ziel der breiteren Organisation mitzuteilen und den Nutzen für alle abhängigen Dienste zu erläutern.

Wenn dieses neue System erfolgreich war, wurden unterbrochene Verbindungen behandelt und der Umgang mit den Folgen wäre nicht mehr alltäglich. Dies war ein echter Anreiz für die anderen Entwicklungsteams, das neue System zu unterstützen und auf dieses zu migrieren. Diese offene Kommunikation und Koordination würde während der gesamten Dauer dieses Projekts fortgesetzt.

Schritt 2: Wir identifizierten die unbekannten Unbekannten

Das Engineering kannte die Richtung, in die sie sich bewegten. Trotzdem gingen sie einige Zeit, um alle Szenarien zu durchdenken und die zugrunde liegenden Konzepte besser zu verstehen. Die Ingenieure planten Erkundungssitzungen mit anderen Interessengruppen, um unbekannte Unbekannte zu identifizieren. Diese unvorhersehbaren Bedingungen können ein größeres Risiko darstellen als die bekannten bekannten.

Während die Postman-Organisation an Forschung und Planung gewöhnt ist, ist dieser Teil des Prozesses dauerte aufgrund der kritischen Natur dieser Änderung viel länger als normal. Sie untersuchten verschiedene Optionen, berücksichtigten zusätzliche Anforderungen und entwickelten innerhalb von zwei Monaten einen Plan.

Schritt 3: Wir bauten das Bifrost-Websocket-Gateway

Der Bifrost besteht aus Zwei Teile:

  • Öffentliches Gateway : Das Gateway verwendet das Fastify-Webframework und Amazon AWS ElastiCache für Redis als zentraler Nachrichtenbroker zum Verwalten aller Websocket-Verbindungen.
  • Private API : Die API Verwendet Fastify auch als Webframework mit geringem Overhead, um den Datenverkehr zu anderen internen Postman-Diensten zu übertragen.
Bifrost besteht aus zwei Teilen: einem öffentlichen Gateway und einem private API

Schritt 4: Wir haben das neue Gateway getestet

Wenn Postman-Ingenieure bereit sind, eine Funktion zu versenden, Von ihnen wird erwartet, dass sie die Funktion zusammen mit verwandten Funktionen testen. Da fast jedes Postman-Feature auf Websockets basiert, musste jedes einzelne Feature für diese Version getestet werden. Darüber hinaus wurde bei Postman noch kein Framework für automatisierte Tests von Websockets eingerichtet, sodass alle Tests vor Bifrost manuell abgeschlossen wurden könnte in der Produktion verwendet werden.

Dies war eine mühsame Reise, aber bis Ende Januar 2020 verfügte das Engineering über einen funktionierenden Proof of Concept.

Schritt 5: Wir sind auf die neue migriert Gateway

Alle Postman-Clients, z. B. die Electron-App oder das Web, sind auf einen ersten Bootstrap-Aufruf eines anderen Kerndienstes namens Godserver angewiesen. Dieser Server bestimmt den Zugriff und die Konfiguration der Clients und steuert das Engineering inkrementelle Produkteinführungen. Da dies alles vom Godserver vorgegeben und gesteuert wurde, würde für die Migration auf das Bifrost-Gateway keine einzige Postman-Client-Code-Aktualisierung erforderlich sein.

Das Server Foundation-Team erläuterte die Migrationsschritte der Squads, die erforderlichen Codeänderungen und die Konfiguration bewerben. Im Laufe einiger Wochen begannen abhängige Dienste, sich von der Synchronisierung auf die Bifrost-basierte Abwicklung ihrer Websocket-Verbindungen zu verlagern. Der Godserver leitete immer mehr Verkehr zum neuen Websocket-Gateway um, um zu sehen, wie Bifrost mit der Last umging und auf Randfälle reagierte.

„Es ist, als würde man einen Motor in einem Flugzeug in der Mitte wechseln. Flug. ”
Numaan Ashraf , technischer Direktor bei Postman

Schritt 6: Wir Skalierte den Service

Das Bifrost-Gateway funktionierte!

Aber Postman hatte ungefähr eine Million weitere Benutzer gewonnen, während das Gateway in Planung und Entwicklung war. Und die anderen Ingenieurteams hatten in dieser Zeit ihre eigene Arbeit nicht unterbrochen. Neue Funktionen für die Zusammenarbeit, wie Versionskontrolle und rollenbasierte Zugriffskontrolle (RBAC) , wurden verwendet stark auf Websockets, damit Informationen in Echtzeit aktualisiert werden können. Es gab eine Flut kommender Produktversionen, die das neue Gateway wirklich testen würden.

Bifrost war bereit, die gestiegenen Anforderungen und die Skalierung der Websocket-Handhabung zu unterstützen.

  • Horizontale Skalierung : In den meisten Fällen verarbeiten Postman-Dienste die erhöhte Nutzung, indem sie entweder auf Instanzen mit höherer Kapazität skalieren oder der Flotte mehr Recheninstanzen hinzufügen. Daher skalieren Ingenieure bei Postman normalerweise up einen Service, indem sie die Größe und Rechenleistung von AWS EC2 erhöhen Instanzen, z. B. mithilfe von AWS Elastic Beanstalk. Für Bifrost skaliert die Websocket-Behandlung jedoch out mithilfe von more Maschinen. Die optimale Effizienz wird erreicht, wenn kleinere Instanzen in großer Anzahl verwendet werden. Diese Art der hyperhorizontalen Skalierung eignet sich gut für Bifrost, da Clients keinen hohen Netzwerkdurchsatz benötigen und die Beschränkung jeder Maschine auf weniger Verbindungen den Explosionsradius von Fehlern begrenzt.
  • Neuer Auslastungsfaktor von CPU und Speicher : Die meisten Postman-Dienste können effektiv mit einer einzigen Dimension der Skalierungsmetrik skaliert werden, z. B. CPU, Speicher oder Latenz. Bei Bifrost werden die Dinge jedoch etwas differenzierter, da sowohl die Speicher- als auch die CPU-Auslastung unterschiedliche Auswirkungen auf den Betrieb auf verschiedenen Durchsatzstufen haben. Um dies zu berücksichtigen, verwendet Bifrost eine benutzerdefinierte Skalierungsmetrik, die auf dem Lastfaktor basiert. Der Lastfaktor ist eine mehrdimensionale Berechnung, die ein benutzerdefiniertes nichtlineares Skalierungsprofil vermittelt.

Lassen Sie uns die Architektur- und Technologieentscheidungen von Postman Engineering untersuchen.

Die Bifrost-Architektur und der Tech-Stack

Das Bifrost-System hat zwei Hauptkomponenten – ein Gateway und eine API. Diese zweiteilige Architektur ist die geheime Grundlage für die Stabilität und Skalierbarkeit des Systems.

Das Gateway fungiert als Endpunkt für alle Websocket-Verbindungen. Obwohl kommerzielle Gateways zum Kauf angeboten werden, war es wichtig, die alte Geschäftslogik beizubehalten, die sich über Jahre der Optimierung angesammelt hat. Postman-Ingenieure wollten auch vollständig steuern, wie Websockets behandelt werden, beispielsweise wenn sie den Protokoll-Handshake nutzen möchten. Für das Bifrost-Gateway verwendeten sie Amazon ElastiCache für Redis, sodass sie den Redis-Cache mithilfe von Lese- und Schreibknoten abfragen konnten.Durch die Aufteilung des Datenverkehrs in zwei Knoten für Lese- und Schreibvorgänge kann das Team die Leistung weiter optimieren.

„Bifrost ist unser Gateway für alle Websocket-Verbindungen. Es ist ein Proxy für alle Postman-Clients und für die Abwicklung von Socket-Vorgängen auf niedriger Ebene für interne Postman-Dienste verantwortlich. ”
Mudit Mehta , Softwareentwickler bei Postman

Die meisten anderen Dienste bei Postman verwenden Sails als Echtzeit-MVC-Framework für Node.js. . Für das Bifrost-Gateway benötigten die Ingenieure jedoch ein leistungsfähiges Backend-Framework, das große Volumes schnell und mit optimierter Speichernutzung verarbeiten kann. Wieder einmal wollten sie tiefer in die Socket-Ebene vordringen, unterhalb der übergeordneten Abstraktionen, die von Sails bereitgestellt wurden. Also wandten sie sich an Fastify und gabelten die Middleware Socketio-Adapter , um sie für den eigenen Gebrauch zu optimieren Fälle.

Das Bifrost-Gateway verwendete AWS, Redis und Fastify, um Websockets

Neben dem Gateway ist die andere Komponente von Bifrost die private API, die den Datenverkehr an andere Postman-Dienste weiterleitet. Es basiert auf flexiblen Geschäftsregeln und wird daher ständig dahingehend überprüft, wie und wo eingehender Datenverkehr weitergeleitet werden soll.

„Einfache Komponenten. Komplexe Logik. ”
Kunal Nagpal , technischer Leiter bei Postman

Für beide Komponenten, Das Engineering-Team beschloss, ihre eigenen zu rollen. Obwohl der Gateway-Teil von Bifrost nicht häufig aktualisiert wird, hat das Team die volle Kontrolle darüber, was in den tieferen Schichten der Websocket-Handhabung geschieht. Der API-Teil von Bifrost ist das Gehirn der Operation und konvertiert eingehende Echtzeitnachrichten in Standard-HTTP-Aufrufe. Es kann auch als unabhängige Komponente von Sync und dem Bifrost-Gateway schneller aktualisiert werden.

Erinnern Sie sich an diese geheime Sauce? Durch die Entkopplung von Bifrost in diese beiden diskreten Systeme können beide Teile für ihre eigenen Ziele optimiert werden.

Die Reise ist noch lange nicht vorbei

Wie bei allen saftigen technischen Geschichten ist dies nicht das Ende . Ich werde Ihnen ein paar Cliffhanger überlassen, was als nächstes für Postman Engineering ansteht.

  • Zusätzliche Redundanz erstellen : Der Redis-Cache ist ein zentraler Nachrichtenbroker . Die Websocket-Behandlung hängt immer noch von einem einzelnen Fehlerpunkt ab. Was passiert also, wenn der Cache jemals ausfällt?
  • Erhöhen Sie die Bandbreite und den Durchsatz : Das Gateway kann derzeit 10x Parallelität verarbeiten, aber die Postman-Community wächst schnell und das Engineering baut mehr Funktionen für die Zusammenarbeit auf. Die Notwendigkeit, mehr Websocket-Verkehr zu verarbeiten, steigt schnell.
  • Zerlegen Sie den Monolithen weiter: Die Der Synchronisierungsdienst enthält ein Durcheinander anderer Dienste, die in seiner Codebasis verflochten sind. Durch das Entkoppeln der Socket-Handhabung von Sync werden andere Dienste weniger in den Griff bekommen, sodass andere Dienste jetzt einfacher abgezogen werden können.

Dies war ein weiterer Blick hinter die Kulissen der Funktionsweise von Postman Engineering. Weitere Geschichten aus den Schützengräben.

🙏🏼 Technische Überprüfung durch Kunal Nagpal, Yashish Dua, Mudit Mehta und Shamasis Bhattacharya.

Ursprünglich veröffentlicht unter https://blog.postman.com am 22. Dezember 2020.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.