← ClaudeAtlas

go-hexagonal-multitenant-skillslisted

Estructura un microservicio o Lambda en Go con arquitectura hexagonal (core/domain, core/ports, core/services, adapters driving/driven, app/wire) y conexiones a bases de datos multi-tenant resueltas por número de nodo. Cubre las optimizaciones probadas en producción — pool por nodo+base con lifetime corto para Aurora/Lambda, DSN sin credenciales en texto, streaming fila a fila con memoria constante, queries en paralelo con errgroup, subida a S3 por io.Pipe, contexto con margen antes del deadline, errores de negocio vs infraestructura para el reintento parcial de SQS, y métricas EMF por query y nodo. Úsala cuando pidan portar un servicio Node/TS/PHP a Go, "hexagonal" o "ports and adapters" en Go, conectarse a varias bases por tenant o "al nodo N", pools de MySQL en Lambda, un consumidor SQS a Lambda en Go, generar reportes o archivos grandes sin cargar todo en memoria, subir a S3 en streaming, medir queries por tenant en CloudWatch, o revisar por qué un servicio Go se queda sin conexiones, memoria o tiempo.
JoseLuis21/claude-plugins · ★ 0 · DevOps & Infrastructure · score 70
Install: claude install-skill JoseLuis21/claude-plugins
# Go hexagonal + conexiones multi-tenant por nodo Patrón probado en producción en un servicio Lambda SQS → MySQL por nodo → PDF/XLSX → S3 + Redis, heredando decisiones que un servicio de cierre mensual ya pagó antes. Las plantillas en `templates/` se copian y se adaptan (son `.go.tmpl`: sustituir `<module>` por la ruta del módulo y ajustar el nombre del paquete). --- ## 1. Layout hexagonal (el núcleo no importa adaptadores) ``` cmd/lambda binario real (SQS → servicio) cmd/local misma lógica a disco: herramienta de paridad, NO escribe en Redis/S3 internal/core/domain entidades y reglas puras (acumuladores, filtros, errores de negocio) internal/core/ports interfaces que el núcleo NECESITA del exterior (no "lo que el adapter ofrece") internal/core/services casos de uso; reciben ports, nunca *sql.DB ni clientes AWS internal/adapters/driving entrada: handler SQS/HTTP/cron internal/adapters/driven salida: mysql, redis, s3, xlsx, pdf, localfs internal/app wire.go: único lugar que conoce config + adapters + services internal/config Load() lee env; Validate() falla al arrancar con lista de faltantes internal/platform env, dates, metrics: utilidades sin dominio ``` Reglas que hacen que funcione: - **`var _ ports.X = (*Impl)(nil)`** en cada adapter: el compilador verifica el contrato. - **Los ports devuelven tipos del dominio** (`ValueMap`, `*domain.Company`), nunca `*sql.Rows`. - **Streaming por