Le parcours de Microsoft Teams vers .NET Core

Client
Microsoft Teams (Microsoft)

Produits & services
ASP.NET Core 3.1

Secteur
Technologie

Taille de l’organisation
Grand (1000+ employés)

Pays/région
États-Unis

Microsoft Teams "MiddleTier" est un service interne qui alimente divers scénarios dans Microsoft Teams. C'est l'un des plus grands services composé de plus de 700 API gérées par plus de 10 équipes Microsoft. Au cours des deux dernières années, plus de 50 projets (bibliothèques, tests, applications) dans le cadre de ce service ont été convertis en .NET Standard 2.0 et .NET Core 3.1, ayant une équivalence fonctionnelle et de performances (ou mieux), et fonctionnent désormais presque entièrement sur .NET Core 3.1 en production et envisage de passer ensuite à .NET 6. Avant cette migration, le service s'exécutait sur .NET Framework 4.6.2 à l'aide du pipeline MVC ASP.NET Core 2.2. Il s'exécute sur Azure Service Fabric avec des déploiements dans 35 centres de données Azure.

La portée de cette migration était importante car MiddleTier est un service extra-large en termes de fonctionnalités qu'il fournit avec des centaines de développeurs qui y travaillent chaque jour.

Motivation pour la migration

L'équipe était motivée pour passer à .NET Core 3.1 pour les raisons suivantes :

  • Améliorations des performances et de la rentabilité
  • .NET Framework 4.6.2 arrive probablement bientôt en fin de vie
  • Support multiplateforme
  • Passez à un framework moderne pour une meilleure expérience développeur

Avantages après la migration vers .NET Core 3.1

Après la migration vers .NET Core 3.1, l'équipe a remarqué les améliorations suivantes :

  • 25 % d'amélioration du processeur
  • Environ 25 % de réduction des coûts d'infrastructure
  • Amélioration de l'utilisation du pool de threads
  • Réduction de la dette technique et des efforts pour passer aux versions annuelles de .NET

Les graphiques suivants montrent des comparaisons entre .NET Framework et .NET Core. À l'avenir, avec .NET 6, nous devrions voir encore plus d'améliorations.

Graphique montrant 57 % de CPU de pointe sur .NET Framework et 42 % de CPU de pointe sur .NET Core
Comparaison CPU

Graphique montrant une baisse des threads de travail occupés après la migration vers .NET Core
Comparaison des threads de travail occupés

Graphique montrant une baisse des threads d'E/S occupés après la migration vers .NET Core
Comparaison des threads IO occupés

Approche

La migration globale a été divisée en trois étapes :

Graphique montrant les activités des trois étapes de la migration (préparation, exécution, validation et déploiement)

Ils ont également choisi de cibler plusieurs fois l'application sur .NET Framework et .NET Core afin de disposer des deux fichiers binaires et de continuer à déployer .NET Core lentement.

Formations

OData et les autres API REST ne peuvent pas partager le préfixe de route

Leur service a également quelques points de terminaison OData ainsi que de nombreux points de terminaison REST. Ces deux partageaient le même préfixe de routage pour les points de terminaison. Cela fonctionnait bien dans .NET Framework, mais en raison de modifications de routage, cela a cessé de fonctionner dans .NET Core. Ils ont dû déplacer les API OData vers un autre préfixe de route pour résoudre ce problème.

Problèmes de performances avec les bibliothèques clientes OData

Le modèle HttpWebRequest avec les clients OData pour effectuer des appels vers les API OData en aval entraîne une latence plus élevée par rapport à .NET Framework. Cela était dû à une régression dans .NET Core dans laquelle le framework ne met pas en cache les connexions. Ceci est déjà résolu dans les nouvelles versions de .NET.

Problèmes avec les SDK Azure Service Bus

Le SDK Azure Service Bus a dû être mis à niveau dans le cadre de cette migration car l'ancienne version n'est pas compatible avec .NET Standard. La dernière version du SDK Azure Service Bus envoie la charge utile de la requête au format JSON alors que le l'ancien SDK envoie la charge utile au format XML. Pour continuer à utiliser la charge utile XML, ils devaient utiliser le DataContractSerializer.

Problèmes dans le projet Service Fabric pour le ciblage multiple

Le projet Service Fabric (sfproj) ne prend pas en charge le multi-ciblage de manière inhérente. Ils ont dû effectuer des solutions de contournement dans le pipeline de build pour produire des packages Service Fabric pour les deux frameworks cibles.

Problèmes avec l'ancienne version de MimeKit NuGet

L'ancienne version de MimeKit peut avoir des problèmes avec les caractères à deux octets, une validation spécifique à la langue est donc conseillée dans ce scénario. Ils ont découvert des problèmes similaires lors du déploiement dans des déploiements situés dans la géographie asiatique.

Erreurs de ASP.NET classiques

  • A dû supprimer l'utilisation de certaines des classes .NET Framework qui étaient marquées comme internes dans .NET Core.
  • Le suffixe asynchrone MVC a été supprimé des noms d'action, comme mentionné dans l'article modifications avec rupture d'ASP.NET Core pour les versions 3.0 et 3.1. Si l'un des chemins de code dépend du nom de l'action, cela peut entraîner un changement de comportement.
  • Les opérations d'E/S synchrones sont désactivées par défaut sur tous les serveurs à partir de .NET Core 3.0, comme indiqué dans le problème dotnet/aspnetcore#7644 GitHub.
  • L'en-tête Content-Length n'est pas défini dans Content.Headers lors de l'envoi de StreamContent en tant que contenu de requête HTTP. Cela peut entraîner des erreurs dans les appels en aval.
  • Le framework .NET produit un code de hachage stable pour une chaîne, mais pas .NET Core.
  • L'attribut Required de l'espace de noms System.ComponentModel.DataAnnotations se comporte différemment dans .NET Core. Sur .NET Framework, cet attribut n'effectue aucune validation de modèle pour les champs non nuls, mais sur .NET Core, il le fait.

À venir

Chaque nouvelle version de .NET s'accompagne d'améliorations considérables de la productivité et des performances qui continuent d'aider à atteindre nos objectifs de création de services résilients, évolutifs, performants et sécurisés. L'équipe continuera à tirer parti des améliorations apportées à .NET en passant ensuite à .NET 6.

Prêt à démarrer ?

Notre tutoriel étape par étape vous aidera à démarrer ASP.NET sur votre ordinateur.

Bien démarrer