Skip to content

Arquitetura 100% InMemory + CloudSQL Backup

🎯 Objetivo

Execução ultra-rápida usando memória RAM para tudo, com backup assíncrono no CloudSQL para persistência entre conversas.

🏗️ Arquitetura

Session Service: InMemorySessionService

  • Uso: Conversa ativa durante execução do bot
  • Armazenamento: RAM do container
  • Persistência: ❌ Não persiste entre restarts
  • Vantagens:
  • ⚡ Ultra rápido (zero I/O)
  • ✅ Sem problemas de serialização
  • ✅ Eventos nativos do ADK
  • ✅ Loop detection natural

Memory Service: InMemoryMemoryService

  • Uso: Histórico da conversa em RAM
  • Armazenamento: RAM do container
  • Persistência: ❌ Não persiste entre restarts (mas tem backup)
  • Vantagens:
  • ⚡ Ultra rápido (zero I/O)
  • ✅ Acesso instantâneo ao histórico
  • ✅ Sem latência de banco de dados
  • ✅ Eventos nativos preservados

CloudSQL Memory Backup

  • Uso: Backup assíncrono via callback
  • Armazenamento: MySQL no CloudSQL
  • Persistência: ✅ Permanente
  • Vantagens:
  • ✅ Histórico entre conversas
  • ✅ Recuperação após restart
  • ✅ Auditoria e análise
  • ✅ Não afeta performance (assíncrono)

🔄 Fluxo de Execução

1. Início da Conversa

Usuário envia mensagem no Slack
     ↓
Busca memória no CloudSQL backup (se existir)
     ↓
Popula InMemoryMemoryService com histórico
     ↓
Tudo pronto em RAM para execução

2. Durante Execução

Runner.run_async() processa eventos
     ↓
Session InMemory + Memory InMemory (100% RAM)
     ↓
Zero I/O de banco de dados
     ↓
Execução ultra-rápida

3. Após Resposta do Agente

Callback after_agent_callback disparado
     ↓
Session completa salva no CloudSQL backup (assíncrono)
     ↓
Não bloqueia resposta ao usuário
     ↓
Backup disponível para próxima conversa

📊 Comparação com Abordagens

Aspecto CloudSQL InMemory Session
CloudSQL Memory
100% InMemory
+ Backup
Velocidade Session Lento Rápido Ultra Rápido
Velocidade Memory Lento Lento Ultra Rápido
I/O Durante Execução Sim (bloqueante) Sim (memory) Não (zero)
Serialização Manual (JSON) Manual (memory) Nativo (tudo)
Loop Detection Problemático Bom Perfeito
Persistência Imediata Memory imediata Assíncrona (callback)
Debugging Difícil Médio Fácil

🐛 Problemas Resolvidos

Antes (CloudSQL Session)

❌ Loop infinito de ferramentas ❌ text=None no histórico salvo ❌ Agente não via próprias respostas anteriores ❌ Deserialização perdia contexto

Agora (InMemory Session)

✅ Eventos nativos preservam contexto completo ✅ Agente vê respostas anteriores corretamente ✅ Loop detection funciona naturalmente ✅ Callback salva estado completo após resposta final

🔍 Logs Importantes

Inicialização

✅ InMemorySessionService inicializado (sessões em memória)
✅ InMemoryMemoryService inicializado (memória em RAM)
✅ CloudSQLMemoryService (backup) inicializado
✅ Runner configurado (100% InMemory):
   • Session: InMemorySessionService (RAM)
   • Memory: InMemoryMemoryService (RAM)
   • Backup: CloudSQLMemoryService (persistência via callback)
   ⚡ Execução ultra-rápida sem I/O de banco durante processamento

Durante Conversa

📚 Carregadas 5 mensagens do CloudSQL backup
✅ Memória carregada no InMemoryMemoryService
💾 [Callback] Salvando sessão C123456 
    (usuário: U123, eventos: 8, último evento tem texto: True)
✅ [Callback] Sessão C123456 salva no CloudSQL Memory (backup)

⚠️ Limitações

  1. Nada persiste entre restarts do container
  2. Container reinicia → Session E Memory InMemory perdem tudo
  3. Solução: Backup CloudSQL carregado automaticamente no início
  4. Usuário não percebe diferença (memória restaurada)

  5. Container escalado horizontalmente

  6. Múltiplas réplicas = memórias InMemory diferentes
  7. Solução: CloudSQL backup sincroniza entre réplicas
  8. Slack routing garante afinidade com mesma réplica

  9. Backup é assíncrono

  10. Callback salva após resposta (não bloqueia)
  11. Crash antes do callback = perde última interação
  12. Trade-off aceitável para ganho de performance

🚀 Deploy

Nenhuma mudança necessária em: - cloudbuild.slack.yaml - Dockerfile.slack - Variáveis de ambiente CloudSQL

Apenas código do slack_bot.py atualizado para arquitetura 100% InMemory.

📈 Métricas Esperadas

  • Latência: Redução de 70-90% (zero I/O durante execução)
  • Loops: Zero (eventos nativos preservam contexto perfeito)
  • Respostas: 100% com texto final gerado
  • Memória: Preservada entre conversas via backup CloudSQL
  • Throughput: +300% (sem contenção de DB, processamento paralelo)
  • 🐛 Debugging: Muito mais fácil (objetos nativos, sem serialização)