El problema fundamental que Compiler Explorer resuelve es la provisión de un entorno de compilación y ejecución de código accesible y consistente para múltiples lenguajes y versiones de compiladores, a escala global y con baja latencia. Esto se logra mediante una arquitectura distribuida que desacopla la interfaz de usuario de los recursos de cómputo y almacenamiento, y que optimiza el acceso a un vasto repositorio de binarios de compiladores. La necesidad de mantener versiones históricas de compiladores para garantizar la reproducibilidad de artefactos (como snippets de Stack Overflow) añade una complejidad significativa al almacenamiento y gestión de estos recursos.
La evolución de la arquitectura refleja un patrón común en sistemas distribuidos: comenzar con una solución monolítica o semi-monolítica y, a medida que crecen las demandas de escala, resiliencia y eficiencia de costos, migrar hacia un diseño más desacoplado y elástico. La adopción de Spot Instances y técnicas de caching avanzadas son respuestas directas a la necesidad de operar a gran escala con un presupuesto limitado, mientras se mantiene la disponibilidad y el rendimiento.
Arquitectura del Sistema
La arquitectura actual de Compiler Explorer en AWS se compone de varias capas. En el frontend, CloudFront actúa como CDN, con dos distribuciones: una para el sitio principal (godbolt.org) y otra para activos estáticos (static.ce-cdn.net) alojados en S3. AWS WAF se encarga del rate limiting y la mitigación básica de ataques. Detrás de CloudFront, un Application Load Balancer (ALB) dirige el tráfico a diferentes "fleets" (grupos de Auto Scaling) según la ruta de la URL (ej. /prod, /winprod, /aarch64prod, /gpu).
Cada "fleet" es un Auto Scaling Group que utiliza predominantemente Spot Instances para reducir costos. La estrategia de despliegue es "blue/green" para minimizar el downtime y facilitar rollbacks. El escalado se basa en la carga promedio de CPU, aunque se planea migrar a una métrica de profundidad de cola de SQS. Los binarios de los 6,000+ compiladores se almacenan en EFS. Para mitigar la latencia inherente de NFS con archivos pequeños (headers), se utiliza una técnica de SquashFS: imágenes de compiladores se empaquetan en SquashFS y se montan a través de un dispositivo loopback, permitiendo al kernel cachear bloques localmente. La evolución de esto es CEFS, un sistema de imágenes con direccionamiento por contenido, empaquetadas en bundles y montadas bajo demanda con autofs.
Otros servicios incluyen DynamoDB para almacenar short links, S3 para activos estáticos, logs y un cache de compilación con direccionamiento por contenido. AWS Lambda se usa para tareas asíncronas y de backend (ej. integración con Claude Explain, seguimiento de versiones, alertas). Un "CE Router" en desarrollo desacoplará la recepción de la solicitud HTTP de la máquina que realiza la compilación, utilizando SQS para la cola de trabajo y API Gateway WebSockets para la comunicación de resultados. Para mensajes grandes, se utiliza S3 como almacenamiento temporal, enviando solo la clave a SQS o API Gateway.
Flujo de Solicitud de Compilación (Actual)
- 1 Navegador Cliente Envía solicitud HTTP/S a godbolt.org
- 2 CloudFront CDN, cachea estáticos, comprime, reenvía a ALB
- 3 AWS WAF Rate limiting, filtrado de IPs
- 4 Application Load Balancer (ALB) Enruta a Target Group de Auto Scaling Group (ASG) apropiado (ej. /prod)
- 5 Instancia EC2 (ASG) Recibe solicitud, accede a compilador en EFS (vía SquashFS/CEFS)
- 6 EFS Almacena binarios de compiladores y sus imágenes SquashFS/CEFS
- 7 Instancia EC2 (ASG) Ejecuta compilación, devuelve resultado
- 8 Navegador Cliente Recibe y muestra el resultado
Flujo de Compilación (Futuro con CE Router)
- 1 Navegador Cliente Envía solicitud HTTP/S a godbolt.org
- 2 CloudFront / WAF / ALB Procesamiento inicial, enruta a CE Router
- 3 CE Router (Fleet EC2) Decide dónde compilar, busca en DynamoDB
- 4 SQS Cola de mensajes para solicitudes de compilación
- 5 Instancia EC2 (ASG de Compilación) Consume mensaje de SQS, realiza compilación
- 6 S3 (para resultados grandes) Almacena resultados de compilación si exceden límites de API Gateway
- 7 API Gateway WebSocket Envía resultado de compilación (o clave S3) al navegador
- 8 Navegador Cliente Recibe y muestra el resultado
| Capa | Tecnología | Justificación |
|---|---|---|
| networking | CloudFront | CDN para servir contenido estático y dinámico, reducir latencia y manejar compresión. Dos distribuciones separadas: una para godbolt.org (principal) y otra para static.ce-cdn.net (activos estáticos). Brotli compression activado recientemente. |
| security | AWS WAF | Firewall de aplicaciones web para rate limiting y mitigación de ataques básicos (ej. IPs maliciosas). Límites de rate muy altos para evitar bloquear usuarios legítimos detrás de NATs compartidos. Listas de IPs bloqueadas manualmente. |
| networking | Application Load Balancer (ALB) | Distribuye el tráfico HTTP/S a diferentes "fleets" de instancias EC2 basándose en reglas de ruta. Enrutamiento basado en prefijos de ruta (ej. /beta*, /winprod*, /aarch64prod*). |
| orchestration | Auto Scaling Group (ASG) | Gestiona la escala de las flotas de instancias EC2, reemplaza instancias fallidas y ajusta la capacidad. Estrategia de despliegue blue/green. Escalado basado en CPU promedio (futuro: profundidad de cola SQS). Utiliza Spot Instances con estrategia 'price-capacity-optimized'. |
| compute | EC2 Spot Instances | Provee capacidad de cómputo a bajo costo para cargas de trabajo tolerantes a interrupciones. vs EC2 On-Demand Instances Solicita 16 tipos de instancias diferentes (m5, m6, m7, r6, i3/i4i families) para maximizar disponibilidad y minimizar costos. Ahorro del 60-90%. |
| storage | EFS (Elastic File System) | Almacenamiento de archivos compartido y elástico para los binarios de los compiladores. Almacena 2.2TB de datos (antes 3.9TB). Latencia mitigada con SquashFS y CEFS. |
| storage | SquashFS / CEFS | Optimización de acceso a EFS para compiladores: empaqueta compiladores en imágenes de solo lectura montadas vía loopback para mejorar el caching del kernel y reducir la latencia de NFS. CEFS añade direccionamiento por contenido y montaje bajo demanda. vs Acceso directo a NFS CEFS redujo de 2,182 imágenes a 121 (inicialmente), mejorando el tiempo de arranque de OS de 50s a 20s. Empaquetamiento en bundles de ~20GB. |
| storage | DynamoDB | Base de datos NoSQL para almacenar enlaces cortos (short links) de compilaciones. Millones de entradas para godbolt.org/z/... |
| storage | S3 (Simple Storage Service) | Almacenamiento de objetos para activos estáticos, compiladores construidos, logs y un cache de compilación con expiración diaria. Cache de compilación content-addressable. |
| compute | AWS Lambda | Ejecuta funciones serverless para tareas asíncronas y de backend (ej. Claude Explain, seguimiento de versiones, alertas). |
| messaging | SQS (Simple Queue Service) | Cola de mensajes para desacoplar el frontend del backend de compilación en la futura arquitectura del CE Router. Límite de mensaje de 256KB, se usa S3 para mensajes más grandes. |
| networking | API Gateway WebSocket | Comunicación bidireccional en tiempo real para enviar resultados de compilación al navegador en la futura arquitectura del CE Router. Límite de frame de 32KiB, se usa S3 para resultados más grandes. |
| observability | CloudWatch / Grafana / Prometheus / Loki | Monitoreo y observabilidad de la infraestructura y aplicaciones. CloudWatch para auto-scaling triggers, Grafana/Prometheus/Loki para dashboards públicos. Dashboards de Grafana públicos. |
Trade-offs
Ganancias
- ▲▲ Reducción de costos operativos
- ▲ Resiliencia y disponibilidad
- ▲ Velocidad de despliegue y rollback
- ▲ Latencia de acceso a compiladores
- ▲ Tiempo de arranque de instancias
Costes
- ▲ Complejidad de la infraestructura
- △ Latencia para usuarios geográficamente distantes
- △ Visibilidad del comportamiento del usuario (por anonimato)
Fundamentos Teóricos
La optimización del acceso a sistemas de archivos distribuidos, como la estrategia de SquashFS sobre EFS, se relaciona con los principios de caching y localidad de referencia. La idea de "laundering" la naturaleza de NFS a través de un dispositivo loopback para mejorar el caching del kernel es una aplicación práctica de cómo las capas de abstracción pueden explotar características del sistema operativo para optimizar el rendimiento, un concepto explorado en papers sobre sistemas de archivos distribuidos y virtualización de almacenamiento. La gestión de un vasto número de artefactos inmutables (versiones de compiladores) y su deduplicación a través de direccionamiento por contenido (CEFS) se alinea con los principios de sistemas de almacenamiento inmutables y content-addressable storage, que tienen raíces en la investigación de sistemas de archivos distribuidos como Venti o Plan 9's Fossil, donde la integridad y la eficiencia del almacenamiento se logran mediante hashes criptográficos de los contenidos.
El uso de Auto Scaling Groups y Spot Instances para cargas de trabajo tolerantes a fallos es una aplicación directa de la computación elástica y la gestión de recursos en la nube, un área de investigación activa en la academia desde principios de los 2000. La migración hacia un "CE Router" con SQS y API Gateway refleja el patrón de diseño de "queue-based load leveling" o "work queue pattern", un principio fundamental en sistemas distribuidos para desacoplar productores y consumidores, mejorar la resiliencia y permitir el escalado asíncrono, conceptos bien establecidos en la literatura sobre sistemas de mensajes y arquitecturas orientadas a eventos.