Leer en inglés

Compartir a través de


Colección de activación

Elección de una versión de Orleans

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.

Funcionamiento de la recopilación de activación

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

  • Recibir una llamada de método.
  • Recibir un recordatorio.
  • Recibir un evento a través del streaming.

Lo que cuenta como "estar activo" para la colección de activación de grano

  • Realizar una llamada (a otro grano o a un cliente de Orleans).
  • Eventos del temporizador.
  • Operaciones arbitrarias de E/S o llamadas externas que no implican el marco de Orleans.

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.

Control explícito de la colección de activación

Retrasar la colección de activación

Una activación de grano puede retrasar su propia colección, llamando al método DelayDeactivation:

C#
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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Acelerar la colección de activaciones

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():

C#
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.

Configuración

La colección de activación se puede configurar mediante GrainCollectionOptions:

C#
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);
})

Mantener conexión

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.

C#
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.