Microsoft Orleans
Orleans:
- Es un marco multiplataforma para crear aplicaciones distribuidas sólidas y escalables. Las aplicaciones distribuidas se definen como aplicaciones que abarcan más de un solo proceso, a menudo más allá de los límites de hardware mediante la comunicación punto a punto.
- Escala desde un único servidor local a miles de aplicaciones distribuidas y de alta disponibilidad en la nube.
- Amplía los conceptos conocidos y las expresiones de C# a entornos de varios servidores.
- Está diseñado para escalar de manera elástica. Cuando un host se une a un clúster, puede aceptar nuevas activaciones. Cuando un host sale del clúster, las activaciones anteriores en ese host se reactivarán en los hosts restantes según sea necesario. Un host puede dejar un clúster debido a una reducción de escala o a un fallo de máquina. Un clúster de Orleans se puede reducir a un único host. Las mismas propiedades que habilitan la escalabilidad elástica permiten la tolerancia a errores. El clúster detecta y recupera rápidamente los errores.
- Simplifica las complejidades del desarrollo de aplicaciones distribuidas proporcionando un conjunto común de patrones y API.
- Permite a los desarrolladores familiarizados con el desarrollo de aplicaciones de servidor único realizar la transición a la creación de servicios nativos en la nube resistentes y escalables y aplicaciones distribuidas.
- A veces se denomina "Distributed .NET".
- Es el marco de trabajo que se elige al desarrollar aplicaciones nativas para la nube.
- Se ejecuta en cualquier lugar en el que se admita .NET. Esto incluye el hospedaje en Linux, Windows y macOS.
- Las aplicaciones se pueden implementar en servicios de Kubernetes, máquinas virtuales y PaaS, como 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 el comportamiento correspondiente. Los actores se comunican exclusivamente entre sí mediante mensajes asincrónicos. Orleans inventó notablemente la abstracción de Actor Virtual , en la que los actores existen perpetuamente.
Nota
Los actores son entidades puramente lógicas que siempre existen en un entorno virtual. 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 ejecuta. Puesto que los actores siempre existen, siempre son accesibles.
Este es un enfoque innovador para crear una nueva generación de aplicaciones distribuidas para la era de la nube. El modelo de programación Orleans tamiza la complejidad inherente a las aplicaciones distribuidas altamente paralelas sin restringir las funcionalidades ni imponer restricciones al desarrollador.
Para obtener más información, consulte Orleans: Virtual Actors 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 incluyen identidad, comportamiento y estado definidos por el usuario. Tenga en cuenta la siguiente representación visual de un grano:
Las identidades de grano son claves definidas por el usuario que hacen que los granos estén siempre disponibles para la invocación. Los granos pueden ser invocados por otros granos o por cualquier número de clientes externos. Cada grano es una instancia de una clase que implementa una o más de las siguientes interfaces:
- IGrainWithGuidKey: interfaz de marcador para intervalos de agregación con claves
Guid
. - IGrainWithIntegerKey: interfaz de marcador para intervalos de agregación con claves
Int64
. - IGrainWithStringKey: interfaz de marcador para intervalos de agregación con claves
string
. - IGrainWithGuidCompoundKey: interfaz de marcador para intervalos de agregación con claves compuestas.
- IGrainWithIntegerCompoundKey: interfaz de marcador para intervalos de agregación con claves compuestas.
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, permitiendo la escalabilidad automática y simplificando la recuperación de fallos. El estado de grano se mantiene en memoria mientras el grano está activo, lo que conduce a una menor latencia y menos carga en los almacenes de datos.
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 si ya están cargados en la memoria o 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 entorno de ejecución de Orleans responsable de activar o desactivar y colocar o localizar granos según sea necesario. Esto permite al desarrollador escribir código como si todos los granos siempre estén en memoria.
¿Qué son los Silos?
Un silo es otro ejemplo de un primitivo Orleans. Un silo hospeda uno o varios granos. El entorno de ejecución 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 la escalabilidad y la 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 diagrama siguiente:
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 más 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 obtener 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 una plataforma para desarrollar aplicaciones nativas para la nube y se debe tener en cuenta siempre que se desarrolle aplicaciones .NET que necesiten escalar en algún momento. Hay formas aparentemente infinitas de usar Orleans, pero las siguientes son algunas de las formas más comunes; Juegos, banca, aplicaciones de chat, seguimiento gps, trading de stock, carros de compras, 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 su uso para una variedad de aplicaciones.
Persistencia
Orleans proporciona un modelo de persistencia simple que garantiza que el estado esté disponible antes de procesar una solicitud y que se mantenga su coherencia. 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.
Temporizadores y recordatorios
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) activar ese grano. Esto se denomina ubicación de grano.
El proceso de colocación en Orleans es totalmente configurable. Los desarrolladores pueden elegir entre un conjunto de políticas de colocación integradas, tales como aleatoria, preferencia local y basada en la carga, o se puede configurar una lógica personalizada. Esto permite una flexibilidad completa 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 un mapa de qué implementaciones de granos están disponibles en qué silos del clúster y las versiones de dichas 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 versionado, esto también permite crear clústeres heterogéneos, donde diferentes silos tienen disponibles diferentes conjuntos de implementaciones de granos.
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 llamadas entrantes y salientes. Los filtros de autorización, registro y telemetría, y el 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 distribuido 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 de Orleans se distribuyen y descentralizan (no hay ningún administrador central de transacciones ni coordinador de transacciones) y tienen un aislamiento serializable .
Para obtener más información sobre las transacciones, vea Transactions.
Arroyos
Los flujos 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 intervalo de agregación, ni de que se suscriban a una secuencia. Esto permite un mayor desacoplamiento de los productores y consumidores de flujos tanto entre ellos como de la infraestructura.
El procesamiento de flujos es confiable: los granos pueden almacenar puntos de control (cursores) y restablecerlos a un punto de control almacenado durante la activación o en cualquier momento posterior. Los flujos 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.
Introducción al vídeo de Orleans
Si está interesado en una introducción en vídeo a Orleans, consulte el vídeo siguiente: