1 O Modelo como Microserviço
Conteinerização de APIs Assíncronas.
Escalabilidade: O FastAPI utiliza o conceito de ASGI (permite lidar com milhares de requisições simultâneas).
Facilidade de Atualização: O Docker isola o modelo. Para atualizar a inteligência do App, você apenas troca a imagem do contêiner, sem mexer no servidor principal da Playcatch.
2 Conceitos
Variáveis de Ambiente (os.getenv): Em produção, nunca "chumbamos" caminhos no código. Se o modelo mudar de versão, você apenas altera a variável no Docker ou no Kubernetes, e a API se atualiza sozinha no próximo restart.
Isolamento de Contêiner: O Docker garante que o torch ou o scikit-learn que o modelo usa não conflitem com outras versões no servidor. É a garantia de que "funciona na minha máquina e no servidor".
Endpoint /docs: O FastAPI gera automaticamente uma documentação Swagger. Isso permite que os desenvolvedores do App testem a API visualmente sem escrever uma linha de código.
3 Implementação da API e Docker
Arquivo 1: main.py (A API REST)
from fastapi import FastAPI
import mlflow.sklearn
import os
app = FastAPI(title="Playcatch Recommendation API")
Carregamento automático na inicialização (Singleton Pattern)
Usamos variáveis de ambiente para facilitar a atualização sem mudar o código
MODEL_URI = os.getenv("MODEL_URI", "models:/Playcatch_v1/Production")
model = mlflow.sklearn.load_model(MODEL_URI)
@app.get("/")
def read_root():
return {"status": "Online", "service": "Playcatch ML Service"}
@app.get("/recommend/{user_id}")
def get_recommendation(user_id: int, k: int = 5):
# Lógica simplificada: na vida real, você buscaria contexto do usuário no DB
# model.predict(...)
recommendations = [f"Music_{i}" for i in range(k)]
return {
"user_id": user_id,
"recommendations": recommendations,
"model_version": MODEL_URI
}
Arquivo 2: Dockerfile (O Empacotamento)
# Imagem base leve com Python 3.10
FROM python:3.10-slim
Diretório de trabalho
WORKDIR /app
Copiar dependências e instalar
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
Copiar o código da API
COPY main.py .
Expor a porta que o FastAPI usa (padrão 8000)
EXPOSE 8000
Comando para rodar a API com Uvicorn (Worker assíncrono)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]