Comment American Express a choisi Go pour moderniser ses systèmes ?
“Ce qui distingue Go des autres langages de programmation, c’est la charge cognitive. Vous pouvez faire davantage avec moins de code, ce qui rend plus facile la réflexion et la compréhension du code que vous finissez par écrire.
La majorité du code Go finit par avoir un aspect assez similaire. Ainsi, même si vous travaillez avec une base de code totalement nouvelle, vous pouvez démarrer assez rapidement.”Glen Balliet, Directeur de l’Ingénierie des plateformes de fidélité chez American Express
Fondée en 1850, American Express est une entreprise de paiement à l’échelle mondiale, proposant notamment des paiements via cartes de crédit ou de débit.
Les systèmes de traitement des paiements d’American Express ont été développés tout au long de son histoire et ont été mis à jour à travers plusieurs évolutions architecturales.
En priorité, le traitement des paiements doit être rapide, en particulier pour de très gros volumes de transactions, avec une résilience intégrée à travers des systèmes qui doivent tous être conformes aux normes de sécurité et réglementaires. American Express veut améliorer notamment la rapidité et la scalabilité pour ses réseaux de paiement.
Modernisation des systèmes American Express
Le paysage des langages de programmation évolue de manière significative année après année, et cela American Express le comprend. Les systèmes actuels d’American Express ont été spécialement conçus pour gérer une grande concurrence et une faible latence, mais il était prévu que ces systèmes soient modifiés à l’avenir. Ainsi, au sein d’American Express la question de changer de langage afin de se moderniser se posait. L’équipe de la plateforme de paiement a donc décidé de prendre le temps d’identifier le langage idéal pour les besoins en constante évolution d’American Express. Il fallait trouver le langage qui permettait de gagner en rapidité et en scalabilité pour les services de paiements. Une autre problématique était de pouvoir faire monter en compétence les équipes techniques, ainsi que de rendre le code le plus maintenable possible.
Les équipes de la plateforme de paiement d’American Express ont été parmi les premières à évaluer Go, en 2016. Pour rappeler le contexte de Go à ce moment, la version 1 est sortie en mars 2012, en 2019 c’est la version go1.12 qui est utilisé. Ces équipes se sont concentrées sur des cas d’utilisation tels que les micro-services (très utilisé dans l’architecture des services American Express), le routage des transactions et la répartition des charges.
De nombreux développeurs d’American Express étaient déjà familiers avec les capacités du langage et souhaitaient tester Go pour sa qualité à pouvoir créer des applications à haute concurrence et faible latence (comme des répartiteurs de charge transactionnels personnalisés). Dans cet objectif, les équipes ont commencé à parler à la direction de vouloir utiliser Go sur la plateforme de paiement d’American Express.
“Nous voulions trouver le langage optimal pour écrire des applications rapides et efficaces de traitement des paiements”, déclare Benjamin Cane, vice-président et ingénieur chez American Express. “Pour ce faire, nous avons lancé une compétition interne des langages de programmation dans le but de déterminer lequel correspondait le mieux à nos besoins en termes de conception et de performances.”
Comparaison des langages
Pour leur évaluation, l’équipe de Cane a choisi de développer un micro-service avec quatre langages de programmation différents. Ils ont ensuite comparé ces quatre langages en termes de vitesse/de performance, d’outils, de tests et de facilité de développement.
Pour ce micro-service, ils ont opté pour un convertisseur ISO8583 en JSON. L’ISO8583 est une norme internationale pour les transactions financières, largement utilisée dans le réseau de paiement d’American Express. En ce qui concerne les langages de programmation, ils ont choisi de comparer le C++, Go, Java et Node.js. À l’exception de Go, tous ces langages étaient déjà en usage chez American Express.
D’un point de vue de la vitesse, Go a atteint la deuxième meilleure performance à 140 000 requêtes par seconde, ce qui n’était pas très loin de la meilleure performance autour de 167 000 requêtes par secondes. Go a montré qu’il excelle lorsqu’il est utilisé pour les micro-services côté serveur.
Bien que Go n’ait pas été le langage le plus rapide testé, ses puissants outils ont renforcé ses résultats globaux. Le cadre de tests intégré à Go, ses capacités de profilage et ses outils de benchmarking ont impressionné l’équipe. “Il est facile d’écrire des tests efficaces en Go”, déclare Cane. “Les fonctionnalités de benchmarking et de profilage facilitent l’optimisation de notre application. Associé à des temps de compilation rapides, Go facilite l’écriture de code bien testé et optimisé.”
Finalement, Go a été choisi par l’équipe comme le langage de prédilection pour la construction de micro-services à haute performance. Les outils, les cadres de test, les performances et la simplicité du langage ont tous été des facteurs clés dans cette décision.
Il est possible de consulter quelques benchmarks entre Go et d’autres langages sur des résultats à des algorithmes de type « recherche dans un arbre binaire » sur le site https://benchmarksgame-team.pages.debian.net.
Voici quelques exemples de pourquoi Go a été choisi :
- Le langage Go est simple et direct
- Encourage les bonnes pratiques
- La gestion d’erreur
- La gestion native de la documentation (Godoc par exemple)
- La gestion native de la concurrence
- Les outils mis à disposition (gofmt par exemple)
Go pour l’infrastructure
“Bon nombre de nos services s’exécutent dans des conteneurs Docker au sein de notre plateforme cloud interne basée sur Kubernetes”, déclare Cane. Kubernetes est un système d’orchestration de conteneurs open source écrit en Go. Il fournit des clusters hôtes pour exécuter des charges de travail basées sur des conteneurs, notamment des conteneurs Docker. Docker est un logiciel, également écrit en Go, qui utilise la virtualisation au niveau du système d’exploitation pour fournir des exécutions de logiciels portables appelées conteneurs.
American Express collecte également des métriques d’application via Prometheus, un outil de surveillance et d’alerte open source écrit en Go. Prometheus collecte et agrège des événements et des métriques en temps réel pour la surveillance et les alertes.
Cette triade de solutions Go, i.e. Kubernetes, Docker et Prometheus, a contribué à la modernisation de l’infrastructure d’American Express.
Amélioration des performances avec Go
Aujourd’hui, de nombreux développeurs chez American Express utilisent Go, la plupart travaillant sur des plates-formes conçues pour une grande disponibilité et des performances élevées.
“Les outils ont toujours été un domaine critique de besoin pour notre base de code héritée”, déclare Cane. “Nous avons constaté que Go dispose d’excellents outils, ainsi que de cadres de tests, de benchmarking et de profilage intégrés. Il est facile d’écrire des applications efficaces et résilientes.”
American Express commence tout juste à voir les avantages de Go. Par exemple, Go a été conçu dès le départ en tenant compte de la concurrence, en utilisant des “goroutines” légères au lieu de threads du système d’exploitation plus lourds, ce qui le rend pratique pour créer des centaines de milliers de goroutines dans le même espace d’adressage. En utilisant les goroutines, American Express a constaté une amélioration des performances dans le traitement en temps réel de ses transactions.
La gestion de la mémoire (garbage collector) de Go constitue également une grande amélioration par rapport à d’autres langages, tant en termes de performances que de facilité de développement. “Nous avons obtenu des résultats bien meilleurs en matière de gestion de la mémoire avec Go qu’avec d’autres langages, et la gestion de la mémoire pour le traitement en temps réel des transactions est essentielle”, déclare Cane. “L’optimisation de la gestion de la mémoire dans d’autres langages peut être très compliquée. Avec Go, vous n’avez rien à régler.”
Tout comme American Express utilise Go pour moderniser ses réseaux de paiement, des dizaines d’autres grandes entreprises adoptent également Go.
Il y a plus d’un million de développeurs utilisant Go dans le monde entier, couvrant les secteurs bancaire et commercial, du jeu et des médias, de la technologie et d’autres industries, au sein d’entreprises aussi diverses que PayPal, Mercado Libre, Capital One, Dropbox, IBM, Monzo, New York Times, Salesforce, Square, Target, Twitch, Uber, et bien sûr Google.
Sources :
https://go.dev/solutions/americanexpress
https://americanexpress.io/choosing-go/