Dicas de performance para APIs REST no ASP.NET Core

Image for post
Image for post

Neste novo post trago algumas dicas para a obtenção de uma maior performance em APIs criadas com o ASP.NET Core. Não se trata de uma versão definitiva deste material, sendo que pretendo incluir sempre que for oportuno novos conteúdos relacionados a esse importante tópico.

Muito do que está aqui listado já foi agrupado em outro artigo, no qual venho mantendo um guia de referência atualizado sobre o desenvolvimento de APIs REST com o ASP.NET Core. Para ter acesso a este material acesse o link a seguir:

APIs REST em ASP.NET Core - Guia de Referência

ASP.NET Core: dicas de performance em APIs [Vídeo]

O assunto performance em APIs REST construídas com o ASP.NET Core foi tema também de um evento online no Canal .NET em Julho/2018. A gravação está no YouTube e pode ser assistida gratuitamente:

Dicas para uma maior performance em APIs REST - InterCon 2018

Durante o InterCon 2018 também realizei uma apresentação focada em performance em APIs REST, com muitas das dicas que se encontram neste artigo:

Removendo valores nulos no retorno de uma API

Um descuido muito comum entre desenvolvedores .NET consiste em não configurar a remoção de valores nulos no retorno de APIs REST. Tal comportamento encontra-se desabilitado por default, com a ativação do mesmo constituindo um processo extremamente simples e que foi detalhado no seguinte artigo:

ASP.NET Core 2.0: removendo valores nulos no retorno de uma API

O projeto a seguir demonstra também este tipo de prática com o ASP.NET Core 2.1:

ASP.NET Core 2.1 + Remoção Nulls + Compressão (GZip e Brotli)

Compressão de respostas em APIs REST

O ASP.NET Core conta com um middleware para a compressão de respostas em APIs REST, fazendo uso para isto do padrão GZIP. A vantagem deste tipo de prática está na diminuição do volume de dados trafegados entre o servidor que processará uma requisição e aplicações-cliente.

No artigo a seguir demonstrei o uso deste recurso em uma API criada com o ASP.NET Core 1.1:

ASP.NET Core: utilizando compressão em APIs REST

Este mesmo exemplo também foi convertido para o ASP.NET Core 2.0 e está no seguinte repositório (projeto ExemploCompressao):

https://github.com/renatogroffe/Exemplos_ASPNETCore2.0/

Já no próximo repositório temos exemplos da utilização de compressão com o ASP.NET Core 2.1, considerado para isto padrões como GZip e Brotli (este último mais recente e com um resultado superior em termos de compactação):

ASP.NET Core 2.1 + Remoção Nulls + Compressão (GZip e Brotli)

O uso do padrão Brotli também foi tema de um artigo que publiquei sobre ASP.NET Core 2.1:

ASP.NET Core 2.1: melhorias na compressão de respostas com Brotli

Utilizando o suporte a JSON de bancos relacionais

Alguns SGBDs como o SQL Server (desde a versão 2016) contam com a possibilidade de conversão do resultado de uma consulta para uma string JSON. E qual a relação disso com a performance em APIs REST?

O formato JSON é atualmente a alternativa mais utilizada para a representação de dados em APIs REST (embora XML seja a outra possibilidade, porém menos comum e geralmente associada a projetos legados).

A possibilidade de converter diretamente um conjunto de informações para o padrão JSON evita a codificação de inúmeras classes em um projeto ASP.NET Core, além de dispensar a execução de custosas operações de serialização/deserialização de objetos que seriam devolvidos como retorno da API considerada. No artigo a seguir temos um exemplo disto utilizando o ASP.NET Core e o SQL Server 2017:

.NET + SQL Server 2017 - Parte 2: retornado consultas em JSON (exemplo com ASP.NET Core + Dapper)

Um exemplo já em ASP.NET Core 2.1 pode também ser encontrado no seguinte repositório:

ASP.NET Core 2.1+ Dapper + Suporte a JSON do SQL Server

Cache

Técnicas de armazenamento temporário de dados via cache são extremamente comuns em aplicações Web, com APIs REST não fugindo a esta regra.

O artigo a seguir traz exemplos de utilização de cache empregando Redis, em memória e bases do SQL Server para APIs desenvolvidas a partir do ASP.NET Core 2.0:

ASP.NET Core 2.0: implementando cache em APIs REST

Um exemplo de uso do Redis em uma API REST baseada no ASP.NET Core 2.1 pode ser encontrado no seguinte repositório:

ASP.NET Core 2.1 + Cache em API com Redis

Performance no acesso a dados com Dapper

Micro-ORM empregado em projetos .NET nos quais a performance no acesso a dados em bases relacionais constitui um fator crítico, o Dapper também pode ser utilizado por APIs construídas com o ASP.NET Core. O post a seguir traz vários exemplos de implementação que fazem uso deste framework:

Dapper: exemplos em .NET Core 2.0 e ASP.NET Core 2.0

Já o próximo artigo aborda o uso de Dapper com o .NET Core 2.1 e o ASP.NET Core 2.1:

Dapper: exemplos em .NET Core 2.1 e ASP.NET Core 2.1

Utilizando soluções NoSQL

Soluções NoSQL como o MongoDB e o DocumentDB se destacam por uma excelente performance na manipulação de grandes conjuntos de informações. No próximo artigo vocês poderão encontrar exemplos de utilização destas tecnologias em APIs criadas com o ASP.NET Core 2.0:

.NET Core 2.0 + NoSQL: exemplos utilizando MongoDB, DocumentDB e Redis

Exemplos de utilização de soluções NoSQL com ASP.NET Core 2.1 e .NET Core 2.1 podem ser encontrados no seguinte pot:

.NET Core 2.1 + NoSQL: exemplos utilizando MongoDB, Redis, DocumentDB, RavenDB e Azure Cosmos DB

Monitorando a performance com o Application Insights

Uma solução bastante flexível para o monitoramento de APIs REST (incluindo questões relacionadas a performance) é o Application Insights, alternativa que integra o Microsoft Azure e que pode ser empregada em diferentes plataformas como .NET, Java, Node e Ruby.

O tutorial a seguir demonstra como o Application Insights pode ser utilizado em conjunto com o ASP.NET Core 2.0:

ASP.NET Core 2.0: monitorando APIs REST com o Application Insights

Já o projeto a seguir traz um exemplo de uso com o ASP.NET Core 2.1:

ASP.NET Core 2.1 + Entity Framework Core + Redis + Azure Application Insights

Escalando APIs REST

Tecnologias como Docker e Kubernetes são excelentes alternativas em cenários que envolvam a necessidade de escalar uma API REST, com a execução simultânea e coordenada de múltiplas instâncias da aplicação em questão.

Os artigos a seguir abordam esta questão, com exemplos práticos envolvendo o uso do ASP.NET Core:

ASP.NET Core + Azure Web App for Containers: escalando uma API REST com containers Docker

Docker para Desenvolvedores .NET — Guia de Referência

ASP.NET Core + Azure + Kubernetes: Guia de Referência

Mensageria

Soluções de mensageria como o RabbitMQ e o Azure Service Bus representam um excelente meio para evitar a ocorrência de processamentos de longa duração em uma API REST. Através do envio de mensagens para um broker APIs podem delegar tarefas mais demoradas a serviços que executam separadamente, com o resultado final sendo disponibilizado posteriormente em uma base de dados ou outro meio de armazenamento.

Exemplos com este tipo de implementação podem ser encontrados no artigo a seguir:

.NET Core + Mensageria: exemplos utilizando RabbitMQ e Azure Service Bus

Written by

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store