Comment Postman Engineering gère un million de connexions simultanées

Léquipe Server Foundation de Postman partage lhistoire dorigine de la passerelle Websocket Bifrost

(22 décembre 2020)

Dans lunivers cinématographique Marvel, Bifrost est le nom du pont arc-en-ciel qui permet un voyage instantané entre les royaumes de dieux et humanité. De même, et tout aussi par magie, notre passerelle Websocket Bifrost permet aux clients Postman de se connecter instantanément aux services Postman.

Photo de Toni Reed sur Unsplash

Comme je lai déjà expliqué dans (How Postman Engineering Does Microservices), toutes les architectures logicielles sont un travail continu en cours. Opérer dans le monde réel signifie parfois réévaluer les anciennes façons de penser pour sadapter à de nouvelles circonstances. Telle est l’évolution naturelle de la conception de logiciels.

Voici l’histoire de la façon dont les ingénieurs de Postman ont développé la passerelle Websocket Bifrost en détruisant un service devenu trop grand.

Les équipes de développement de Postman

La plupart des équipes de développement de Postman travaillent dans des équipes interfonctionnelles concentrées sur un seul domaine principal, comme la documentation ou le contrôle de version . Guidée par les principes de la conception axée sur le domaine , chaque équipe développe des microservices internes et des fonctionnalités Postman pour les utilisateurs de Postman.

Alors que la plupart des ingénieurs travaillent dans escouades, certains travaillent dans des équipes fonctionnelles qui construisent des composants partagés dans toute lorganisation dingénierie. Léquipe Server Foundation est un exemple déquipe fonctionnelle chez Postman. Ces ingénieurs créent les utilitaires utilisés par dautres escouades pour construire, expédier et observer leurs propres fonctionnalités. Cest également dans cette équipe que résident les experts AWS et dinfrastructure résidents.

la Server Foundation team est un exemple déquipe fonctionnelle chez Postman qui crée et gère des éléments utilisés dans lensemble de lorganisation dingénierie.

La plupart des microservices de Postman sont lâches couplés afin quils puissent évoluer indépendamment des autres équipes. Malheureusement, un service peut parfois devenir trop volumineux, fournissant une gamme de services apparemment sans rapport. Ces services permettent à léquipe ditérer rapidement, mais peuvent commencer à agir davantage comme un monolithe gonflé, une grosse boule de boue ou tout ce que vous voulez appeler ces créatures lourdes.

Lorsque cela se produit chez Postman, de nombreux ingénieurs au sein de différentes équipes finissent par contribuer au code, ce qui nécessite une coordination minutieuse entre chaque équipe pour chaque mise à jour.

Le service de synchronisation monolithique

Lun des services Postman qui est devenu trop important pour être géré efficacement sappelle Sync. Il a la tâche ardue de synchroniser toute lactivité du client Postman sur votre machine locale avec les serveurs Postman. Chaque action de lutilisateur dans Postman entraîne une série dappels dAPI traités via des connexions Websocket, suivant un modèle de publication-abonnement , de sorte que les informations circulent en temps réel entre les utilisateurs et à travers les équipes.

Par exemple, voici ce qui se passe lorsque vous vous connectez à Postman et mettez à jour une collection:

  1. Vous ajoutez un paramètre à la collection Postman.
  2. Postman conserve un enregistrement de la mise à jour dans le contrôle de version stocké avec votre profil.
  3. Postman affiche les dernières informations aux téléspectateurs de la collection en temps réel.

Sync était à lorigine destiné à gérer les transactions de base de données, comme la mise à jour dune collection. Cependant, à la même époque lannée dernière, Sync a également géré des activités supplémentaires, telles que la notification et laffichage de la dernière version à tous les abonnés à la collection.

Synchronisation sous pression

Lorsque vous construisez une voiture, le cadre est la structure de support principale à laquelle tous les autres les composants sont attachés. Une petite fissure dans le cadre peut ne pas sembler un gros problème. Il pourrait probablement passer inaperçu en roulant à basse vitesse. À des vitesses plus élevées, cependant, il y a un effet dentraînement qui augmente les désalignements. La fissure apparemment insignifiante permet aux vibrations de s’amplifier dans le reste du véhicule jusqu’à ce qu’elles dégénèrent en une épave enflammée.

