Setor

Tecnologia

Tamanho da Organização

Grande (1.000 a 9.999 funcionários)

País/região

Estados Unidos

Tecnologia

ASP.NET Core Modernization

Empresa

Microsoft Teams (Microsoft)

Microsoft Teams " MiddleTier" é um serviço interno que habilita vários cenários no Microsoft Teams. É um dos maiores serviços que consistem em mais de 700 APIs que são mantidas por mais de 10 equipes na Microsoft. Nos últimos dois anos, mais de 50 projetos (bibliotecas, testes, aplicativos) sob esse serviço foram convertidos para o .NET Standard 2.0 e o .NET Core 3.1, tendo equivalência funcional e de desempenho (ou melhor) e agora estão quase totalmente em execução no .NET Core 3.1 em produção e procurando mudar para o .NET 6 em seguida. Antes dessa migração, o serviço era executado no .NET Framework 4.6.2 usando o pipeline ASP.NET Core 2.2 MVC. Ele é executado no Azure Service Fabric com implantações em 35 datacenters do Azure.

O escopo dessa migração era grande porque o MiddleTier é um serviço extra grande em termos da funcionalidade que fornece com centenas de desenvolvedores que trabalham nele todos os dias.

Motivação para migração

A equipe foi motivada a migrar para o .NET Core 3.1 pelos seguintes motivos:

  • Melhorias de desempenho e eficiência de custo
  • .NET Framework 4.6.2 provavelmente atingirá o fim da vida útil em breve
  • Suporte multiplataforma
  • Migre para uma estrutura moderna para uma melhor experiência do desenvolvedor

Benefícios após a migração para o .NET Core 3.1

Depois de migrar para o .NET Core 3.1, a equipe observou as seguintes melhorias:

  • Melhoria de 25% na CPU
  • Redução de cerca de 25% no custo da infraestrutura
  • Uso aprimorado do pool de threads
  • Redução da dívida técnica e dos esforços na migração para versões anuais do .NET

Os gráficos a seguir mostram comparações entre .NET Framework e o .NET Core. No futuro, com o .NET 6, devemos ver ainda mais melhorias.

Gráfico mostrando 57% de pico de CPU .NET Framework e 42% de pico de CPU no .NET Core
Comparação de CPU
Gráfico mostrando uma queda de threads de trabalho ocupados após a migração para o .NET Core
Comparação de Thread de Trabalho Ocupado
Gráfico mostrando uma queda de threads de E/S ocupados após a migração para o .NET Core
Comparação de Thread de E/S Ocupado

Abordagem

A migração geral foi dividida em três estágios:

Gráfico mostrando as atividades para os três estágios de migração (preparação, execução e validação e distribuição)

Eles também optaram por aplicar vários destinos ao aplicativo .NET Framework e .NET Core para que eles tenham os dois binários disponíveis e possam continuar a distribuir o .NET Core lentamente.

Aprendizados

OData e outras APIs REST não podem compartilhar o prefixo de rota

O serviço deles também tem poucos pontos de extremidade OData, juntamente com muitos pontos de extremidade REST. Esses dois compartilharam o mesmo prefixo de roteamento para os pontos de extremidade. Isso funcionava bem no .NET Framework, mas devido a alterações de roteamento, isso parou de funcionar no .NET Core. Eles tiveram que mover as APIs OData para um prefixo de rota diferente para resolver isso.

Problemas de desempenho com bibliotecas de cliente OData

The HttpWebRequest pattern with OData clients to make calls to downstream OData APIs results in higher latency compared to .NET Framework. This was due to a regression in .NET Core in which the framework doesn't cache connections. This is already resolved in newer versions of .NET.

Problemas com Barramento de Serviço do Azure SDKs

The Azure Service Bus SDK had to be upgraded as part of this migration since the old version isn't .NET Standard compatible. The latest version of the Azure Service Bus SDK sends the request payload in JSON format whereas the older SDK sends the payload in XML format. To continue using XML payload, they had to use the DataContractSerializer.

Problemas Service Fabric projeto para direcionamento múltiplo

O Service Fabric Project (sfproj) não dá suporte inerentemente a multi-direcionamento. Eles tinham que fazer soluções alternativas no pipeline de build para produzir Service Fabric pacotes para ambas as estruturas de destino.

Problemas com a versão mais antiga do MimeKit NuGet

The older version of MimeKit can have issues with double byte characters, thus language specific validation is advised in this scenario. They uncovered similar issues when they rolled out to deployments located in Asian geography.

Características ASP.NET clássicas

  • Foi necessário remover o uso de algumas das classes .NET Framework que foram marcadas como internas no .NET Core.
  • MVC async suffix dropped from action names as mentioned in the ASP.NET Core breaking changes for versions 3.0 and 3.1 article. If any of the code paths are dependent on the action name, it can cause a change in behavior.
  • Synchronous IO operations are by default turned off on all servers starting in .NET Core 3.0 as mentioned in the dotnet/aspnetcore#7644 GitHub issue.
  • Cabeçalho Content-Length não definido em Content.Headers ao enviar StreamContent como conteúdo de solicitação HTTP. Isso pode resultar em erros de chamadas downstream.
  • O .NET Framework produz código hash estável para uma cadeia de caracteres, mas o .NET Core não.
  • The Required attribute from the System.ComponentModel.DataAnnotations namespace behaves differently in .NET Core. On .NET Framework, this attribute doesn't do any model validation for non-null fields but on .NET Core it does.

Futuro

Cada nova versão do .NET vem com enormes melhorias de produtividade e desempenho que continuam a ajudar a atingir nossas metas para criar serviços resilientes, escalonáveis, de alto desempenho e seguros. A equipe continuará a aproveitar as melhorias feitas no .NET atualizando para o .NET 6 em seguida.