Microsoft Orleans

Orleans es un marco multiplataforma para compilar aplicaciones distribuidas sólidas y escalables. Las aplicaciones distribuidas se definen como aplicaciones que abarcan más de un único proceso, a menudo más allá de los límites de hardware mediante la comunicación punto a punto. Orleans se escala desde un único servidor local a cientos o miles de aplicaciones de alta disponibilidad distribuidas en la nube. Orleans amplía los conceptos conocidos y las expresiones de C# a entornos multiservidor. Orleans está diseñado para escalarse de manera elástica. Cuando un host se une a un clúster, puede aceptar nuevas activaciones. Cuando un host sale del clúster, ya sea debido a una reducción vertical o a un error de máquina, las activaciones anteriores en dicho host se reactivarán en los hosts restantes según sea necesario. Un clúster de Orleans se puede reducir verticalmente a un único host. Las mismas propiedades que permiten la escalabilidad elástica también permiten la tolerancia a errores. El clúster detecta y recupera los errores de manera automática y rápida.

Uno de los principales objetivos de diseño de Orleans es simplificar las complejidades del desarrollo de aplicaciones distribuidas al proporcionar un conjunto común API y patrones. Con Orleans, los desarrolladores familiarizados con el desarrollo de aplicaciones de servidor único pueden realizar fácilmente la transición a la creación de servicios nativos en la nube resistentes y escalables, así como otras aplicaciones distribuidas. Por este motivo, Orleans a menudo se conoce como ".NET distribuido" y es el marco de elección para la compilación de aplicaciones nativas de la nube. Orleans puede ejecutarse en cualquier lugar donde se admita .NET. Esto incluye Linux, Windows y macOS. Las aplicaciones de Orleans se pueden implementar en servicios de Kubernetes, máquinas virtuales y PaaS, como, por ejemplo, Azure App Service y Azure Container Apps.

El "Modelo de actor"

Orleans se basa en el "modelo de actor". El modelo de actor se originó a principios de la década de 1970 y ahora es un componente principal de Orleans. El modelo de actor es un modelo de programación en el que cada actor es un objeto ligero, simultáneo e inmutable que encapsula un fragmento de estado y un comportamiento correspondiente. Los actores se comunican exclusivamente entre sí mediante mensajes asincrónicos. Orleans inventó la abstracción del actor virtual, donde los actores existen de manera perpetua.

Nota

Los actores son entidades puramente lógicas que siempre existen virtualmente. Un actor no se puede crear ni destruir explícitamente y su existencia virtual no se ve afectada por el error de un servidor que lo ejecute. Dado que los actores siempre existen, siempre son direccionables.

Se trata de un enfoque nuevo para crear una nueva generación de aplicaciones distribuidas para la era de la nube. El modelo de programación de Orleans tamiza la complejidad inherente a las aplicaciones distribuidas altamente paralelas sin restringir las funcionalidades ni imponer restricciones al desarrollador.

Para más información, consulte Orleans: Actores virtuales a través de Microsoft Research. Un actor virtual se representa como un grano de Orleans.

¿Qué son los granos?

El grano es uno de varios primitivos de Orleans. En términos del modelo de actor, un grano es un actor virtual. El bloque de creación fundamental en cualquier aplicación de Orleans es el grano. Los granos son entidades que comprenden la identidad, el comportamiento y el estado definidos por el usuario. Tenga en cuenta la siguiente representación visual de un grano:

A grain is composed of a stable identity, behavior, and state.

Las identidades de grano son claves definidas por el usuario que hacen que los granos estén siempre disponibles para la invocación. Otros granos o cualquier número de clientes externos pueden invocar los granos. Cada grano es una instancia de una clase que implementa una o varias de las interfaces siguientes:

Los granos pueden tener datos de estado volátiles o persistentes que se pueden almacenar en cualquier sistema de almacenamiento. Por lo tanto, los granos particionan implícitamente los estados de la aplicación, lo que permite la escalabilidad automática y simplifica la recuperación de errores. El estado de grano se mantiene en la memoria mientras el grano está activo, lo que provoca una menor latencia y menor carga en los almacenes de datos.