passe inaperçu dans les petits systèmes devient incontournable dans les systèmes plus complexes.”
Kunal Nagpal , responsable de lingénierie chez Postman

Sync était lun des premiers services de Postman, et son architecture monolithique permettait à léquipe de livrer rapidement les fonctionnalités de Postman. Au fil du temps, il a commencé à assumer de plus en plus de responsabilités. À ce jour, le service Sync a toujours une influence généralisée au sein de lorganisation dingénierie, et de nombreux ingénieurs ressentent la douleur lorsque Sync se comporte de manière inattendue ou quil y a un temps darrêt planifié.

En 2019, Sync gérait à la fois les connexions Websocket et la base de données transactions. Avec de plus en plus de collaboration entre nos 11 millions dutilisateurs à ce moment-là, Postman approchait du million de connexions simultanées à la charge maximale.

En tant que fondement de pratiquement tous les microservices de Postman, la tension sur Sync augmentait.

  • Échec en cascade dû à une contre-pression: Chaque déploiement vers Sync entraîne la déconnexion des clients Postman connectés sur des Websockets. Lorsquun million de sockets se reconnectent, les ressources du serveur sont dégradées, ce qui peut entraîner davantage de déconnexions, provoquant une surtension prévisible mais inévitable dont la récupération peut prendre de 6 à 8 heures.
  • Impact sur lexpérience utilisateur: Même si cela ne se produisait pas souvent, les connexions interrompues signifiaient parfois un retard dans laffichage des dernières mises à jour et de lactivité dans un espace de travail déquipe.
  • Coût de maintenance plus élevé : étant donné que chaque équipe comptait sur Sync, pratiquement tous les ingénieurs de Postman devaient apprendre à gérer les connexions abandonnées, en lancer de nouvelles, puis réconcilier les conflits dans les données.

Léquipe de Server Foundation savait quelle souhaitait augmenter lefficacité des connexions websocket et les traiter séparément du Service de synchronisation. La destination était claire, mais pas le chemin pour y arriver.

«Cest lévolution naturelle de la conception de logiciels. Les microservices démarrent de manière agile, mais ils se développent et doivent être rétablis. Nous voulions séparer la gestion des sockets de Sync parce que nous étions sur le point d’introduire beaucoup plus de fonctionnalités. »
Yashish Dua , ingénieur logiciel chez Facteur

certains services internes deviennent trop volumineux et nécessitent une coordination minutieuse entre les équipes

Voici ce qui sest passé

Étape 1: nous avons obtenu ladhésion de lorganisation

Le premier défi à relever nétait pas dordre technique. Ce n’était pas le premier déploiement ambitieux de Postman. Lingénierie avait appris des remises de gaz passées pour commencer avec les gens. À partir doctobre 2019, les ingénieurs de Server Foundation ont organisé une série dexamens consacrés à la communication de lobjectif à lensemble de lorganisation et à lexplication des avantages pour tous les services dépendants.

Si ce nouveau système réussissait, gérer les connexions interrompues et faire face aux conséquences ne serait plus banal. Ce fut une réelle incitation pour les autres équipes dingénierie à supporter et à migrer vers le nouveau système. Cette communication ouverte et cette coordination se poursuivraient pendant toute la durée de ce projet.

Étape 2: Nous avons identifié les inconnues inconnues

Les ingénieurs connaissaient la direction dans laquelle ils se dirigeaient. Malgré cela, ils ont pris un peu de temps pour réfléchir à tous les scénarios et mieux comprendre les concepts sous-jacents. Les ingénieurs ont programmé des sessions exploratoires avec dautres parties prenantes pour identifier les inconnues inconnues, les conditions imprévisibles qui peuvent poser un plus grand risque que les connues connues.

Bien que lorganisation Postman soit habituée à la recherche et à la planification, cette partie du processus a pris beaucoup plus de temps que la normale en raison de la nature critique de ce changement. Ils ont recherché différentes options, pris en compte les exigences auxiliaires, et ont élaboré un plan sur deux mois.

Étape 3: Nous avons construit la passerelle Websocket Bifrost

