Joaquin Martinez

Depura tus errores y construye la mejor versión de ti, cada línea cuenta.

SOA: Una introducción práctica a la arquitectura orientada a servicios

23-09-2024
Desarrollo de software
Fundamentos de arquitectura de software
Cover Post

Arquitectura Orientada a Servicios (SOA): Conceptos y Topologías Esenciales

La arquitectura orientada a servicios (SOA) es un paradigma de diseño de software que estructura una aplicación en componentes modulares e independientes. Estos componentes, llamados servicios, son piezas de código reutilizables que realizan funciones específicas. A lo largo de este post, exploraremos qué es SOA, sus topologías más comunes y conceptos clave para su implementación.

¿Qué es la Arquitectura Orientada a Servicios?

Una arquitectura orientada a servicios (SOA) es un enfoque de diseño de software que utiliza componentes llamados servicios. Podemos pensar en estos servicios como bloques de construcción o módulos de código que cumplen una función específica y que pueden ser reutilizados por diferentes aplicaciones. Esta modularidad y su naturaleza distribuida permiten desarrollar sistemas más flexibles y escalables. La principal característica de SOA es que los servicios son independientes y pueden ser invocados para realizar funcionalidades concretas.

Un beneficio pragmático de esta arquitectura es su adaptabilidad. Si necesitamos añadir una nueva funcionalidad al sistema, basta con crear un nuevo servicio sin tener que modificar los existentes. Esto reduce el riesgo de errores y acelera el desarrollo.

Componentes Clave de una Arquitectura SOA

En su configuración más básica, la arquitectura SOA se compone de:

  • Interfaz de Usuario (UI): Es la capa con la que interactúa el usuario. Se comunica con los distintos servicios para invocar las funcionalidades necesarias.
  • Servicios (Services): Son los componentes modulares y autosuficientes. Están desarrollados de manera independiente y se comunican con la base de datos para la lectura y escritura de información.
  • Base de Datos (Database): Almacena los datos del sistema.

alt text

Esta topología básica puede ser muy útil para sistemas sencillos, pero a medida que la complejidad crece, es necesario implementar variantes más sofisticadas para gestionar la comunicación y la seguridad.

Topologías de la Arquitectura SOA

La arquitectura SOA no es monolítica; tiene distintas variantes que se adaptan a las necesidades específicas de un proyecto.

alt text

Topología con Capa de Comunicación (API)

Una de las primeras variantes es la que añade una capa de comunicación o API (Application Programming Interface). Esta capa actúa como un intermediario, separando las responsabilidades de comunicación de la interfaz de usuario. Al centralizar la comunicación a través de una API, obtenemos mayor control sobre el flujo de datos. En esta topología, la interfaz de usuario llama a los servicios a través de la API, que a su vez se encarga de gestionar los cambios en la base de datos.

Esta separación es clave para implementar medidas de seguridad como un rate limiter, que minimiza los riesgos de ataques cibernéticos al controlar el número de peticiones por unidad de tiempo.

alt text

Topología con Separación por Dominio

En esta variante, se hace énfasis en la separación de la interfaz de usuario por dominios de negocio o funcionalidades. Por ejemplo, una interfaz podría estar dedicada a la gestión de “Pedidos” y otra a la de “Inventario”. Esta separación por dominios se traduce también en una distinción entre los servicios que se conectan a estas interfaces. Esto es ideal para aplicaciones grandes y complejas, donde distintos equipos de desarrollo trabajan en áreas de negocio separadas.

alt text

Topología con Separación Granular

La última variante, y una de las más avanzadas, introduce una separación granular por servicios y dominios. En este modelo, es común que cada servicio tenga su propia base de datos dedicada. Esto es crucial porque no siempre tendremos una base de datos monolítica; en cambio, el sistema puede estar compuesto por bases de datos distintas (SQL, NoSQL, etc.) optimizadas para las necesidades de cada servicio. Esta independencia de datos ayuda a evitar la duplicidad y a gestionar bases de datos que, en un enfoque monolítico, serían demasiado complejas.

La Granularidad de los Servicios

Una vez que se entienden las topologías, el siguiente paso es comprender la granularidad de los servicios, que se refiere al tamaño y alcance de cada uno. Es un factor crítico en el diseño de un sistema basado en SOA. Un servicio muy grande podría ser difícil de mantener, mientras que uno muy pequeño podría generar un exceso de comunicación entre componentes.

alt text

Hay dos enfoques de diseño para definir la granularidad:

  • Diseño por Capas: Cada servicio tiene una arquitectura interna bien definida, con tres capas principales:
    • Capa de Comunicación (API): Encargada de recibir y enviar datos.
    • Capa de Negocio (Business Logic): Contiene las reglas y la lógica de negocio.
    • Capa de Persistencia (Data Layer): Gestiona la interacción con la base de datos.
  • Diseño por Dominio: En este enfoque, el servicio se centra en una funcionalidad de negocio específica (un dominio). Dentro de la capa de comunicación (API), se encuentran distintos módulos que corresponden a este dominio. Es un enfoque muy popular en el diseño de microservicios.

Resolviendo Problemas de Concurrencia

Cuando se tienen múltiples servicios que acceden a una base de datos, el flujo de peticiones puede generar problemas de concurrencia o de corrupción de datos. Afortunadamente, existen soluciones para mitigar estos riesgos:

alt text

  • Federación de Librerías: Consiste en la integración de librerías mediante el trabajo colaborativo. Son librerías compartidas que se integran en los servicios que las necesiten. Esto ayuda a mantener la consistencia y a reducir la duplicidad de código en funciones comunes.
  • Partición en la Base de Datos: Similar a la partición de discos, este método busca dividir los datos en fragmentos más pequeños, llamados shards, que se distribuyen en diferentes tablas o servidores. La partición de bases de datos mejora la escalabilidad, el rendimiento y la tolerancia a fallos.

¿Cuándo Implementar una Arquitectura SOA?

La decisión de usar una arquitectura SOA depende de la complejidad y los requisitos del proyecto.

alt text

  • Usar SOA cuando:
    • Necesitas que los componentes de tu sistema sean reutilizables.
    • Planeas desarrollar funcionalidades de forma independiente, lo que acelera el tiempo de lanzamiento al mercado.
    • El sistema es grande y requiere una alta escalabilidad y flexibilidad.
    • Se espera que el sistema sea accesible desde múltiples plataformas (web, móvil, etc.).
  • Evitar SOA cuando:
    • El proyecto es pequeño y simple, y la sobrecarga de gestión de múltiples servicios no justifica los beneficios.
    • Se requiere una alta cohesión entre componentes que no pueden ser fácilmente separados.
    • La infraestructura de desarrollo y operaciones no está preparada para gestionar un sistema distribuido.

Comprender estas topologías y conceptos es esencial para diseñar sistemas de software robustos, flexibles y escalables.

Post Siguiente

Arquitectura de microservicios: Conceptos clave para desarrolladores

Post Anterior

Arquitectura basada en eventos: Guía y tipos de topologías