Encore integra un servidor Redis en memoria dentro de su runtime en Rust

Fuentes: We put a Redis server inside our runtime

El framework Encore ejecuta el mismo código backend en desarrollo local, en pruebas y en producción, provisionando la infraestructura declarada por la aplicación. Para que el entorno local sea realmente útil, esa infraestructura debe estar presente en la máquina del desarrollador y comportarse como en producción. Bases de datos y pub/sub se levantan con relativa facilidad (Docker para las primeras, NSQ local para el segundo), pero la caché resultaba más compleja: o se ejecutaba un Redis real en otro contenedor, o se recurría a mocks que solo imitaban parcialmente el comportamiento del servidor.

Encore adoptó una vía distinta: integrar un servidor Redis en memoria directamente en el runtime. En su versión Go, la compañía ya empleaba miniredis, un servidor Redis en memoria escrito en Go. Al construir el nuevo runtime en Rust para aplicaciones TypeScript, el equipo descartó ejecutarlo como proceso externo (lo que obligaba a distribuir un binario adicional y supervisar otro proceso) y decidió portar miniredis a Rust. El puerto, unas 25.000 líneas de código, implementa los tipos de datos habituales (strings, hashes, listas, conjuntos, conjuntos ordenados, streams, pub/sub, transacciones y scripting Lua), escucha en un socket TCP y habla el protocolo RESP, no siendo un stub limitado a un subconjunto de comandos.

El servidor integrado conserva además el comportamiento operativo del original, incluyendo un reloj simulado que avanza cada segundo para que las expiraciones basadas en tiempo funcionen en sesiones largas, y una tarea que limita el número de claves. La aplicación declara la caché en código con CacheCluster y keyspaces, y el runtime decide automáticamente, mediante un flag in_memory en la configuración, si arranca el servidor embebido (desarrollo y pruebas) o se conecta a un Redis gestionado (producción). El código de la aplicación es idéntico en ambos casos; solo cambia la dirección a la que se conecta el cliente de Redis.

Para asegurar la paridad con Redis, el equipo ejecuta la suite de integración Go original contra el servidor en Rust y compara las respuestas RESP byte a byte. Esa comparación ya ha detectado diferencias reales, como la necesidad de exponer un comando para avanzar el reloj simulado y la de construir una cadena de certificados válida para las pruebas TLS.

El servidor embebido es un recurso de desarrollo y pruebas, no de producción, donde Encore sigue aprovisionando Redis gestionado. Integrarlo en el runtime es lo que permite que el comportamiento local reproduzca el de producción sin instalaciones adicionales.