Le Bifrost est composé de deux parties:

  • Passerelle publique : la passerelle utilise le framework Web Fastify et Amazon AWS ElastiCache pour Redis en tant que courtier de messages central pour gérer toutes les connexions Websocket.
  • API privée : lAPI utilise également Fastify comme une infrastructure Web à faible coût pour proxy du trafic vers dautres services Postman internes.
Bifrost est composé de deux parties: une passerelle publique et un API privée

Étape 4: Nous avons testé la nouvelle passerelle

Lorsque les ingénieurs de Postman sont prêts à livrer une fonctionnalité, ils doivent tester la fonctionnalité, ainsi que toutes les fonctionnalités associées. Étant donné que presque toutes les fonctionnalités de Postman reposent sur des websockets, cela signifiait que chaque fonctionnalité devait être testée pour cette version. De plus, un cadre pour les tests automatisés des websockets n’avait pas encore été mis en place chez Postman, donc tous les tests ont été effectués manuellement avant Bifrost pourrait être utilisé en production.

Ce fut un voyage ardu, mais à la fin de janvier 2020, lingénierie avait une preuve de concept fonctionnelle.

Étape 5: Nous avons migré vers le nouveau gateway

Tous les clients Postman, tels que lapplication Electron ou le Web, reposent sur un appel initial damorçage à un autre service de base nommé Godserver. Ce serveur détermine l’accès et la configuration des clients, et c’est ainsi que l’ingénierie contrôle les déploiements incrémentiels de produits. Parce que tout était prédéterminé et contrôlé par le Godserver, la migration vers la passerelle Bifrost ne nécessiterait pas une seule mise à jour du code client Postman.

Léquipe de Server Foundation a décrit les étapes de migration des équipes, les changements de code requis et la configuration postuler. Au cours de quelques semaines, les services dépendants ont commencé à passer de lutilisation de Sync à la gestion basée sur Bifrost de leurs connexions Websocket. Le Godserver détournait de plus en plus de trafic vers la nouvelle passerelle websocket pour voir comment Bifrost gérait la charge et répondait aux cas extrêmes.

«Cest comme changer un moteur sur un avion en plein flight. ”
Numaan Ashraf , directeur de lingénierie chez Postman

Étape 6: Nous a fait évoluer le service

La passerelle Bifrost fonctionnait!

Mais Postman avait acquis un autre million dutilisateurs pendant la planification et le développement de la passerelle. Et les autres équipes dingénieurs navaient pas interrompu leur propre travail pendant ce temps. Les nouvelles fonctionnalités de collaboration, telles que le contrôle de version et le contrôle daccès basé sur les rôles (RBAC) , sont fiables fortement sur les Websockets pour que les informations soient mises à jour en temps réel. Il y avait une multitude de versions de produits à venir qui allaient vraiment tester la nouvelle passerelle.

Bifrost était prêt à prendre en charge les demandes croissantes et à faire évoluer la gestion des websockets.

  • Mise à léchelle horizontale : la plupart du temps, les services Postman gèrent une utilisation accrue en sadaptant à des instances de plus grande capacité ou en ajoutant davantage dinstances de calcul au parc. Ainsi, les ingénieurs de Postman mettent généralement à léchelle up un service en augmentant la taille et la puissance de calcul dAWS EC2 instances, par exemple, en utilisant AWS Elastic Beanstalk. Mais pour Bifrost, la gestion des sockets Web est out en utilisant plus machines. Son efficacité optimale est obtenue lorsque des instances de plus petite taille sont utilisées en grand nombre. Ce type de mise à léchelle hyper-horizontale fonctionne bien pour Bifrost car les clients nont pas besoin dun débit réseau élevé et la limitation de chaque machine à moins de connexions limite le rayon dexplosion des échecs.
  • Nouveau facteur de charge du processeur et de la mémoire : la plupart des services Postman peuvent évoluer efficacement avec une seule dimension de métrique de mise à léchelle, comme le processeur, la mémoire ou la latence. Cependant, pour Bifrost, les choses deviennent un peu plus nuancées car lutilisation de la mémoire et du processeur ont des impacts différents sur les opérations à différents niveaux de débit. Pour en tenir compte, Bifrost utilise une métrique de mise à léchelle personnalisée basée sur le facteur de charge. Le facteur de charge est un calcul multidimensionnel qui confère un profil de mise à léchelle non linéaire personnalisé.