The managed lifecycle of an Orleans grain.

La creación de una instancia se realiza automáticamente en el runtime de Orleans a petición. Los granos que no se usan durante un tiempo se quitan automáticamente de la memoria para liberar recursos. Esto es posible debido a su identidad estable, lo que permite invocar granos tanto si ya están cargados en memoria como si no. Esto también permite la recuperación transparente de errores porque el autor de la llamada no necesita saber en qué servidor se crea una instancia de un grano en cualquier momento. Los granos tienen un ciclo de vida administrado, con el tiempo de ejecución de Orleans responsable de la activación o desactivación, así como la colocación o localización de granos según sea necesario. Esto permite al desarrollador escribir código como si todos los granos siempre estuvieran en memoria.

¿Qué son los silos?

Un silo es otro ejemplo de primitivo de Orleans. Un silo hospeda uno o varios granos. El runtime de Orleans es lo que implementa el modelo de programación para las aplicaciones.

Normalmente, un grupo de silos se ejecuta como un clúster para ofrecer escalabilidad y tolerancia a errores. Cuando se ejecuta como un clúster, los silos se coordinan entre sí para distribuir el trabajo y detectar y recuperarse de errores. El tiempo de ejecución permite que los granos hospedados en el clúster se comuniquen entre sí como si estuvieran dentro de un único proceso. Para ayudar a visualizar la relación entre clústeres, silos y granos, tenga en cuenta el siguiente diagrama:

A cluster has one or more silos, and a silo has one or more grains.

En el diagrama anterior se muestra la relación entre clústeres, silos y granos. Puede tener cualquier número de clústeres. Cada clúster tiene uno o más silos y cada silo tiene uno o varios granos.

Además del modelo de programación principal, los silos proporcionan granos con un conjunto de servicios en tiempo de ejecución, como temporizadores, recordatorios (temporizadores persistentes), persistencia, transacciones, secuencias, etc. Para más información, consulte ¿Qué puedo hacer con Orleans?

Las aplicaciones web y otros clientes externos llaman a granos en el clúster mediante la biblioteca cliente, que administra automáticamente la comunicación de red. Los clientes también se pueden hospedar conjuntamente en el mismo proceso con silos para simplificar.

¿Qué puedo hacer con Orleans?

Orleans es un marco para crear aplicaciones nativas de la nube y debe tenerse en cuenta cada vez que cree aplicaciones .NET que finalmente necesite escalar. Las formas de usar Orleans son infinitas, pero a continuación se describen algunas de las formas más comunes: juegos, banca, aplicaciones de chat, seguimiento de GPS, comercio con acciones, carros de la compra, aplicaciones de votación, etc. Microsoft usa Orleans en Azure, Xbox, Skype, Halo, PlayFab, Gears of War y muchos otros servicios internos. Orleans tiene muchas características que facilitan el uso de una amplia variedad de aplicaciones.

Persistencia

Orleans proporciona un modelo de persistencia sencillo que garantiza que el estado esté disponible antes de procesar una solicitud y de que su coherencia se mantenga. Los granos pueden tener varios objetos de datos persistentes con nombre. Por ejemplo, puede haber uno llamado "perfil" para el perfil de un usuario y otro denominado "inventario" para su inventario. Este estado se puede almacenar en cualquier sistema de almacenamiento.

Mientras se ejecuta un grano, el estado se mantiene en memoria para que se puedan atender las solicitudes de lectura sin tener acceso al almacenamiento. Cuando el grano actualiza su estado, la llamada IStorage.WriteStateAsync garantiza que el almacén de copia de seguridad se actualice para ofrecer durabilidad y coherencia.

Para obtener más información, consulte Persistencia de granos.

Recordatorios y temporizadores

Los recordatorios son un mecanismo de programación duradero para granos. Se pueden usar para asegurarse de que una acción se complete en un momento futuro, incluso si el grano no está activado actualmente en ese momento. Los temporizadores son el homólogo no duradero de los recordatorios y se pueden usar para eventos de alta frecuencia, que no requieren confiabilidad.

Para obtener más información, consulte Temporizadores y recordatorios.

Colocación de granos flexible

Cuando se activa un grano en Orleans, el tiempo de ejecución decide en qué servidor (silo) se debe activar ese grano. Esto se denomina colocación de grano.

El proceso de selección de ubicación en Orleans es totalmente configurable. Los desarrolladores pueden elegir entre un conjunto de directivas de selección de ubicación predeterminadas, como, por ejemplo, las aleatorias, preferidas locales y basadas en carga, o bien pueden configurar una lógica personalizada. Esto ofrece una flexibilidad total para decidir dónde se crean los granos. Por ejemplo, los granos se pueden colocar en un servidor cerca de los recursos que necesitan para operar o de otros granos con los que se comunican.

Para más información, consulte la Ubicación de granos.

Control de versiones pormenorización y clústeres heterogéneos

La actualización de sistemas de producción de una manera que tenga en cuenta de forma segura los cambios puede ser difícil, especialmente en sistemas con estado. Para tener esto en cuenta, se pueden crear versiones de interfaces de granos en Orleans.

El clúster mantiene una asignación de las implementaciones específicas que están disponibles en cada silos del clúster y de las versiones de esas implementaciones. El tiempo de ejecución usa esta versión de la información junto con las estrategias de selección de ubicación para tomar decisiones de selección de ubicación al enrutar llamadas a granos. Además, para actualizar de forma segura un grano con versiones, esto también permite clústeres heterogéneos, donde diferentes silos tienen diferentes conjuntos de implementaciones de grano disponibles.

Para más información, consulte Control de versiones de granos.

Trabajadores sin estado

Los trabajadores sin estado están especialmente marcados como granos que no tienen ningún estado asociado y se pueden activar en varios silos simultáneamente. Esto permite aumentar el paralelismo para las funciones sin estado.

Para obtener más información, consulte Granos de trabajadores sin estado.

Filtros de llamadas de grano

Un filtro de llamada de grano es una lógica que es común a muchos granos. Orleans admite filtros para las llamadas entrantes y salientes. Los filtros de autorización, registro y telemetría, y control de errores se consideran comunes.

Contexto de solicitud

Los metadatos y otra información se pueden pasar con una serie de solicitudes mediante el contexto de solicitud. El contexto de solicitud se puede usar para contener información de seguimiento distribuida o cualquier otro valor definido por el usuario.

Transacciones ACID distribuidas

Además del modelo de persistencia simple descrito anteriormente, los granos pueden tener un estado transaccional. Varios granos pueden participar en transacciones ACID juntas, independientemente de dónde se almacene su estado en última instancia. Las transacciones en Orleans están distribuidas y descentralizadas (no hay ningún administrador de transacciones central o coordinador de transacciones) y tienen aislamiento serializable.

Para más información sobre las transacciones, vea Transacciones.

Secuencias

Las secuencias ayudan a los desarrolladores a procesar una serie de elementos de datos casi en tiempo real. Las secuencias de Orleans son administradas; no es necesario crear ni registrar secuencias antes de la publicación de un cliente o un grano, ni de que se suscriban a una secuencia. Esto ofrece un mayor desacoplamiento de los productores y consumidores de secuencias entre sí y de la infraestructura.

El procesamiento de secuencias es confiable: los granos pueden almacenar puntos de control (cursores) y restablecerse a un punto de control almacenado durante la activación o en cualquier momento posterior. Las secuencias admiten la entrega por lotes de mensajes a los consumidores para mejorar la eficiencia y el rendimiento de la recuperación.

Las secuencias cuentan con el respaldo de los servicios de cola como Azure Event Hubs y Amazon Kinesis, entre otros.

Cabe la posibilidad de multiplexar un número arbitrario de secuencias en un número menor de colas. La responsabilidad de procesar estas colas se equilibra uniformemente en el clúster.

Vídeo de introducción a Orleans

Si quiere ver un vídeo de introducción a Orleans, mire el siguiente:

Pasos siguientes