O Drama das Operações Assíncronas na Web

Achou que era só colocar um "async" para acelerar sua aplicação? Grande engano! Vamos ver o que realmente acontece com as operações assíncronas no IIS.

Desenvolvedor amador achando que vai trabalhar num paraíso.

Na primeira parte, falamos sobre sincronia e assincronia. Agora, é hora de ver isso na prática.

  • Quando usar async? Em teoria, para operações de IO.
  • HTTP é assíncrono? Não, HTTP é síncrono.
  • Então, como ele responde a várias requisições? Quem faz isso é o browser. O IIS é que teria que ser assíncrono.
  • Se o IIS é assíncrono, por que usar async Task nas Controllers? Para escalabilidade, dizem...

Antes, falamos de como o IIS recebe as requisições. Agora, veja como funciona a assíncronicidade.

Desenvolvedores perdidos num projeto.

Entrando no Caos Assíncrono

Programação assíncrona é como a esteira da academia: todo mundo vê, poucos sabem usar.

O Mundo .NET: Async/Await

Introduzido no .NET Framework 4.5, async e await prometem alegria assíncrona, mas o segredo é o Task-based Asynchronous Pattern (TAP).

Benefícios

Para aplicações Desktop, o grande benefício do async é não travar a interface. No Backend, o truque é a escalabilidade.

O Role do IIS nas Requisições—Onde a Coisa Pega

O IIS usa um Worker Process—daí as coisas podem embolar com operações síncronas.

Síncrono: O Tédio

Imagina uma requisição esperando o banco voltar das férias. É isso, a Thread está bloqueada!

Thread esperando na fila.

Assíncrono: A Esperança

O código assíncrono promete acabar com bloqueios de Thread. Ele libera até o I/O terminar e fica ali, na esperança.

Passando pela fantasia assíncrona.

Quando o Async Não Dá Conta

O async não resolve tudo. Confira os casos onde ele é um desastre.

Requisições que Usam Muita CPU

Se a requisição usa muita CPU, async não ajuda. async + await só complicam o código à toa.

Problemas de Banco de Dados

Se o banco engasgar, jogar async é como botar lenha na fogueira.

Drama de desempenho.

SHOW ME THE CODE: Rápido e Furioso

Finalmente, chegamos à parte prática.

O que Você Precisa

  • VisualStudio 2019
  • .NET Core 2.2

Vamos criar seu projeto Web API.

No Program.cs, configure bem seu Thread Pool.

Configure sua Controller para ter métodos sync e async.

Você está no ponto.

Testando o Caos

Crie um projeto Console Application e veja a bagunça ou magia.

O Teste Síncrono

8 requisições, 5 segundos cada. Difícil.

O Teste Assíncrono

Até 200 requisições, threads quase pifando. 7 segundos no total.

Baixe Sob Sua Responsabilidade

Clippy cuidando do código (ou não).

O código completo está no meu GitHub.

Conclusão: O Desafio do Async no ASP.NET

Este não é um guia para os fracos—o async no ASP.NET é levado ao limite.

No fim, o async promete escalabilidade.

Referências Importantes para Programar