Eventos
Compilación de Intelligent Apps
17 mar, 21 - 21 mar, 10
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.
Regístrese ahoraEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
Este artículo se aplica a: ✔️ Orleans 7.x y versiones posteriores
Este artículo se aplica a: ✔️ Orleans 3.x y versiones anteriores
Una activación de grano es una instancia en memoria de una clase de grano que se crea automáticamente mediante el runtime de Orleans según sea necesario como una realización física temporal de un grano.
La recopilación de activación es el proceso de eliminación de la memoria de activaciones de granos no utilizados. Conceptualmente es similar a cómo funciona la recolección de elementos no utilizados de memoria en .NET. Sin embargo, la recopilación de activación solo tiene en cuenta cuánto tiempo ha estado inactiva una activación específica. El uso de memoria no se usa como factor.
El proceso general de la recopilación de activación implica que el tiempo de ejecución Orleans en un silo busque periódicamente activaciones de granos que no se hayan utilizado en absoluto durante el período configurado (Límite de antigüedad de colección). Una vez que la activación de grano ha estado inactiva durante ese tiempo, se desactiva. El proceso de desactivación comienza por el tiempo de ejecución que llama al método del grano OnDeactivateAsync() y se completa quitando las referencias al objeto de activación pormenorizado de todas las estructuras de datos del silo, de modo que el GC de .NET reclama la memoria.
Como resultado, sin ninguna carga puesta en el código de la aplicación, solo las activaciones de grano usadas recientemente permanecen en la memoria mientras las activaciones que ya no se usan se quitan automáticamente y los recursos del sistema usados por ellos se reclaman por el tiempo de ejecución.
Lo que cuenta como "estar activo" para la colección de activación de grano
Lo que cuenta como "estar activo" para la colección de activación de grano
Límite de edad de colección
Esta vez, después de la cual una activación de grano inactivo se somete a colección, se denomina Límite de antigüedad de colección. El límite predeterminado de edad de colección es de 15 minutos, pero se puede cambiar globalmente o para clases de grano individuales.
Esta vez, después de la cual una activación de grano inactivo se somete a colección, se denomina Límite de antigüedad de colección. El límite predeterminado de edad de colección es de 2 horas, pero se puede cambiar globalmente o para clases de grano individuales.
Una activación de grano puede retrasar su propia colección, llamando al método DelayDeactivation:
protected void DelayDeactivation(TimeSpan timeSpan)
Esta llamada garantiza que esta activación no se desactive durante al menos la duración de tiempo especificada. Tiene prioridad sobre la configuración de la colección de elementos de activación especificada en la configuración, pero no las cancela. Por lo tanto, esta llamada proporciona otro enlace para retrasar la desactivación más allá de lo especificado en la configuración de colección de elementos de activación. Esta llamada no se puede usar para acelerar la colección de elementos de activación.
Un valor positivo timeSpan
significa "evitar que la colección de esta activación durante ese tiempo".
Un valor negativo timeSpan
significa "cancelar la configuración anterior de la llamada DelayDeactivation
y hacer que esta activación se comporte en función de la configuración normal de la colección de elementos de activación".
Escenarios:
La configuración de colección de elementos de activación especifica un límite de edad de 10 minutos y el grano realiza una llamada a DelayDeactivation(TimeSpan.FromMinutes(20))
, lo que hace que esta activación no se recopile durante al menos 20 minutos.
La configuración de colección de elementos de activación especifica un límite de edad de 10 minutos y el grano realiza una llamada a DelayDeactivation(TimeSpan.FromMinutes(5))
, la activación se recopilará después de 10 minutos, si no se realizaron llamadas adicionales.
La configuración de colección de elementos de activación especifica un límite de edad de 10 minutos y el grano realiza una llamada a DelayDeactivation(TimeSpan.FromMinutes(5))
, y después de 7 minutos hay otra llamada en este grano, la activación se recopilará después de 17 minutos a partir del cero, si no se realizaron llamadas adicionales.
La configuración de colección de elementos de activación especifica un límite de edad de 10 minutos y el grano realiza una llamada a DelayDeactivation(TimeSpan.FromMinutes(20))
, y después de 7 minutos hay otra llamada en este grano, la activación se recopilará después de 20 minutos a partir del cero, si no se realizaron llamadas adicionales.
DelayDeactivation
no garantiza al 100 % que la activación de grano no se desactivará antes de que expire el tiempo especificado. Algunos casos de error pueden provocar la desactivación "prematura" de los granos. Esto significa que DelayDeactivation
no se puede usar como medio para "anclar" una activación de intervalo de agregación en la memoria para siempre o para un silo específico. DelayDeactivation
es simplemente un mecanismo de optimización que puede ayudar a reducir el coste agregado de un grano que se desactiva y reactiva con el tiempo. En la mayoría de los casos, no debe haber necesidad de usar DelayDeactivation
en absoluto.
Una activación de grano también puede indicarle al tiempo de ejecución que lo desactive la próxima vez que quede inactivo llamando al método DeactivateOnIdle():
protected void DeactivateOnIdle()
Una activación específica se considera inactiva si no está procesando ningún mensaje en este momento. Si llama a DeactivateOnIdle
mientras un grano procesa un mensaje, se desactiva en cuanto finaliza el procesamiento del mensaje actual. Si hay alguna solicitud en cola para el grano, se reenviará a la siguiente activación.
DeactivateOnIdle
tiene prioridad sobre cualquier configuración de colección de elementos de activación especificada en la configuración o DelayDeactivation
.
Nota
La configuración solo se aplica a la activación específica desde la que se ha llamado y no se aplica a otra activación específica de este tipo.
La colección de activación se puede configurar mediante GrainCollectionOptions:
mySiloHostBuilder.Configure<GrainCollectionOptions>(options =>
{
// Set the value of CollectionAge to 10 minutes for all grain
options.CollectionAge = TimeSpan.FromMinutes(10);
// Override the value of CollectionAge to 5 minutes for MyGrainImplementation
options.ClassSpecificCollectionAge[typeof(MyGrainImplementation).FullName] =
TimeSpan.FromMinutes(5);
})
Para mantener un grano activo, aplique Orleans.KeepAliveAttribute a la implementación de granos. El atributo KeepAlive
indica al tiempo de ejecución Orleans que evite recopilar el grano por parte del recopilador de activación inactiva. Evitar la recolección es útil para granos que se usan con poca frecuencia, pero que desea mantener vivo para evitar cualquier sobrecarga de creación potencial.
public interface IPlayerGrain : IGrainWithGuidKey
{
Task<IGameGrain> GetCurrentGame();
Task JoinGame(IGameGrain game);
Task LeaveGame(IGameGrain game);
}
[KeepAlive]
public class PlayerGrain : Grain, IPlayerGrain
{
private IGameGrain _currentGame;
public Task<IGameGrain> GetCurrentGame()
{
return Task.FromResult(_currentGame);
}
public Task JoinGame(IGameGrain game)
{
// Omitted for brevity.
return Task.CompletedTask;
}
public Task LeaveGame(IGameGrain game)
{
// Omitted for brevity.
return Task.CompletedTask;
}
}
El código anterior impide que el recopilador de activación inactivo recopile PlayerGrain
.
Comentarios de .NET
.NET es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios:
Eventos
Compilación de Intelligent Apps
17 mar, 21 - 21 mar, 10
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.
Regístrese ahoraCursos
Módulo
Creación de la primera aplicación de Orleans con ASP.NET Core 8.0 - Training
Aprenda a crear aplicaciones nativas de la nube y aplicaciones distribuidas con Orleans.
Documentación
Obtenga información sobre el directorio de granos de .NET Orleans.
Aprenda a escribir clientes de .NET Orleans.
Información general sobre el ciclo de vida del grano - .NET
Obtenga información sobre los ciclos de vida de los granos en .NET Orleans.