Por qué SDD falla en microservicios: Parte 2. Por qué construí Archspec para mantener el contexto del servicio explícito
Cuando se trabaja con arquitecturas basadas en microservicios, uno de los desafíos más complejos que enfrentan los equipos de desarrollo es mantener la coherencia del contexto entre servicios. El desarrollo guiado por especificaciones, conocido como SDD, suele funcionar bien a nivel de un único servicio, pero comienza a mostrar sus limitaciones en cuanto una funcionalidad cruza varios dominios. El problema no es que los equipos no sepan documentar, sino que las reglas que conectan los servicios entre sí rara vez están escritas en un solo lugar. Algunas residen en el código, otras en la memoria del equipo y muchas emergen solo durante las revisiones. Esta falta de un contrato explícito y legible por máquina genera errores difíciles de detectar hasta fases avanzadas del ciclo de vida del software.
Para abordar esta carencia, surge la necesidad de un contrato de arquitectura que capture las reglas entre servicios de forma estructurada. La idea es simple: cada servicio debe disponer de un contrato legible por máquina que describa sus responsabilidades, invariantes, extremos, eventos y dependencias, y que pueda verificarse automáticamente en cada commit. Esto no solo proporciona contexto preciso a los sistemas de inteligencia artificial que asisten en el desarrollo, sino que también sirve como fuente única de verdad para toda la documentación técnica asociada. En lugar de depender de archivos Markdown dispersos y propensos a quedar desactualizados, se genera un artefacto YAML que puede ser procesado por herramientas de integración continua.
En la práctica, la inicialización de este contrato implica recoger metadatos básicos del servicio, como nombre, equipo propietario, dominio y URL del repositorio, pero también requiere capturar las responsabilidades y garantías que el servicio debe preservar. Por ejemplo, un servicio que gestiona tareas debe asegurar que cada escritura pase por un patrón Outbox para mantener la consistencia entre el estado interno y los eventos publicados. Además, durante la inicialización se escanea el código para detectar automáticamente los extremos RPC y HTTP, los eventos publicados, el almacenamiento utilizado y el modelo de escritura principal. Este análisis automatizado reduce la probabilidad de describir un extremo que ya no existe o de olvidar un evento que el servicio realmente envía.
Uno de los aspectos más valiosos de este enfoque es la explicitación de las lagunas. Cuando un extremo requiere idempotencia pero el almacenamiento de claves aún no está implementado, el contrato lo marca explícitamente como not-implemented. De igual modo, si un SLA está definido como requisito pero la métrica no se recoge, se indica como not-measured. Estas marcas no representan un estado deseado, sino una lista clara de lo que aún necesita trabajo. Esto permite a los revisores ver tanto lo que el servicio ya tiene como lo que falta, facilitando la priorización de mejoras técnicas.
La generación de documentación debe ser predecible y reproducible. Un mismo conjunto de datos de entrada debe producir exactamente el mismo resultado; de lo contrario, los desarrolladores empiezan a desconfiar de las comprobaciones automáticas. Para garantizar esto, las herramientas que mantienen el contrato deben regenerar la página de arquitectura y los diagramas a partir de la especificación YAML cada vez que se modifica. Así, un pull request contiene un conjunto conectado de cambios: código, contrato y documentación generada. Además, los ganchos previos al commit verifican que no se hayan realizado ediciones manuales en las secciones generadas, que no haya valores TODO en campos obligatorios y que el patrón Outbox solo se asigne a servicios que realmente cambian su propio estado y publican eventos de forma atómica.
Otro punto crítico es la detección de consumidores entre servicios. Encontrar qué servicios llaman a un servicio concreto es una tarea mecánica que debe realizarse mediante scripts, no delegarse a un modelo de lenguaje. La automatización garantiza que los enlaces entre servicios no se pasen por alto. Una vez que se han inicializado varios contratos, se puede realizar una comprobación global que verifique, por ejemplo, que si el servicio A llama al servicio B, entonces B debe listar a A como consumidor, o que cada evento publicado tenga un consumidor registrado. Esta validación cruzada ayuda a mantener la coherencia en toda la arquitectura.
En el contexto empresarial actual, contar con contratos de arquitectura explícitos se alinea con las mejores prácticas de gobierno técnico. Herramientas como Archspec permiten que el equipo de desarrollo mantenga un control fino sobre las reglas entre servicios, facilitando la adopción de prácticas de calidad como la revisión estructurada de cambios. Este tipo de soluciones encajan perfectamente en proyectos donde se requiere un enfoque profesional y riguroso, como los que abordamos en Q2BSTUDIO, donde ayudamos a las organizaciones a construir software a medida que resuelve problemas reales de escalabilidad y mantenibilidad. La capacidad de mantener el contexto del servicio explícito también es fundamental cuando se integran ia para empresas en procesos de desarrollo, ya que los modelos de lenguaje necesitan información precisa y estructurada para asistir en tareas complejas como la generación de código o la planificación de funcionalidades.
Además, la gestión de la complejidad en microservicios se beneficia directamente de la automatización de procesos y de una correcta gobernanza de datos. Las organizaciones que adoptan este tipo de contratos pueden aplicar posteriormente servicios inteligencia de negocio y herramientas como power bi para monitorizar el cumplimiento de los acuerdos de nivel de servicio y la evolución de la deuda técnica. Del mismo modo, la integración con servicios cloud aws y azure permite que los contratos de arquitectura sean verificados en pipelines de CI/CD, garantizando que cada despliegue respeta las reglas definidas. La incorporación de agentes IA que lean estos contratos y asistan en la revisión de cambios es una tendencia creciente que ya estamos explorando en proyectos reales.
El valor de mantener un contrato de arquitectura explícito va más allá de la documentación: se convierte en una herramienta de comunicación entre equipos, en un mecanismo de detección temprana de inconsistencias y en una base sólida para la automatización de validaciones. En un entorno donde la velocidad de entrega compite con la calidad, contar con un sistema que obligue a explicitar las reglas entre servicios es una inversión que amortiza cada vez que un desarrollador revisa un PR y encuentra, junto al diff de código, el diff del contrato de arquitectura. Así se evitan discusiones sobre lo que debería hacer un servicio y se centra la atención en lo que realmente está implementado y acordado.
Comentarios