Do Monólito ao Modular: Como Migramos o RecomendeMe em Produção
Depois de cinco anos rodando em produção, concluímos uma das etapas mais importantes da história do RecomendeMe: reescrevemos e reestruturamos quase tudo. Essa refatoração não foi só uma troca de framework ou uma limpeza pontual; foi uma transformação estrutural que impactou cerca de 70% da nossa base de código original incluindo todos os componentes críticos.
Duas arquiteturas, um propósito
O desenvolvimento hoje acontece em duas frentes complementares: Arquitetura Experimental e Arquitetura Principal.
Arquitetura Experimental
Criamos um ambiente sandbox dedicado para pesquisa e prototipagem. Nele, a equipe tem liberdade para explorar frameworks, linguagens e padrões de projeto que possam trazer ganho real para a operação. Foi assim que testamos, por exemplo:
-
React e Angular para interfaces mais leves e modulares
-
Ruby on Rails, em 2022, para um piloto de recomendações de álbuns rodado com um grupo restrito de usuários
-
Hipóteses de performance, escalabilidade e segurança, validadas com testes unitários, stress testing e simulações de rede
Esse ambiente virou um laboratório que nos ajudou a errar rápido e aprender mais rápido ainda, sem arriscar a produção.
Arquitetura Principal
Enquanto isso, o núcleo do RecomendeMe continua rodando sobre uma stack PHP/MySQL robusta o bastante para sustentar a operação diária. É aqui que vivem:
-
As APIs oficiais, que conectam serviços, front-end e integrações de parceiros
-
O banco de dados principal
-
Toda a infraestrutura que garante estabilidade em produção
Essa separação entre o que é laboratório e o que é core garantiu que a evolução fosse possível sem comprometer o que já estava validado.
Por que reescrever tudo?
O RecomendeMe começou como um projeto acadêmico. Era para ser um experimento, e funcionou assim por muito tempo. Mas, com o crescimento orgânico, veio o acúmulo de débito técnico: um monólito com mais de 8 mil linhas de código, cheio de implementações improvisadas, alto acoplamento e falhas de segurança que exigiam atenção constante.
Cada nova funcionalidade era um risco: mexer em uma ponta podia derrubar tudo. A manutenção virava sempre um retrabalho. Chegou o ponto em que reescrever era menos custoso do que seguir tapando buracos.
Como fizemos
A migração foi planejada para preservar o que realmente importa: os dados. O RecomendeMe não é definido por um framework ou uma linguagem, mas pela forma como captura, organiza e entrega informações relevantes para quem usa.
-
Mantivemos APIs do núcleo original, para garantir continuidade dos serviços.
-
Refatoramos o frontend inteiro para React, criando uma base de componentes minimalista, fácil de escalar.
-
Usamos GPT-3.5 para identificar e eliminar código obsoleto, e o GitHub Copilot ajudou a reforçar práticas de segurança.
-
A migração foi incremental, para não comprometer operações já em produção.
-
Além disso, estruturamos test suites modulares. Cada parte da aplicação agora é testada isoladamente, o que reduziu bugs em cascata e deixou o ciclo de deploy muito mais previsível.
Resultados práticos
A mudança já trouxe ganhos claros:
-
A performance geral subiu de forma exponencial.
-
A manutenção deixou de ser uma dor de cabeça e virou rotina saudável.
-
Vulnerabilidades críticas foram eliminadas.
-
O SEO melhorou — agora entregamos páginas mais leves e rápidas.
-
A estrutura orientada a serviços trouxe flexibilidade para o time e escalabilidade horizontal para a infraestrutura.
O backend ainda roda em PHP puro, mas o monólito foi quebrado em serviços menores, desacoplados, que podem evoluir em ritmos diferentes. Isso permite deploys independentes e um ciclo de entrega mais ágil.
Como ficamos hoje
-
Backend: PHP (APIs e serviços core)
-
Frontend: React (reescrito do zero)
-
Arquitetura: orientada a serviços, desacoplada e escalável
-
Testing: suites unitárias por módulo
-
Infraestrutura: distribuída e preparada para crescer
O que isso representa
No fim, não foi só uma mudança de stack ou de arquitetura. Foi um passo para transformar o RecomendeMe de um projeto experimental em uma plataforma que aguenta crescer de forma sustentável.
A divisão clara entre experimentação e produção nos dá liberdade para continuar testando o que fizer sentido — sem colocar o core em risco. E a nova estrutura garante que cada avanço venha de forma mais controlada, segura e fácil de manter.
Essa migração não é o fim do trabalho. é o começo de uma fase nova.
Arquitetura Experimental: Estratégia de Validação Tecnológica
Design Philosophy
Nossa abordagem experimental seguiu o princípio de technology-agnostic validation, garantindo que a lógica de negócio não ficasse acoplada a tecnologias específicas. Implementamos múltiplos MVPs paralelos para validar diferentes aspectos da plataforma.
Módulos Experimentais
1. RecomendeMe Mobile Interface (React Native)
// Stack: React Native 0.72+, TypeScript, Expo
// Objetivo: Validar UX mobile e engagement patterns
- Arquitetura: Component-based com Context API
- State Management: Redux Toolkit + RTK Query
- Navigation: React Navigation 6
- Testing: Jest + React Native Testing Library
2. RecomendeMe ACDC Microservice (Flask)
# Stack: Flask 2.3+, SQLAlchemy, MySQL
# Objetivo: Algoritmos de Content Discovery e Classificação
- Design Pattern: Repository + Service Layer
- Database: MySQL com connection pooling
- API: RESTful com OpenAPI 3.0 documentation
- Caching: Redis com TTL configurável
- Monitoring: Prometheus metrics + Grafana dashboards
3. RecomendeMe API (Node.js)
// Stack: Node.js 18+, Express.js, TypeScript, MySQL
// Objetivo: Performance comparison e ecosystem validation
- Architecture: Layered (Controller → Service → Repository)
- ORM: Sequelize com migrations automatizadas
- Validation: Joi schemas com custom validators
- Authentication: JWT com refresh token rotation
- Rate Limiting: Redis-based sliding window
4. RecomendeMe Data Layer (MySQL/SQLite)
-- Objetivo: Schema optimization e query performance testing
-- Databases: MySQL 8.0 (prod), SQLite 3.39+ (dev/testing)
- Indexing Strategy: Composite indexes para queries complexas
- Partitioning: Por timestamp para tabelas de logs
- Backup Strategy: Point-in-time recovery com binlogs
- Monitoring: Slow query log + Performance Schema
5. RecomendeMe Monolith Backend (Ruby on Rails)
# Stack: Rails 7.0+, SQLite3, ActiveRecord
# Objetivo: Rapid prototyping e developer experience validation
- Conventions: Rails conventions para desenvolvimento ágil
- Testing: RSpec + FactoryBot + Capybara
- Background Jobs: Sidekiq com Redis
- Deployment: Docker containers com CI/CD pipeline
Estratégia de Testing em Produção
A/B Testing Infrastructure
# Configuração de feature flags
experimental_modules:
mobile_interface:
enabled: true
traffic_percentage: 15
target_segments: ["mobile_users", "early_adopters"]
acdc_service:
enabled: true
traffic_percentage: 25
target_segments: ["album_community"]
Tunneling com Ngrok
Para testes em ambiente real, implementamos:
# Configuração de tunneling para testes distribuídos
ngrok http 3000 --subdomain=recomendeme-exp
ngrok http 5000 --subdomain=recomendeme-acdc
Metrics e Observabilidade
Performance Benchmarks
PHP Monolith:
- Response Time: 150ms (p95)
- Throughput: 1000 req/s
- Memory Usage: 128MB baseline
Node.js API:
- Response Time: 95ms (p95)
- Throughput: 1500 req/s
- Memory Usage: 85MB baseline
Flask ACDC:
- Response Time: 200ms (p95) [ML processing]
- Throughput: 800 req/s
- Memory Usage: 256MB baseline