fablabjoinville / agenda-saude

Sistema de agendamento de saúde, em uso para gerir filas de vacinação do COVID-19 e H1N1.
https://agendasaude.joinville.br
MIT License
113 stars 45 forks source link

Alta latência no endpoint TimeSlotController#index #79

Closed pedroCervi closed 4 years ago

pedroCervi commented 4 years ago

new relic

Selection_139

Contexto

Hoje temos uma ação nesse controller que pega todos os slots de agendamento disponiveis. Provavelmente há alguma forma de simplificar essa requisição e tornar ela mais rápida para o usuário. Hoje o impacto está sendo que muitas vezes o servidor dá um timeout.

A complexidade dessa consulta é que as UBS's tem parâmetros de configuração como tempo da consulta, intervalo entre consultas e horário de funcionamento da UBS. Além disso, tem os próprios agendamentos que concorrem com essa lógica que mostra os agendamentos disponíveis.

Esse problema escalou com o aumento da disponibilidade de testes rápidos em Joinville nas últimas semanas.

Ideias

Uma alternativa seria montar uma consulta pequena para o usuário e ir alimentando mais opções com o scroll (estilo dale ponto)

Mat-Bit commented 4 years ago

Segue abaixo uma imagem enviada por um dos coordenadores do projeto do Teste Rápido pro Covid da Secretaria da Saúde, apontando que diariamente entre 11 e 14h o sistema fica sobrecarregado, chegando a exceder o tempo para resposta e gerando o erro (conforme imagem abaixo), devido ao processamento para esse endpoint:

application_error

Salientando a importância para apuração e implementação de uma nova forma para apresentar os horários disponíveis.

Mat-Bit commented 4 years ago

Uma outra sugestão seria processar todos os horários disponíveis gerados pela unidade quando a mesma é Ativada (no ambiente do operador) e persistir esses slots em uma tabela no Banco de Dados.

Toda vez que um usuário reserva um horário, isso reflete nessa tabela por meio de um atributo reserved (por exemplo), e toda vez que um usúario acessa o sistema que acessa esse endpoit, o processamento seria simplificado para ler essa tabela e retornar somente os horários que o atributo reserved é false.

pedroCervi commented 4 years ago

Selection_197

O fix de pegar por dia baixou as requisições de ~15s para 700ms. Boua! :clap: