Cómo escribir código OOP para un entorno en clúster

Cuando está escribiendo programas para un entorno en clúster, mantiene el estado en una ubicación central que es accesible para todos los nodos de trabajo en el clúster, O fragmenta el estado y lo almacena en el clúster, y hace que cada nodo funcione solo en él propia porción de datos.

La primera estrategia es la que usan comúnmente las aplicaciones de 3 niveles.

La capa de presentación es responsable de mostrar los datos al usuario. La capa de Servidor / Aplicación tiene la lógica de negocios, y la capa de la base de datos tiene estado. Esto permite que la aplicación se amplíe agregando más servidores en la capa de aplicación a medida que aumenta el número de solicitudes, y que se amplíe agregando más servidores a la capa de base de datos a medida que aumentan los datos. El problema con esta arquitectura es que incurre en IO entre la aplicación y las capas de datos, y no puede escalar IO agregando hardware. Además, la contención de datos en la capa de datos puede agregar cuellos de botella

Esta arquitectura es una buena opción para las aplicaciones web, ya que las aplicaciones web generalmente no procesan una gran cantidad de datos en cada solicitud, y puede diseñar su capa de datos de una manera que minimice la contención entre solicitudes

La segunda estrategia es utilizada por muchas aplicaciones de análisis de datos / big data. Los marcos como Apache Hadoop y Apache Spark se construyen alrededor de esto

Aquí, la capa HDFS almacena los datos de manera distribuida al particionar los datos y almacenarlos en los nodos Slave. La capa Map Reduce es responsable de hacer el análisis. Lo hace enviando la ejecución a los nodos esclavos, y cada nodo trabaja en su propio segmento de datos y lo devuelve al nodo maestro. El nodo maestro acepta los datos recibidos de todos los esclavos. La ventaja aquí es que no hay ningún costo de E / S incurrido entre el código que procesa datos y el código que almacena datos. Esto se escala mucho mejor para aplicaciones que necesitan muchos datos.

Una cosa que es común en ambas arquitecturas es que mantiene el código que procesa los datos separados del código que mantiene el estado . Esto es lo que se entiende por construir aplicaciones sin estado. En el caso de arquitecturas de 3 niveles, el código que procesa los datos está físicamente separado del código que almacena los datos. Esto le permite ampliar el procesamiento fácilmente. En el caso de arquitecturas similares a Hadoop, el código analítico está separado lógicamente de los datos. Esto se debe a que cuando los datos crecen, puede agregar más nodos y volver a fragmentarlos.


Entonces, no es que cubrimos arquitecturas, hablemos de OOP y cómo se relaciona con el diseño de estas capas. En ambas arquitecturas, los datos fluyen a través de capas sucesivas, y todas las capas no tienen estado hasta la última capa, que es la capa de datos, y es responsable de mantener el estado. Es un error decir que OOP tiene estado. No. En OOP, cada clase encapsula su estado . Hay una diferencia muy sutil pero importante aquí. La encapsulación no implica necesariamente mantener el estado .

La razón principal por la que desea utilizar OOP es porque desea modelar el software para que coincida con los conceptos del mundo real. Además, desea hacerlo de manera que las clases sean plug-and-play. Debería poder reemplazar una implementación de la clase por otra fácilmente. Es por eso que necesita encapsulación porque proporciona ocultación de datos . Una clase oculta toda la lógica necesaria para mantener sus propios datos, por lo que puede cambiar la lógica fácilmente sin afectar a nadie más.

Una forma ingenua de encapsular datos es simplemente mantener los datos en la memoria. Y si abre la mayoría de los libros de texto de OOP para principiantes, esto es lo que muestran, porque es más simple ilustrar la encapsulación. Sin embargo, una clase también puede encapsular datos almacenando los datos en el almacén de datos. Aún obtiene los beneficios de ocultar datos si una clase encapsula todo el acceso a los datos.

La encapsulación consiste en ocultar la lógica, no retener datos. Puede ser apátrida y flexible asegurándose de que todo el acceso a los datos se realice a través de una clase responsable de administrar el estado en la capa de datos.

Estado es una palabra cargada. Significa cosas diferentes en diferentes contextos. Cuando los proveedores de la nube lo alientan a crear aplicaciones sin estado, realmente se refieren a la arquitectura de la aplicación y no a la elección de su lenguaje de programación. Y cuando dicen “estado”, se refieren al estado de su aplicación. En la mayoría de los casos, esto generalmente significa las sesiones de usuario, no el estado de sus instancias de clase. Puedo escribir mi aplicación en un lenguaje que no sea OOP como C y todavía tengo una arquitectura completa para mi aplicación.

Ya sea en la nube o en cualquier otro entorno escalable horizontalmente, todos sus servidores se encuentran detrás de un equilibrador de carga. Todas las solicitudes entrantes se distribuyen a los servidores de forma circular. En tales escenarios, ayuda que sus aplicaciones no tengan estado. Todo el estado se externaliza en una tienda estatal separada. De esta manera, no importa en qué servidor se ejecute su aplicación, puede obtener el estado de la aplicación relevante desde una tienda externa.

Considere esto con un enfoque de estado completo donde cada servidor almacena el estado de la aplicación en la memoria en lugar de un almacén externo. El equilibrador de carga ya no distribuye el tráfico entrante de manera equitativa en un round robin, sino que tiene que hacer algunas rutas inteligentes. Tiene que averiguar qué servidor contiene el estado del usuario actual y luego reenviar las solicitudes entrantes al servidor en consecuencia. Esto generalmente genera muchos gastos generales en el equilibrador de carga y la carga no se distribuye uniformemente entre los servidores. Esto realmente no es una arquitectura ideal si desea escalar su aplicación horizontalmente.

Le remito al artículo de P&P de Microsoft aquí – Capítulo 6 – Mejora del rendimiento de ASP.NET para comprender cómo las aplicaciones con estado son un obstáculo para el escalado horizontal.

Una vez que comprenda la naturaleza de las aplicaciones sin estado, debe comprender la naturaleza efímera de las máquinas virtuales aprovisionadas en la nube. No tiene control completo sobre el ciclo de vida de una máquina virtual. ¿Qué sucede cuando el proveedor de la nube retira su VM para instalar actualizaciones de seguridad? ¿Qué sucede cuando un centro de datos se cae? Para garantizar una alta disponibilidad, se utilizan varias máquinas virtuales para atender el tráfico de aplicaciones, en el momento en que una falla, las operaciones en la nube automatizadas generalmente activan otra máquina virtual y su código puede comenzar a ejecutarse inmediatamente en la nueva máquina virtual. En este contexto, su aplicación sin estado significa que su aplicación no asume nada sobre el entorno de ejecución.

En resumen, “sin estado” es una arquitectura de aplicación semántica en el contexto de la nube, no un nivel de lenguaje de programación semántico.

Tu lo dijiste.

No puede escribir código OOP en nodos de un clúster.

La solución es usar OOP dentro de los servicios web. Luego, diseñe sus API para proporcionar una interfaz de servicio orientada a lotes.

Cada servicio puede mantener un estado relacionado consigo mismo en la tienda adata. Pero cada solicitud debe ser apátrida, por lo que el servicio puede equilibrar la carga fácilmente