Serie Backend y plataformas · Post 2
En el post anterior hablamos del mensaje ejecutivo: por qué Rust aparece en plataformas multi-producto y qué señales miran equipos y stakeholders. Ahora bajamos un peldaño, sin aún desarmar Tokio ni Axum: qué declara un proyecto en Cargo.toml y qué forma tiene el programa que finalmente corre en el servidor.
¿Qué es una "edición" en Rust (2021, 2024 y compañía)?
Rust no avanza solo con versiones del compilador (rustc 1.x): también hay ediciones del lenguaje: hasta ahora 2015, 2018, 2021 y 2024, que es la edición estable más reciente (activable con toolchains desde Rust 1.85 en adelante). Una edición es un conjunto de reglas y comportamientos acordados que se activan en el crate con algo como:
edition = "2021"
edition = "2024"
La idea clave para gestión y talento es esta: no se obliga a reescribir todo el ecosistema cada vez. Crates distintos en el mismo árbol de dependencias pueden usar ediciones distintas; el compilador las sabe compilar juntas. Para una organización, eso se traduce en evolución sin parálisis: puedes actualizar toolchain y dependencias con un modelo de compatibilidad entendible, no en un "gran bang" cada año.
Señal para equipos que auditan repos: Si ves
edition = "2021"oedition = "2024", estás viendo una decisión explícita sobre el dialecto del crate. 2024 no invalida a 2021: son convivencia planificada, no dos lenguajes distintos.
El binario de servicio: un solo punto de entrada
En muchos servicios backend en Rust, el patrón dominante es un único binario cuyo main es el punto de entrada del proceso: ahí se carga configuración, se inicializa el runtime asíncrono (cuando aplica), se arma el router HTTP y se enlaza un puerto (o socket) para recibir tráfico.
¿Por qué importa a nivel ejecutivo y operaciones?
- Despliegue simple Un artefacto (o imagen) corresponde a un proceso con responsabilidad clara. Encaja con systemd, contenedores, Kubernetes y reinicios predecibles.
- Menos capas "mágicas" No dependes de un contenedor de aplicación que levante un servidor dentro de otro servidor. El modelo típico es: proceso = servicio.
- Observabilidad acotada Logs, métricas y trazas se anclan a un solo proceso y a su ciclo de vida (arranque, señales de apagado, etc.).
Esto no impide tener varios binarios en el mismo repositorio ([[bin]] o varios targets), pero el patrón mental del backend "clásico" que describe la ficha técnica es: un servicio HTTP, un main, un proceso en producción.
¿Esto significa que el sistema es un monolito?
No necesariamente. En el post, "binario único" habla del artefacto y el proceso: un ejecutable que arranca el servidor HTTP de ese servicio. Eso puede ser un microservicio (un binario por servicio, varios servicios en producción), un BFF, un worker, etc.
Binario único
Detalle de empaquetado y operación: un proceso, un ejecutable, un ciclo de vida claro.
Monolito vs microservicios
Decisión de límites entre servicios y equipos, no de "tener un main".
En resumen: un proceso = un binario es empaquetado; monolito vs microservicios es arquitectura de negocio. Rust funciona bien en ambos mundos: varios binarios pequeños o un binario grande modular.
Microservicios: módulos en un crate vs varios binarios
Cuando en la empresa se define una arquitectura de microservicios —varios despliegues, escalado y fallos acotados por servicio— el distintivo en runtime no es "tener muchos mod en un solo proyecto", sino varios procesos en producción, en la práctica un binario por microservicio.
Partir el código en módulos pero generar un único ejecutable sigue siendo un monolito modular: si cae ese proceso, cae toda la operación que vivía en él.
En Rust esa división se logra con varios paquetes Cargo, cada uno con su main y su artefacto de despliegue. Pueden vivir en repositorios Git distintos o agruparse en un monorepo mediante un workspace de Cargo: la decisión es de gobernanza y CI, no de "si el lenguaje permite microservicios".
Rust encaja muy bien en ambientes empresariales que ya eligieron microservicios: binarios claros y livianos, dependencias explícitas, tipado fuerte para contratos entre equipos y ecosistema sólido para HTTP, gRPC y colas.
Cargo: el manifiesto que amarra edición y binario
En la práctica, Cargo.toml concentra lo que a otros equipos les interesa saber de un vistazo: nombre del paquete, edición, dependencias y qué binarios se construyen. Para stakeholders no técnicos, el mensaje útil es: el proyecto tiene un contrato de construcción versionado igual que el código, no un procedimiento oral en un wiki desactualizado.
Cierre y siguiente paso en la serie
La edición (2021, 2024 u otra) nombra cómo se interpreta el código a nivel de lenguaje en ese crate; el binario de servicio nombra qué se ejecuta en el servidor.
En el siguiente post entramos al runtime y la red: Tokio, Axum y el entorno en el que ese main pasa a manejar miles de conexiones sin bloquear el hilo equivocado.