Examinons les décisions architecturales et technologiques prises par lingénierie Postman.

Larchitecture et la technologie Bifrost

Le système Bifrost a deux composants principaux: une passerelle et une API. Cette architecture en deux parties est le secret de la stabilité et de lévolutivité du système.

La passerelle sert de point de terminaison pour toutes les connexions websocket. Même si des passerelles commerciales sont disponibles à lachat, il était important de préserver la logique métier héritée accumulée au fil des années doptimisation. Les ingénieurs Postman voulaient également contrôler entièrement la façon dont les Websockets sont gérés, par exemple, sils voulaient exploiter la poignée de main du protocole. Pour la passerelle Bifrost, ils ont utilisé Amazon ElastiCache pour Redis, ce qui leur a permis dinterroger le cache Redis à laide de nœuds de lecture et décriture.Le fractionnement du trafic en deux nœuds pour les opérations de lecture et décriture permet à léquipe doptimiser les performances.

«Bifrost est notre passerelle pour toutes les connexions Websocket. Il sagit dun proxy pour tous les clients Postman et chargé de gérer les opérations de socket de bas niveau pour les services Postman internes. « 
Mudit Mehta , ingénieur logiciel chez Postman

La plupart des autres services de Postman utilisent Sails comme cadre MVC en temps réel pour Node.js . Pour la passerelle Bifrost, cependant, les ingénieurs avaient besoin dun cadre backend performant capable de gérer des volumes élevés avec une vitesse et une utilisation optimisée de la mémoire. Une fois de plus, ils voulaient aller plus loin dans la couche socket, en dessous des abstractions de plus haut niveau fournies par Sails. Ils se sont donc tournés vers Fastify et ont bifurqué le middleware socketio-adapter pour loptimiser pour leur propre usage cas.

la passerelle Bifrost a utilisé AWS, Redis et Fastify pour gérer les Websockets

En plus de la passerelle, lautre composant de Bifrost est lAPI privée qui achemine le trafic vers dautres services Postman. Il est basé sur des règles métier flexibles, et donc constamment réévalué pour savoir comment et où transférer le trafic entrant.

«Des composants simples. Logique complexe. »
Kunal Nagpal , responsable de lingénierie chez Postman

Pour les deux composants, léquipe dingénierie a décidé de rouler la leur. Bien que la partie passerelle de Bifrost ne soit pas fréquemment mise à jour, léquipe a un contrôle total sur ce qui se passe dans les couches plus profondes de la gestion des Websocket. La partie API de Bifrost est le cerveau de lopération et convertit les messages entrants en temps réel en appels HTTP standard. Il peut également être mis à jour plus rapidement en tant que composant indépendant de Sync et de la passerelle Bifrost.

Vous vous souvenez de cette sauce secrète? Le découplage de Bifrost en ces deux systèmes discrets permet aux deux parties doptimiser pour leurs propres objectifs.

Le voyage est loin dêtre terminé

Comme pour toutes les histoires dingénierie juteuses, ce nest pas la fin . Je vous laisse avec quelques cliffhangers sur ce qui va suivre pour lingénierie Postman.

  • Créer une redondance supplémentaire : le cache Redis est un courtier de messages central . La gestion de Websocket repose toujours sur un point de défaillance unique, alors que se passe-t-il si le cache tombe un jour en panne?
  • Augmenter la bande passante et le débit : La passerelle est actuellement capable de gérer la concurrence 10x, mais la communauté Postman se développe rapidement et lingénierie développe plus de fonctionnalités de collaboration. Le besoin de gérer plus de trafic Websocket se fait rapidement sentir.
  • Continuez à décomposer le monolithe: Le Le service de synchronisation contient un fouillis dautres services entrelacés dans sa base de code. Le découplage de la gestion des sockets de Sync libère son emprise sur les autres services, de sorte que dautres services peuvent désormais être retirés plus facilement.

Cétait un autre aperçu des coulisses du fonctionnement de lingénierie de Postman. Restez à lécoute pour plus dhistoires sur les tranchées.

🙏🏼 Revue technique par Kunal Nagpal, Yashish Dua, Mudit Mehta et Shamasis Bhattacharya.

Publié à lorigine à https://blog.postman.com le 22 décembre 2020.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *