Ir al contenido
HexaTransfer
Volver al blog
Analisis tecnicos

Arquitectura de microservicios para sistemas de transferencia

Diseña sistemas de transferencia de archivos con arquitectura de microservicios. Descomposición de servicios, colas de mensajes y patrones de escalabilidad.

Una arquitectura de microservicios para la transferencia de archivos descompone el sistema en servicios especializados: uno para las subidas, otro para los metadatos, otro para las notificaciones, otro para el análisis de virus, etc. Cada uno escala de forma independiente, falla de forma independiente y puede reescribirse en diferentes lenguajes cuando el equipo lo juzgue conveniente. La recompensa es la flexibilidad operativa y una propiedad más clara; el coste es la complejidad de los sistemas distribuidos, la sobrecarga de red y la necesidad de una observabilidad sólida. Aquí hay una descomposición pragmática para cargas de trabajo de transferencia de archivos y cómo se comunican las piezas entre sí.

Límites de servicio que tienen sentido

No toda función merece su propio servicio. Una descomposición razonable para una plataforma de transferencia de archivos: Servicio de Subida (generación de URL prefirmadas, coordinación multiparte), Servicio de Metadatos (registros de transferencia en PostgreSQL, generación de enlaces compartibles), Servicio de Notificaciones (email mediante SendGrid o Postmark, webhooks), Servicio de Análisis (ClamAV o antivirus comercial para comprobaciones de malware), Servicio de Facturación (integración con Stripe) y un API Gateway frontend (Kong, Traefik o AWS API Gateway). Seis a ocho servicios suelen dar el punto óptimo: suficiente separación para el escalado independiente, no tantos como para que rastrear una petición entre ellos se convierta en arqueología.

Servicios de subida sin estado

El Servicio de Subida debe ser sin estado y escalable horizontalmente. Su trabajo es generar URLs prefirmadas, coordinar sesiones de subida multiparte y validar tokens de autenticación. Todo el estado vive en una caché (Redis) o base de datos (PostgreSQL, DynamoDB), nunca en la memoria del proceso local. Cualquier instancia puede gestionar cualquier petición, lo que hace triviales los despliegues blue/green y el auto-escalado. Los despliegues de Kubernetes con Horizontal Pod Autoscaler que escalan según CPU o tasa de peticiones gestionan los picos de tráfico. Apunta a una latencia p99 de menos de 100 ms en la inicialización de la subida; los bytes reales van directamente del cliente al almacenamiento de objetos, no a través de este servicio.

Colas de mensajes para el trabajo asíncrono

El análisis antivirus, la generación de miniaturas, la entrega de webhooks y el envío de emails son trabajo asíncrono que no debe bloquear la finalización de la subida. Usa una cola de mensajes: AWS SQS por simplicidad y coste, Apache Kafka para alto rendimiento y reproducción, RabbitMQ para enrutamiento flexible, o Google Pub/Sub si estás en GCP. Cuando una subida se completa, el Servicio de Subida publica un evento "transfer.created". Los suscriptores lo recogen: el Servicio de Análisis ejecuta ClamAV, el Servicio de Notificaciones envía el email de compartir, el Servicio de Webhook publica en los endpoints configurados. Cada suscriptor reintenta en caso de fallo con retroceso exponencial y colas de mensajes muertos para los mensajes envenenados.

Esquemas de eventos y pruebas de contratos

Acuerda los esquemas de eventos y versionarlos. JSON Schema o Avro funcionan; Protobuf via gRPC es popular para contratos de tipo fuerte. Un evento como {"type": "transfer.created", "version": "1.0", "id": "uuid", "sizeBytes": 5242880000, "createdAt": "2026-11-20T12:00:00Z"} es fácil de evolucionar si los nuevos campos son aditivos. Los cambios incompatibles pasan a "transfer.created v2.0" con ambas versiones soportadas durante un período de migración. Las herramientas de prueba de contratos como Pact verifican que el productor y el consumidor están de acuerdo antes del despliegue, detectando la deriva del esquema en CI en lugar de en producción.

Opciones de almacenamiento de metadatos

PostgreSQL gestiona bien la mayoría de las cargas de trabajo de metadatos de transferencia de archivos: transferencias, usuarios, compartidos, registros de auditoría, registros de facturación. La partición por created_at una vez que las tablas superen los 100 GB mantiene las consultas rápidas. Para mayor rendimiento, DynamoDB con una clave compuesta (user_id, created_at) escala a millones de registros con latencia predecible. Las cargas de trabajo con muchas lecturas se benefician de réplicas de lectura o una caché en memoria (Redis, Memcached) delante de la BD. Los metadatos de transferencia son diminutos (unos pocos KB por registro) en relación con los bytes del archivo en S3, por lo que incluso una instancia PostgreSQL modesta puede contener miles de millones de registros con la indexación adecuada.

Comunicación entre servicios

gRPC con Protobuf es rápido y tipado estáticamente, bueno para APIs internas de alto RPS. REST con especificaciones OpenAPI es más sencillo y depurable con curl. Los service meshes como Istio o Linkerd añaden mTLS entre servicios, desplazamiento de tráfico para despliegues canary y reintentos automáticos sin cambios de código. Para los sistemas de transferencia de archivos, la mayoría de las llamadas internas son de coordinación de bajo RPS, por lo que REST más una pequeña biblioteca de cliente suele ser suficiente. Reserva gRPC para las rutas calientes: las búsquedas del Servicio de Subida al Servicio de Metadatos ocurren en cada inicialización de subida, por lo que la mejora de 5–10 veces frente a JSON sobre HTTP importa.

Autenticación y autorización entre servicios

Cada servicio necesita saber quién está llamando. Un JWT emitido por un Servicio de Auth (Auth0, Keycloak o personalizado) se propaga a lo largo de la cadena de peticiones. Valida la firma JWT en cada límite de servicio; nunca confíes en las afirmaciones sin verificarlas. Para las llamadas de servicio a servicio sin contexto de usuario, mTLS con identidades de servicio mediante SPIFFE/SPIRE proporciona una identidad sólida. Los sidecars OPA (Open Policy Agent) evalúan las políticas de autorización: "¿Puede el usuario X leer la transferencia Y?" como una única consulta de política. Centralizar la política en OPA es mejor que dispersar comprobaciones "if user.id == transfer.owner_id" por todos los servicios.

Observabilidad: logs, métricas y trazas

Sin observabilidad, los microservicios degeneran en cajas negras opacas. La instrumentación de OpenTelemetry exporta trazas, métricas y logs a backends como Jaeger, Tempo o Datadog. Una traza distribuida muestra la petición completa: el frontend llama al Servicio de Subida, que llama al Servicio de Metadatos, que consulta PostgreSQL, tardando 47 ms en total con 12 ms en la BD. Las métricas en Prometheus y Grafana rastrean RPS, tasa de errores y latencia por servicio. Los logs estructurados en JSON mediante Loki o Elasticsearch permiten buscar por ID de traza. Las alertas sobre el gasto del presupuesto de error (SLOs al estilo SRE) detectan regresiones antes de que los usuarios se quejen.

Pipelines de despliegue y estrategias de lanzamiento

Cada servicio tiene su propio repositorio y pipeline, o un monorepo con builds por servicio (Bazel, Nx, Turborepo). Despliega mediante Kubernetes con charts Helm o Argo CD para GitOps. Estrategias de lanzamiento: actualizaciones progresivas para cambios rutinarios, despliegues canary mediante Istio o Flagger para cambios arriesgados, blue/green para migraciones de base de datos. Los feature flags mediante LaunchDarkly o Unleash permiten enviar código deshabilitado y activarlo para el 1 por ciento de los usuarios, incrementando gradualmente.

Cuándo los microservicios son excesivos

Un pequeño servicio de transferencia de archivos con uno o dos desarrolladores y 100.000 transferencias al mes no necesita 8 microservicios. Un monolito bien organizado en Go, Node.js o Rails gestiona esa carga en dos VMs modestas, se despliega en minutos y deja al equipo tiempo para construir funcionalidades en lugar de depurar service meshes. Los microservicios son rentables con tamaños de equipo de alrededor de 20 o más ingenieros o cuando diferentes componentes tienen necesidades de escalado muy distintas. HexaTransfer usa un pequeño número de servicios especializados con fuerte dependencia del almacenamiento compatible con S3 y una CDN, manteniendo la complejidad operativa manejable mientras soporta transferencias de 10 GB con baja latencia globalmente.

Pruébalo en https://hexatransfer.com — gratuito, sin cuenta, hasta 10 GB.

Envía archivos grandes de forma segura con cifrado de extremo a extremo

Transfiere archivos de hasta 10 GB gratis con cifrado de extremo a extremo. Sin necesidad de cuenta. Tus archivos se cifran en tu navegador antes de subirlos: nadie más puede leerlos.

Enviar un archivo