Ventajas de Orleans

Las principales ventajas de Orleans son las siguientes:

  • Productividad del desarrollador, incluso en el caso de programadores no expertos.
  • Escalabilidad transparente de forma predeterminada sin ningún esfuerzo especial por parte del programador.

Productividad del desarrollador

El modelo de programación de Orleans aumenta la productividad de los programadores expertos e inexpertos, al ofrecer las siguientes abstracciones, garantías y servicios del sistema principales.

Paradigma familiar de programación orientada a objetos (OOP)

Los granos son clases de .NET que implementan interfaces de grano de .NET declaradas con métodos asincrónicos. Loso granos aparecen ante el programador como objetos remotos cuyos métodos se pueden invocar directamente. Esto ofrece al programador el paradigma familiar de programación orientada a objetos al convertir las llamadas de método en mensajes, enrutarlos a los puntos de conexión correctos, invocar los métodos del grano de destino y tratar los errores y los casos extremos de forma transparente.

Ejecución uniproceso de granos

El runtime garantiza que un grano nunca se ejecuta en más de un subproceso a la vez. Esto, combinado con el aislamiento de otros granos, garantiza que el programador nunca detecte simultaneidad en el nivel de grano y nunca necesite usar bloqueos u otros mecanismos de sincronización para controlar el acceso a los datos compartidos. Esta característica por sí sola permite que los desarrolladores inexpertos puedan controlar el desarrollo de aplicaciones distribuidas.

Activación transparente

El runtime activa un grano solo cuando hay un mensaje que debe procesar. Esto separa limpiamente el concepto de crear una referencia a un grano, que el código de la aplicación puede ver y controlar, y la activación física del grano en la memoria, que es transparente para la aplicación. Esto es similar a la memoria virtual, en el sentido de que decide cuándo desactivar o activar un grano. La aplicación tiene acceso ininterrumpido al "espacio de memoria" completo de los granos creados lógicamente, independientemente de si se encuentran o no en la memoria física en un momento determinado.

La activación transparente permite el equilibrio de carga dinámico y adaptable mediante la colocación y la migración de granos en el grupo de recursos de hardware. Esta característica es una mejora considerable en el modelo de actor tradicional, en el que la duración del actor la administra la aplicación.

Transparencia de la ubicación

Una referencia de grano (objeto proxy) que el programador usa para invocar los métodos de grano o para pasarlos a otros componentes solo contiene la identidad lógica del grano. El entorno de ejecución de Orleans realiza de manera transparente el traslado de la identidad lógica del grano a su ubicación física y el enrutamiento correspondiente de los mensajes.

El código de la aplicación se comunica con los granos, pero desconoce su ubicación física, que puede cambiar con el paso del tiempo debido a errores o a la administración de recursos, o bien porque un grano se desactiva en el momento en el que se le llama.

Integración transparente con un almacén persistente

Orleans permite la asignación declarativa del estado en memoria de un grano a un almacén persistente. Sincroniza las actualizaciones y garantiza de forma transparente que los llamadores reciben resultados solo después de que el estado persistente se haya actualizado correctamente. El proceso de ampliar o personalizar el conjunto de proveedores existentes de almacenamiento persistente que están disponibles es sencillo.

Propagación automática de errores

El runtime propaga automáticamente los errores no controlados por la cadena de llamadas con la semántica de try/catch asincrónica y distribuida. Como resultado, los errores no se pierden en una aplicación. Esto permite al programador colocar la lógica de control de errores en los lugares adecuados, lo que le ahorra el tedioso trabajo de propagar los errores manualmente en cada nivel.

Escalabilidad transparente de forma predeterminada

El modelo de programación de Orleans está diseñado para guiar al programador por el camino que probablemente sea el más adecuado a la hora de escalar una aplicación o servicio varios órdenes de magnitud. Esto se consigue con la incorporación de procedimientos y patrones recomendados y con una implementación eficaz de funcionalidad del sistema de menor nivel.

A continuación, se muestran algunos de los factores clave que permiten la escalabilidad y el rendimiento:

Partición específica implícita del estado de la aplicación

Mediante el uso de granos como entidades direccionables directamente, el programador desglosa implícitamente el estado general de la aplicación. Aunque el modelo de programación de Orleans no establece lo grande o pequeño que debe ser un grano, en la mayoría de los casos tiene sentido contar con un número relativamente grande de granos (millones o más), cada uno de los cuales representa una entidad natural de la aplicación, como una cuenta de usuario o un pedido de compra.

Dado que los granos son direccionables individualmente y que el entorno de ejecución abstrae su ubicación física, Orleans tiene una gran flexibilidad para equilibrar la carga y tratar con las zonas activas de forma transparente, generalmente sin que el desarrollador de la aplicación tenga que hacer nada.

Administración de recursos adaptativa

Los granos no presuponen la ubicación de otros granos al interactuar con ellos. Debido a la transparencia de la ubicación, el runtime puede administrar y ajustar la asignación de recursos de hardware disponibles de manera dinámica. Para ello, el runtime toma decisiones específicas sobre la ubicación y la migración granos actores en el clúster de proceso como reacción a los patrones de comunicación y carga, sin que las solicitudes entrantes generen errores. Mediante la creación de varias réplicas de un grano determinado, el runtime puede aumentar el rendimiento del grano sin realizar cambios en el código de la aplicación.

Comunicación multiplexada

Los granos de Orleans tienen puntos de conexión lógicos y la mensajería entre ellos se multiplexa a través de un conjunto fijo de conexiones físicas de tipo "todos a todos" (sockets TCP). Esto permite que el runtime hospede millones de entidades direccionables con una baja sobrecarga del sistema operativo por grano. Además, cuando se activa o desactiva un grano, no se incurre en el coste de registrar un punto de conexión físico (como un puerto TCP o una dirección URL HTTP) o anular su registro, y ni siquiera de cerrar una conexión TCP.

Programación eficaz

El runtime programa la ejecución de un gran número de granos de un solo subproceso mediante el grupo de subprocesos de .NET, que está altamente optimizado para el rendimiento. El código del grano está escrito en el estilo basado en la continuación sin bloqueo (un requisito del modelo de programación de Orleans), por lo que el código de la aplicación se ejecuta de una manera multiproceso “cooperativa” muy eficaz, sin contención. Esto permite que el sistema consiga un rendimiento alto y se ejecute con un uso de CPU muy elevado (de hasta un 90 %) con gran estabilidad.

El hecho de que el aumento del número de granos en el sistema y el incremento de la carga no den lugar a subprocesos adicionales u otras primitivas de sistema operativo favorece la escalabilidad de los nodos individuales y de todo el sistema.

Asincronía explícita

El modelo de programación de Orleans hace que la naturaleza asincrónica de una aplicación distribuida sea explícita y ayuda a los programadores a escribir código asincrónico sin bloqueo. Al combinarlo con la mensajería asincrónica y la programación eficaz, esto permite un grado elevado de paralelismo distribuido y rendimiento general sin el uso explícito de multithreading.