Data de elaboração | 30/06/2022 |
Responsável pelo estudo | Rafael Passos dos Santos (Assessor)
Lucas de Souza e Sousa (Assessor) |
Equipe do estudo | Gustavo Felix Gomes (Assessor)
Rafael Passos dos Santos (Assessor) André Honório de Andrade Silva (Tecnico) Emanuel Rufino Alcantara de Lima (Analista) Alef Carvalho (Analista) Euriane Nogueira (Product Owner) |
Alvo | Portal do Cidadão |
Origem | Objetivo Estratégico: Utilização de Ferramentas para Melhoria de Performance no Portal do Cidadão |
Objetivo | Mapear soluções para melhoria de performance no projeto Portal do Cidadão conforme a User Story: “Eu como vingadores, preciso realizar um estudo de caso para melhoria de perfomance no Portal do Cidadão" presente na Sprint número 100 do time Vingadores. |
Documentação correlata | ASP.NET Memory Cache | balta.io
Implementando cache distribuído no ASP.NET Core | Blog TreinaWeb Configurando e usando memcached em ASP.NET núcleo - Referbruv |
Observações | O presente estudo pretende também pretende levantar as Historias dos cars para a Sprint |
A técnica de cache normalmente é implementada entra a aplicação e a sua fonte de dados. Quando uma requisição ocorre, podemos cachear seus resultados em algum local e posteriormente, toda vez que esta mesma requisição for chamada, lemos estes dados ao invés de consultar o banco de dados.
O cache pode ser salvo em diversos lugares, incluindo memória e disco. Todos os dados possuem um tempo de expiração que quando atingido força a renovação do mesmo. Essa renovação significa que a próxima requisição irá novamente até o banco de dados e o processo de caching será feito novamente.
Performance no Portal do Cidadão
Para que seja utilizado é necessário que o Redis esteja instalado na máquina atual ou em algum servidor remoto. Existem versões para os principais sistemas operacionais do mercado, além da opção de rodar o servidor via Docker.
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
Em seguida registrá-lo no método ConfigureServices da classe Startup:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
}
[Route("api/[controller]")]
[ApiController]
public class CidadaoController : ControllerBase
{
private const string cacheKey = "listaCidadoes";
private readonly ICidadaoRepository<Cidadao> cidadaoRepository;
private IMemoryCache cache;
private ILogger<EmployeeController> logger;
public CidadaoController(
ICidadaoRepository<Cidadao> cidadaoRepository,
IMemoryCache cache,
ILogger<EmployeeController> logger
)
{
this.cidadaoRepository = cidadaoRepository;
this.cache = cache;
this.logger = logger;
}
[HttpGet]
public async Task<IActionResult> Index()
{
if (_cache.TryGetValue(cacheKey, out IEnumerable<Cidadadao> cidadoes))
{
_logger.Log(LogLevel.Information, "Nenhum cidadão encontrado no cache.");
}
else
{
_logger.Log(LogLevel.Information, "Nenhum cidadão encontrado em cache. Buscando do banco de dados...");
cidadoes = cidadaoRepository.GetAll();
_logger.Log(LogLevel.Information, "Salvando cidadões no cache...");
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(60))
.SetAbsoluteExpiration(TimeSpan.FromSeconds(3600))
.SetPriority(CacheItemPriority.Normal)
.SetSize(1024);
_cache.Set(cacheKey, cidadoes, cacheEntryOptions);
}
return Ok(cidadoes);
}
}
Como estamos colocando os dados de cache na memória do servidor web, quanto mais dados forem inclusos em cache, mais memória será consumida pela aplicação em execução. O ASP.NET fica responsável por gerenciar a memória e desaloca-la caso necessário.
Ao utilizar o cache nativo do ASP.NET a configuração padrão de escalonamento do Kubernetes faz com que quando a aplicação chegue à X% de CPU ou memória, um novo contâiner (pod) seja provisionad. Este novo contâiner possui apenas a aplicação em sí, a memória do container anterior não é replicada.
Ao utilizar o cache via Redis agregamos mais um serviço no ecossistema da aplicação, trazendo com isso mais complexidade e custo a nossa infraestrutura.
HISTÓRIA | PONTUAÇÃO | PRODUTO |
---|---|---|
Implementar caching de dados via REDIS para as informações da carta e seus serviços. | 13 | Portal do Cidadão |
Implementar caching de dados via REDIS para as informações de média de avaliações de um serviço. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para as informações de locais e horários de atendimento de um serviço. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para as informações de serviços mais acessados na homepage do Portal. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para as categorias de serviços exibidas na homepage do Portal. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para a lista de horários de atendimento do serviço dentro da visualização dos detalhes da solicitação. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para a lista das unidades de atendimento dentro do serviço. | 8 | Portal do Cidadão |
Implementar caching de dados via REDIS para a lista de solicitações e agendamentos realizados pelo cidadão. | 8 | Portal do Cidadão |
TOTAL | 69 |
Considerado o alto volume de trafego do Portal do Cidadão o impacto da aplicação de caching em funcionalidades específicas agrega valor ao produto final, impactando significativamente a experiência do usuário no uso da aplicação.