Dicas de performance para APIs REST no ASP.NET Core

Renato Groffe
Feb 18, 2018 · 5 min read

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


Renato Groffe

Written by

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

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade