En la actualidad es muy conocido el diseño arquitectónico de sistemas software en capas. También son conocidos los despliegues físicos en distintas unidades o servidores. Pero es bastante frecuente la confusión entre dos conceptos que pueden parecer similares pero que se refieren a aspectos diferentes del diseño de software: la división en capas y niveles.
Una de las técnicas mas comunes en ingeniería para la construcción de sistemas complejos es la división en distintas capas y niveles de abstracción. Esta práctica proviene del proverbio Divide y Vencerás, muy aplicado en ingeniería del software. Esta división del desarrollo software en capas permite aislar la forma de desarrollar, y mantener los sistemas con menos coste y mas facilidad. En caso de cambios, solo se verá afectada la capa en la que se trabaja.
La división en capas se puede observar en distintos ámbitos. Por ejemplo, en telecomunicaciones, tenemos la pila OSI como división en niveles de abstracción de los protocolos de red. Pero no es lo mismo el concepto de diseño en capas lógicas, que el despliegue en distintos niveles físicos.
Capa lógica (Layer)
Cuando se habla del concepto de capa lógica se hace referencia a un diseño de la organización y división del código del sistema a un nivel lógico. No se hace referencia a la ubicación física del despliegue, sino a la organización lógica del sistema.
Nivel físico (Tier)
El concepto de Nivel físico hace referencia a la organización y división a nivel físico, de los distintos componentes o elementos de diseño que conforman el sistema. Sólo los niveles físicos (Tier) implican una separación física de los componentes desplegados.
Capas y Niveles
Por tanto no se debe confundir un concepto con otro, aunque a menudo crea confusión y se suele pensar en tantos niveles físicos como capas lógicas tenga el diseño. Una aplicación de tres capas por ejemplo no tiene porqué tener tres niveles.
Por ejemplo, un diseño de una aplicación web en tres capas:

En esta aplicación se divide la lógica de la aplicación en una capa de Datos, que estaría en un SGBD. También una capa de Servidor Web, que sería el grueso de la lógica de la aplicación en sí. En esta capa estaría implementado el control del flujo de la aplicación, la vista de datos, etc. Por último, una capa de interfaz de usuario UI en un navegador web.
Es la clásica arquitectura de aplicación web en tres capas.
Puede hacer pensar que este diseño está compuesto por tres capas, y tres niveles. Pero no es así, estas tres capas pueden estar desplegadas en el mismo nivel:

Es decir, las tres capas funcionales podrían estar ejecutándose en el mismo nivel físico, dentro de la misma máquina. También podrían estar en distintos niveles, pero no tiene por qué coincidir el número de capas lógicas con el número de niveles físicos.
Beneficios de arquitectura multicapa y multinivel
Los diseños de arquitectura multicapa y multinivel aportan gran flexibilidad y una facilidad de mantenimiento, al separar la lógica de cada capa. De esta manera, un cambio en la lógica de una capa no debe afectar al resto de capas. Incluso puede estar separado físicamente, si se encuentran en distintos niveles.
Al independizar en capas, además aumenta el potencial de reutilización. Esto lo vemos claramente en las arquitecturas SOA, donde es posible componer servicios nuevos para aprovechar funcionalidades ya existentes. Además esto implica mas escalabilidad.
Pero no todo es bonito, la arquitectura multicapa aporta mayor complejidad al sistema, y la división en niveles lleva la mayor complejidad al despliegue. Además, hay que observar otros factores de la división en niveles, como la afectación al rendimiento. Al estar separados aumenta la carga de comunicación por red, y esto conlleva latencias en disponibilidad.
Criterios para dividir en capas y en niveles
Es fácil agrupar las funcionalidades en capas por aquello que tienen en común, como el manejo de datos, el manejo el control o flujo de la aplicación, y el manejo del interfaz de usuario o presentación.
Sin embargo la división en niveles no es tan fácil, y requiere buscar un equilibrio entre factores como:
- Rendimiento
- Escalabilidad
- Reusabilidad
La división en capas suele imponer restricciones a nivel de interacción, como la impermeabilidad entre capas lejanas. Por ejemplo, el diseño anterior de tres capas no permitiría la interacción entre la capa de Interfaz de Usuario y la capa de Datos.
Ejemplos de arquitecturas Multicapa y Multinivel
El hecho de que varias capas lógicas puedan ser desplegadas sobre el mismo nivel físico es lo que lleva bastante a confusión. Por ejemplo, veamos cómo una arquitectura en tres capas lógicas puede estar desplegado en dos niveles físicos:

