SDD en microservicios: ¿cómo gestionar cambios que afectan a varios servicios?
Cuando un cambio "derrama" de un microservicio a otro, el problema raramente es SDD. Casi siempre es que los dominios no están bien definidos. Cómo aplicar DDD, eventos y Consumer-Driven Contracts para contenerlo.
El problema que no es SDD
Cuando un cambio en microservicios "derrama" hacia otros servicios y parece que SDD pierde eficiencia, el diagnóstico habitual apunta a la metodología. Casi siempre el diagnóstico correcto apunta a la arquitectura.
SDD funciona con precisión quirúrgica cuando los dominios están bien aislados. Si un cambio de negocio genuinamente pertenece a un solo bounded context, el spec vive en un único repositorio, el agente lo implementa de forma independiente y el deploy no requiere coordinación. Ese es el escenario ideal — y el más frecuente en organizaciones que han invertido en diseño de dominios.
El escenario problemático surge cuando los dominios no están bien definidos: la lógica de negocio está repartida entre dos o más servicios de forma arbitraria, y cualquier cambio significativo requiere tocar múltiples repositorios. En ese caso, el problema es la deuda de diseño, no la metodología.
Dos escenarios muy distintos
Dominios bien aislados
El cambio afecta a un solo bounded context. SDD funciona a pleno rendimiento: la spec del ticket vive en el repositorio del microservicio, el agente la lee, la implementa y no necesita coordinar con ningún otro servicio.
SDD es eficiente. Una spec, un PR, una deployment pipeline.
Dominios mal aislados — el "derrame"
El cambio toca lógica que está repartida entre dos o más servicios porque la separación de responsabilidades no es clara. El agente necesita contexto de múltiples repositorios, los specs se multiplican y la coordinación de deploys se complica.
SDD pierde eficiencia. El problema no es la metodología — es la arquitectura.
Tres estrategias para gestionar cambios cross-dominio
Revisar los bounded contexts antes de escribir la spec
Antes de redactar el spec SDD de un cambio cross-dominio, pregúntate: ¿debería este cambio afectar a más de un servicio, o hay una responsabilidad mal asignada? A veces la solución correcta es mover lógica al servicio que le corresponde, no coordinar múltiples deploys.
Usar arquitecturas basadas en eventos para desacoplar
Cuando el cambio genuinamente afecta a múltiples dominios, la respuesta arquitectónica es un event broker (Kafka, RabbitMQ, SQS). El servicio A publica un evento; el servicio B lo consume. Los cambios cross-dominio se convierten en cambios en el contrato del evento, que SDD puede especificar de forma independiente en cada lado.
Consumer-Driven Contracts con Pact IO
Cuando dos servicios se comunican directamente (REST o gRPC), el consumidor define sus expectativas de contrato y el proveedor verifica que las cumple. Pact IO automatiza esto en el pipeline de CI. El spec SDD del lado consumidor incluye el contrato de Pact; el del proveedor incluye la verificación.
Consumer-Driven Contracts en la práctica
Pact IO permite que el consumidor defina sus expectativas de contrato de forma independiente. El proveedor verifica esas expectativas en su propio pipeline de CI, sin necesidad de despliegues coordinados ni entornos de integración compartidos. El spec SDD de cada servicio incluye la referencia al contrato de Pact correspondiente.
// consumer.pact.spec.ts — define lo que el consumidor espera
import { PactV3, MatchersV3 } from '@pact-foundation/pact';
const provider = new PactV3({
consumer: 'orders-service',
provider: 'inventory-service',
});
describe('Inventory API — contrato del consumidor', () => {
it('devuelve stock disponible para un SKU válido', async () => {
await provider
.addInteraction({
states: [{ description: 'el SKU ABC-123 tiene stock' }],
uponReceiving: 'solicitud de stock para SKU ABC-123',
withRequest: { method: 'GET', path: '/stock/ABC-123' },
willRespondWith: {
status: 200,
body: MatchersV3.like({ sku: 'ABC-123', available: 42 }),
},
})
.executeTest(async (mockServer) => {
const result = await checkStock(mockServer.url, 'ABC-123');
expect(result.available).toBeGreaterThan(0);
});
});
});
// El proveedor (inventory-service) verifica este contrato en su CI
// sin necesidad de que los dos equipos sincronicen el deploymentEl spec SDD delorders-serviceincluye el contrato Pact como criterio de aceptación. El delinventory-serviceincluye la verificación como parte de su DoD. Cada equipo trabaja de forma independiente.
La regla de oro: DDD antes que SDD
Si cada semana aparecen cambios que afectan a tres o más microservicios, la inversión prioritaria no es mejorar las specs SDD. Es revisar el diseño de dominios. Los síntomas de dominios mal definidos son siempre los mismos:
Resumen práctico: SDD y microservicios son perfectamente compatibles cuando los dominios están bien definidos. La inversión en DDD — Event Storming, definición de bounded contexts, claridad de ownership — es el prerequisito que hace que SDD funcione a escala. Sin esa base, el problema de los cambios cross-dominio no lo resuelve ninguna metodología.
Referencias
¿Quieres aplicar esto en tu equipo?
En Kuuli Technologies llevamos estas metodologías a equipos reales. Escríbenos si quieres una sesión de trabajo o una consultoría sobre agentes IA y SDD.