영어로 읽기

다음을 통해 공유


활성화 컬렉션

Orleans 버전 선택

이 문서의 적용 대상: ✔️ Orleans 7.x 및 이후 버전

이 문서의 적용 대상: ✔️ Orleans 3.x 및 이전 버전

조직 활성화는 필요에 따라 Orleans 런타임에 의해 조직의 임시 실제 구현으로 자동 만들어지는 조직 클래스의 메모리 내 인스턴스입니다.

활성화 컬렉션은 사용되지 않는 조직 활성화를 메모리에서 제거하는 프로세스입니다. 개념적으로는 .NET에서 메모리의 가비지 컬렉션이 작동하는 방식과 유사합니다. 그러나 활성화 컬렉션은 특정 조직 활성화가 유휴 상태인 기간만 고려합니다. 메모리 사용량은 요인으로 사용되지 않습니다.

활성화 컬렉션의 작동 방식

활성화 컬렉션의 일반적인 프로세스에는 구성된 기간(컬렉션 기간 제한) 동안 전혀 사용되지 않은 조직 활성화를 주기적으로 검사하는 사일로의 Orleans 런타임이 포함됩니다. 조직 활성화가 해당 기간 동안 유휴 상태가 되면 비활성화됩니다. 비활성화 프로세스는 조직의 OnDeactivateAsync() 메서드를 호출하는 런타임에 의해 시작되고 사일로의 모든 데이터 구조에서 조직 활성화 개체에 대한 참조를 제거하여 완료되므로 메모리는 .NET GC에 의해 회수됩니다.

따라서 애플리케이션 코드에 부담을 주지 않고 최근에 사용된 조직 활성화만 메모리에 유지되는 반면 더 이상 사용되지 않는 활성화는 자동으로 제거되고 여기에 사용되는 시스템 리소스는 런타임에 의해 회수됩니다.

조직 활성화 컬렉션에 대해 "활성 상태"로 간주되는 항목

  • 메서드 호출 수신
  • 미리 알림 수신
  • 스트리밍을 통해 이벤트 수신

조직 활성화 컬렉션에 대해 "활성 상태"로 간주되지 않는 항목

  • 호출을 수행합니다(다른 조직 또는 Orleans 클라이언트에 대해).
  • 타이머 이벤트
  • Orleans 프레임워크와 관련되지 않은 임의의 IO 작업 또는 외부 호출입니다.

수집 기간 제한

이 시간이 지나면 유휴 상태인 조직 활성화가 컬렉션의 대상이 되며 이를 컬렉션 기간 제한이라고 합니다. 기본 컬렉션 기간 제한은 15분이지만 전역적으로 또는 개별 조직 클래스에 대해 변경할 수 있습니다.

이 시간이 지나면 유휴 상태인 조직 활성화가 컬렉션의 대상이 되며 이를 컬렉션 기간 제한이라고 합니다. 기본 수집 기간 제한은 2시간이지만 전역적으로 또는 개별 조직 클래스에 대해 변경할 수 있습니다.

활성화 컬렉션의 명시적 제어

활성화 컬렉션 지연

조직 활성화는 DelayDeactivation 메서드를 호출하여 자체 컬렉션을 지연할 수 있습니다.

C#
protected void DelayDeactivation(TimeSpan timeSpan)

이 호출은 이 활성화가 최소한 지정된 기간 동안 비활성화되지 않도록 합니다. 구성에 지정된 활성화 컬렉션 설정보다 우선하지만 취소하지는 않습니다. 따라서 이 호출은 활성화 컬렉션 설정에 지정된 것 이상으로 비활성화를 지연하는 또 다른 후크를 제공합니다. 이 호출은 활성화 컬렉션을 신속하게 처리하는 데 사용할 수 없습니다.

양수 timeSpan 값은 "해당 시간 동안 이 활성화의 컬렉션 방지"를 의미합니다.

음수 timeSpan 값은 "DelayDeactivation 호출의 이전 설정을 취소하고 일반 활성화 컬렉션 설정에 따라 이 활성화가 동작하도록 함"을 의미합니다.

시나리오:

  1. 활성화 컬렉션 설정은 기간 제한을 10분으로 지정하고, 조직이 DelayDeactivation(TimeSpan.FromMinutes(20)) 호출을 수행하면 이 활성화가 최소 20분 동안 수집되지 않습니다.

  2. 활성화 컬렉션 설정은 기간 제한을 10분으로 지정하고, 조직이 DelayDeactivation(TimeSpan.FromMinutes(5)) 호출을 수행하면 추가 호출이 없는 경우 이 활성화가 10분 후에 수집됩니다.

  3. 활성화 컬렉션 설정은 기간 제한을 10분으로 지정하고, 조직이 DelayDeactivation(TimeSpan.FromMinutes(5)) 호출을 수행하고 7분 후에 이 조직에 대한 또 다른 호출이 있는 경우 0시간부터 17분 후에 활성화가 수집됩니다(추가 호출이 수행되지 않은 경우).

  4. 활성화 컬렉션 설정은 기간 제한을 10분으로 지정하고, 조직이 DelayDeactivation(TimeSpan.FromMinutes(20)) 호출을 수행하고 7분 후에 이 조직에 대한 또 다른 호출이 있는 경우 0시간부터 20분 후에 활성화가 수집됩니다(추가 호출이 수행되지 않은 경우).

DelayDeactivation은 지정된 시간이 만료되기 전에 조직 활성화가 비활성화되지 않을 것이라고 100% 보장하지 않습니다. 특정 실패 사례는 조직의 '조기' 비활성화를 일으킬 수 있습니다. 즉, DelayDeactivation 메모리의 그레인 활성화를 영원히 또는 특정 사일로 '고정'하는 수단으로 사용할 수 없습니다. DelayDeactivation은 시간이 지남에 따라 조직이 비활성화되고 다시 활성화되는 총 비용을 줄이는 데 도움이 될 수 있는 최적화 메커니즘일 뿐입니다. 대부분의 경우 DelayDeactivation을 전혀 필요가 없습니다.

신속한 활성화 컬렉션

또한 조직 활성화는 DeactivateOnIdle() 메서드를 호출하여 다음 번에 유휴 상태가 될 때 비활성화하도록 런타임에 지시할 수도 있습니다.

C#
protected void DeactivateOnIdle()

조직 활성화는 현재 어떠한 메시지도 처리하지 않는 경우 유휴 상태로 간주됩니다. 조직이 메시지를 처리하는 동안 DeactivateOnIdle을 호출하면 현재 메시지 처리가 완료되는 즉시 비활성화됩니다. 조직에 대해 대기 중인 요청이 있는 경우 다음 활성화로 전달됩니다.

DeactivateOnIdle은(는) 구성 또는 DelayDeactivation에 지정된 활성화 컬렉션 설정보다 우선합니다.

참고

설정은 호출된 조직 활성화에만 적용되며 이 형식의 다른 조직 활성화에는 적용되지 않습니다.

구성

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

연결 유지

조직을 활성 상태로 유지하려면 Orleans.KeepAliveAttribute를 조직 구현에 적용합니다. KeepAlive 특성은 유휴 활성화 수집기에 의한 조직 수집을 방지하도록 Orleans 런타임에 지시합니다. 수집을 방지하는 것은 자주 사용되지 않지만 잠재적인 만들기 오버헤드를 피하기 위해 활성 상태를 유지하려는 조직에 유용합니다.

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;
   }
}

앞의 코드는 유휴 활성화 수집기가 PlayerGrain을(를) 수집하는 것을 방지합니다.