⚡ [Performance] Lentidão na Inbox ao listar chats após recarregamento (F5) #12
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Contexto e Sintoma
A tela do Inbox (listagem de chats ativos) apresenta lentidão perceptível (delay de carregamento) sempre que o usuário faz um recarregamento completo da página (F5). Após a carga inicial, o sistema opera de forma instantânea através de WebSockets (Socket.IO).
🔍 Causas Raiz Identificadas
Topologia de Rede (Latência da VPN):
10.99.0.1), mas o banco de dados PostgreSQL roda na VPS 3 (10.99.0.3).Estratégia de Relações do Prisma (N+1 oculto):
findAllByInstancenoChatRepositorybusca 200 chats por padrão com múltiplosinclude(contact,protocols,messages).relationLoadStrategy = "query"). Ele executa queries consecutivas na VPN, multiplicando o tempo de espera do usuário final.Inexistência de Cache Local no Cliente (Cold Fetch):
🛠️ Proposta de Soluções e Validações
Opção 1: Otimização de Queries (Prisma Joins) ⚡
LEFT JOIN(disponível na v5+):Opção 2: Paginação da Inbox (Scroll Infinito) 📄
Opção 3: Cache Persistente no Frontend 💾
SWRouReact Querycom cache persistente.🔄 Fluxo Seguro de Deploy, Validação e Rollback (GitOps)
Para garantir segurança total nas alterações da arquitetura e do código:
perf/inbox-joins-issue-x).git revertna branchmaine o pipeline reverte a VPS 1 para o passo estável em menos de 1 minuto.✅ Opção 1 Implementada com Sucesso!
⚙️ Modificações Realizadas
No arquivo
backend/src/modules/chats/chat.repository.ts, na consultafindAllByInstance, adicionamos a estratégia de carregamento do PrismarelationLoadStrategy: 'join':📈 Resultados e Validação do Fluxo (GitOps)
git push origin main).npm install.npm run buildgerando o diretório/dist.npx prisma generatesem nenhum aviso de compatibilidade.Com isso, a latência de N+1 queries sequenciais pela VPN Wireguard foi reduzida a uma única query SQL otimizada, otimizando expressivamente o tempo de renderização fria do Inbox pós F5!
Encerrando esta Issue como concluída! 🎉
🚀 Início da Implementação da Otimização de Cache (Opção 2)
Após uma análise técnica aprofundada das duas opções propostas para a solução de cold hit na Inbox, daremos andamento à Opção 2 (Long TTL + Invalidação por Contato) conforme decisão de arquitetura.
🎯 Estratégia de Implementação:
CHAT_LIST_CACHE_TTL_Sde30segundos para86400segundos (24 horas) emchat.routes.tse nos arquivos compilados correspondentes.MessageHandler.ts), arquivamento, fixação (pin), deleção e alteração de protocolo.PATCH /api/contacts/:id(contact.routes.ts) não invalidava o cache do chat. Iremos injetar e disparar oinvalidateChatListCacheimediatamente quando houver alteração do nome de um contato, mantendo a listagem de chats sempre fresca e fidedigna.As alterações estão sendo aplicadas e o deploy automático será validado na VPS 1.