Ya vimos anteriormente que podríamos tener las tres capas en el mismo nivel, pero también es posible tener dos capas en el mismo nivel y otra capa en otro nivel distinto.
Si consideramos la clásica arquitectura Cliente-Servidor, en dos capas, donde un servidor es capaz de proporcionar datos a todas las peticiones de los clientes, tendríamos esta despliegue:

Es lo que tenemos en mente siempre que hablamos de Cliente-Servidor. Sin embargo, podríamos tener que la aplicación servidor toma los datos desde un SGBD que está en otro nivel, teniendo un despliegue de dos capas en tres niveles:

¿Es posible esto?
Si, entendiendo la diferencia entre capa lógica y nivel físico. Como vemos, no se debe considerar que un Sistema Gestor de Base de Datos es una capa de Datos en sí. La capa lógica de datos puede contener una lógica de persistencia además de la propia gestión de datos. Y la gestión y almacén de datos puede estar en otro nivel.
En este caso, el nivel 1 físico tendría la base de datos, y el nivel 2 la lógica y aplicación Servidor. Por ejemplo, un Servidor Web en Jboss en el nivel 2 y un motor Oracle en el nivel 3, ambos formando parte de la capa lógica de Servidor.
Con estos ejemplos se pone de manifiesto la no correspondencia del número de capas y número de niveles, o la no correspondencia de unos con otros.
Framework de componentes distribuidos
Existen muchos framework para el diseño de arquitecturas de varios niveles, como por ejemplo en Java, que incluyen distintas tecnologías para el desarrollo de la lógica en cada capa.
El uso de estos frameworks facilitan un desarrollo multicapa, ya que incluyen distintas tecnologías específicas para cada una de las capas.

En el ejemplo tenemos una arquitectura de 4 capas y 4 niveles, con las tecnologías Java representativas de cada una de ellas.
MVC no son tres capas
Otra confusión respecto a estos modelos de diseño arquitectónico se refleja en el patrón Modelo-Vista-Controlador, donde se tiende a pensar que son tres capas lógicas. Realmente es muy común que la capa de Presentación agrupe tanto la Vista como el Controlador, ya que están estrechamente ligados a la presentación y flujo de la misma. Y en el caso del Modelo, es frecuente que contenga una capa para la gestión del acceso a datos, y la lógica de negocio de la aplicación.
Si incluimos en el diseño anterior de 4 capas y 4 niveles el patrón MVC podría ubicarse en la siguiente agrupación:

Por tanto, tampoco existe correspondencia directa entre los segmentos del patrón MVC y las capas lógicas, ni los niveles físicos.
5 ideas sobre “Capas y niveles: Diseño y confusión”
Muchas gracias por la información. Gran aporte de esta web. Saludos!
Esto que comentas lo he visto muchas veces, hay mucha gente que no tiene claros los conceptos de Capas (layers) y Niveles (Tiers) y lo ves cuando te hablan de capas y se están refiriendo a que está desplegado en distintos servidores fisicos.
Recomiendo este artículo para aclarar conceptos bastante confusos.
Es verdad! estudiando ahora las diferentes arquitecturas de software este articulo me aclaro mucho los conceptos y veo claramente las diferencias..Muchas Gracias al autor
Buena información, gracias por el artículo
Gran articulo. Se me ocurre una pregunta. Y como vemos estos nuevos frameworks o arquitecturas web tipo donde la presentación y la lógica están del lado del cliente (y hasta guardan caché como puede ser una PWA) y sólo acceden al servidor a recoger datos?? Sería 3 Capas / 2Tiers ?? teniendo como capas presentación + lógica + acceso a datos en el móvil y como Tiers el móvil y el servidor de base de datos. Sería Correcto?
Muchas Gracias.