Kotlin + Spring Boot 4
Clientes OkHttp + Failsafe para proveedores inestables, persistencia políglota (Postgres + Liquibase, Redis cache-aside, Mongo), escrituras fire-and-forget con corrutinas, un motor de reglas configurable y Testcontainers + MockK + Datadog — sobre un servicio real de valuación de vehículos.
- Núcleo: DI, Corrutinas y Capas
- Paso 1
Controller → Service → Repository
Cada solicitud de valuación de vehículos atraviesa tres capas con tres responsabilidades distintas — y mezclarlas es como se pudre un código base.
Leer lección - Paso 2
Inyección de Dependencias en Spring Boot 4
Cómo VehicleValuationService obtiene su repository y sus clientes de proveedores sin construirlos jamás — y por qué Boot 4 los encuentra más rápido que nunca.
Leer lección - Paso 3
Suspend de Principio a Fin
Una sola llamada bloqueante escondida dentro de una cadena de funciones suspend basta para detener el resto de las solicitudes que comparten su hilo — así se evita.
Leer lección - Paso 4
Ensamblando Todo: El Servicio de Valuación de Vehículos
Sigue un VIN desde la solicitud HTTP hasta la fila en la base de datos y de vuelta, y observa la inyección por constructor y las funciones suspend trabajar en cada tramo.
Leer lección - Paso 5
Configuración y Perfiles en Boot 4
El mismo código de VehicleValuationService debería apuntar a un endpoint de sandbox de Black Book en dev y al real en prod — sin que cambie una sola línea de código.
Leer lección - Llamando a APIs Externas Inestables de Forma Segura
- Paso 6
Fundamentos de OkHttp
Antes de poder llamar a Black Book, Carfax o S&P VIS de forma segura, necesitas un cliente HTTP que reutilice conexiones, tenga tiempos de espera predecibles y te permita interceptar cada solicitud.
Leer lección - Paso 7
Modelando los Clientes de Terceros: Black Book, Carfax y S&P VIS
Un contrato compartido, tres implementaciones específicas por proveedor, cada una lo bastante aislada como para que una rareza de Carfax nunca rompa una llamada a Black Book.
Leer lección - Paso 8
Reintentos con Failsafe
No toda llamada fallida a Black Book significa que Black Book está caída — construir una política de reintentos que sepa distinguirlo es lo que evita que un tropiezo se convierta en una respuesta equivocada.
Leer lección - Paso 9
Circuit Breakers con Failsafe
Cuando un proveedor realmente está caído, lo más considerado que puede hacer un cliente es dejar de llamarlo — y servir una respuesta cacheada en lugar de una falla lenta.
Leer lección - Persistencia Políglota
- Paso 10
Elegir un Almacén: Relacional vs Caché vs Documental
Nuestro servicio de valuación de vehículos escribe en tres bases de datos distintas a propósito — esta lección trata sobre la decisión, no sobre el recorrido de funciones.
Leer lección - Paso 11
Postgres para Tablas de Reglas y Migraciones con Liquibase
Las reglas que deciden guardrails, boosts y no-buys viven en Postgres porque son exactamente el tipo de dato que las bases de datos relacionales fueron diseñadas para proteger.
Leer lección - Paso 12
Redis y el Patrón Cache-Aside
Tres llamadas a proveedores por valuación son caras de repetir, tolerables de servir un poco desactualizadas, y exactamente lo que el patrón cache-aside de Redis fue construido para absorber.
Leer lección - Paso 13
MongoDB para Registros de Eventos: La Historia de Snowflake a Mongo
El rastro de auditoría solía llegar a Snowflake con un día de retraso mediante un job por lotes; moverlo a MongoDB cambió algo de poder analítico por un registro consultable en el instante en que ocurre el evento.
Leer lección - Paso 14
Elegir el Almacén Correcto para el Trabajo Correcto
Cuatro preguntas — consistencia, proporción de lectura/escritura, estabilidad de esquema, patrón de consulta — bastan para señalar casi cualquier tabla nueva hacia el almacén al que realmente pertenece.
Leer lección - Asíncrono Fuera del Hilo de la Petición
- Paso 15
Fire-and-Forget con Corrutinas
launch lanza trabajo en segundo plano y devuelve un Job; async devuelve un Deferred que debes esperar con await, y la escritura a Mongo necesita el primero, no el segundo.
Leer lección - Paso 16
Aislando Fallos con SupervisorJob
El fallo de una corrutina hija cancela por defecto a sus hermanas y a su padre; SupervisorJob rompe ese cable para que una escritura de auditoría fallida no arrastre nada más.
Leer lección - Paso 17
Aplicándolo: Escribiendo a Mongo Fuera del Hilo de la Petición
VehicleValuationService recibe su propio CoroutineScope de aplicación respaldado por SupervisorJob, inyectado como bean — nunca GlobalScope — para que la escritura a Mongo sobreviva la petición y los fallos queden contenidos.
Leer lección - Motores de Reglas y Decisión
- Paso 18
Por Qué las Cadenas de if No Escalan
Cada guardrail que pide el negocio aterriza como un `if` más en `valuate()` — hasta que la función tiene 200 líneas que nadie se atreve a tocar.
Leer lección - Paso 19
Modelando una Regla
Una interfaz, una jerarquía sellada de resultados y un número de prioridad — ese es todo el vocabulario sobre el que se construye el resto del motor de decisión.
Leer lección - Paso 20
Cargando Reglas desde CSV y una Tabla de Base de Datos
Las mismas columnas alimentan una regla ya sea que se analicen desde un archivo incluido al iniciar o se lean en vivo desde Postgres — el truco es una única función factory que ninguna fuente puede saltarse.
Leer lección - Paso 21
Evaluando Reglas: Recorrido por el Motor
Ordena una vez, evalúa cada regla en orden de prioridad, deja que una parada dura gane de inmediato y luego limita los boosts — cuatro pasos pequeños convierten un montón de reglas configuradas en un precio defendible.
Leer lección - Testing y Observabilidad
- Paso 22
Testcontainers para Postgres y Mongo
Un repositorio simulado deja pasar sin problema una migración rota o una clave duplicada; un Postgres y un Mongo reales, levantados solo para la prueba, no lo permiten.
Leer lección - Paso 23
MockK para los clientes de proveedores
La lección anterior defendía usar infraestructura real en tus pruebas; esta defiende justo lo contrario cuando la infraestructura le pertenece a otra empresa.
Leer lección - Paso 24
Métricas personalizadas de Datadog vía Micrometer
Las pruebas demuestran que el código es correcto una vez, en el CI; las métricas demuestran que sigue siendo correcto ahora mismo, en producción, a un dashboard de distancia de buscar en los logs.
Leer lección - Paso 25
Registro de límites de tasa
Una tormenta de reintentos que golpea un limitador de tasa puede generar más líneas de log por segundo de las que un humano jamás leerá; la solución es registrar menos, no registrar nada.
Leer lección - Paso 26
Uniendo todo: una solicitud, trazada
Veinticinco lecciones construyeron cada pieza por separado; esta última sigue un solo VIN a través de todas ellas, de principio a fin, en una sola solicitud.
Leer lección