수명 임대
MBR(Marshal-By-Reference) 개체 즉, 참조로 마샬링되는 개체는 서버 활성 Singleton 개체인지 클라이언트 활성 개체인지 여부에 상관없이 메모리에 존재할 수 있는 시간이 제한됩니다. 대신, 해당 형식에서 MarshalByRefObject.InitializeLifetimeService를 재정의하여 자체 수명 정책을 제어하지 않는 경우 각 MBR은 임대, 임대 관리자 및 여러 스폰서의 조합에 의해 제어되는 수명을 가집니다. 이 경우 MBR 개체의 수명은 해당 개체가 메모리에서 활성 상태로 존재하는 전체 시간입니다. 임대 시간은 .NET Framework Remoting 시스템에서 특정 개체를 삭제하고 메모리를 회수하는 프로세스를 시작할 때까지 해당 개체가 메모리에 활성 상태로 있게 되는 시간입니다. 서버 응용 프로그램 도메인의 임대 관리자는 원격 개체가 가비지 수집되도록 표시되는 시기를 결정하는 개체입니다. 스폰서는 임대 관리자에 특정 개체를 등록함으로써 해당 개체에 대한 새로운 임대를 요청할 수 있는 개체입니다.
MBR 개체가 응용 프로그램 도메인 외부에서 원격화될 때마다 해당 개체에 대한 수명 임대가 만들어집니다. 각 응용 프로그램 도메인에는 해당 도메인 내의 임대를 관리하는 임대 관리자가 있습니다. 임대 관리자는 모든 임대에 대해 임대 기간 만료 여부를 정기적으로 확인합니다. 임대가 만료되면 임대 관리자는 해당 개체의 스폰서 목록에 요청을 전송하여 임대 갱신을 커밋하는 스폰서가 있는지 여부를 쿼리합니다. 임대를 갱신하는 스폰서가 없으면 임대 관리자는 해당 임대를 제거하며 해당 개체는 삭제되고 메모리는 가비지 수집에 의해 회수됩니다. 이렇게 하면 한 스폰서에 의해 또는 여러 클라이언트에서 지속적으로 호출함으로써 두 번 이상 갱신된 경우 개체의 수명이 임대 수명보다 훨씬 더 길어질 수 있습니다.
원격 개체의 수명은 클라이언트의 수명과 상관이 없으므로 간단하거나 크기가 작은 개체의 임대는 지속 시간이 매우 길고 여러 클라이언트에 의해 사용될 수 있으며 관리자 또는 클라이언트에 의해 정기적으로 갱신될 수 있습니다. 이 경우 분산 가비지 수집에 필요한 네트워크 트래픽이 매우 적기 때문에 임대가 효율적으로 사용됩니다. 그러나 리소스를 거의 사용하지 않는 원격 개체의 경우에는 클라이언트에서 짧은 기간으로 자주 갱신하는 짧은 수명의 임대를 사용할 수 있습니다. 모든 클라이언트에서 원격 개체의 사용을 완료하면 .NET Framework Remoting 시스템에서는 즉시 해당 개체를 삭제합니다. 이렇게 하면 서버 리소스를 보다 효율적으로 사용할 수 있는 대신 네트워크 트래픽이 증가합니다.
참조 횟수를 사용하는 방식은 불안정한 네트워크 연결에서 복잡하고 비효율적일 수 있기 때문에 임대를 이용한 원격 개체의 수명 관리 방식이 대신 사용됩니다. 임대의 경우 잘못 구성하면 원격 개체의 수명이 필요 이상으로 연장되는 경우도 발생하지만, 참조 횟수 및 클라이언트로의 요청 전송에 소요되는 네트워크 트래픽이 감소하기 때문에 특정 시나리오에 대해 올바르게 구성된 경우에는 임대를 사용하는 것이 효과적입니다.
다음 표에서는 임대의 주요 속성에 대해 설명합니다.
속성 | 설명 |
---|---|
InitialLeaseTime |
임대 관리자가 개체의 삭제 프로세스를 시작할 때까지 해당 개체가 메모리에 남아 있는 초기 시간을 지정합니다. 구성 파일에서는 <lifetime> 요소 구성 요소의 leaseTime 특성에 해당합니다. 기본값은 5분입니다. 임대 기간이 0이면 해당 임대는 무기한 수명으로 설정됩니다. |
CurrentLeaseTime |
임대가 만료될 때까지 남은 시간을 지정합니다. 임대가 갱신되면 CurrentLeaseTime은 CurrentLeaseTime 또는 RenewOnCallTime의 최대값으로 설정됩니다. |
RenewOnCallTime |
개체에 대한 각 원격 호출 다음에 CurrentLeaseTime이 설정되는 최대 시간을 지정합니다. 기본값은 2분입니다. |
SponsorshipTimeout |
임대 시간이 만료되었다는 사실을 스폰서에 알린 후, 임대 관리자가 응답을 받을 때까지 기다리는 시간을 지정합니다. 스폰서가 지정된 시간 안에 응답하지 않으면 해당 스폰서는 제거되고 다른 스폰서가 호출됩니다. 스폰서가 더 이상 없으면 해당 임대는 만료되고 가비지 수집기에서는 해당 원격 개체를 삭제합니다. 값이 0(TimeSpan.Zero)이면 해당 임대에서는 스폰서를 등록하지 않습니다. 기본값은 2분입니다. |
LeaseManagerPollTime |
만료된 임대 항목을 확인한 후 임대 관리자가 대기하는 시간을 지정합니다. 기본값은 10초입니다. |
임대는 MBR 개체가 다른 응용 프로그램 도메인에서 활성화될 때 만들어집니다. 이 때 ILease.CurrentState 속성이 LeaseState.Initial이면 임대 속성을 설정할 수 있습니다. 한 번 설정된 임대 속성은 직접 변경할 수 없습니다. ILease.Renew를 호출하거나 임대 관리자가 스폰서에 대해 ISponsor.Renewal을 호출하고 스폰서가 TimeSpan 개체로 응답하는 경우 CurrentLeaseTime만 변경할 수 있습니다. MarshalByRefObject에는 기본 구현된 수명 임대가 있으며 이 임대를 만들 때 수정하지 않은 경우 임대 속성은 항상 동일합니다.
임대 속성 수정
수명 임대 속성은 다음과 같은 방법으로 수정할 수 있습니다.
MBR 개체에서 MarshalByRefObject.InitializeLifetimeService를 재정의하는 방법으로 사용자 지정 수명 임대 속성을 선언하여 임대에 대한 속성을 직접 설정하거나 null 참조(Visual Basic에서는 Nothing)를 반환합니다. 두 번째 옵션을 사용하면 .NET Framework Remoting 시스템에서는 해당 형식의 인스턴스가 무한한 수명을 갖는 것으로 인식합니다.
사용자 또는 관리자가 특정 응용 프로그램 또는 시스템 구성 파일의 <lifetime> 요소 요소에서 해당 응용 프로그램의 모든 개체에 대한 수명 속성을 지정할 수도 있습니다. 자세한 내용은 임대 초기화를 참조하십시오.
이미 만들어진 임대는 다음과 같은 방법으로 갱신할 수 있습니다.
클라이언트에서 Renew 메서드를 직접 호출합니다.
ILease.RenewOnCallTime 속성이 설정된 경우 해당 원격 개체를 호출할 때마다 지정된 시간으로 임대가 갱신됩니다.
자세한 내용은 임대 갱신을 참조하십시오.
임대 관리자
임대 관리자는 임대 기간 만료 여부를 정기적으로 확인해야 합니다. 임대 기간이 만료되면 해당 임대는 그러한 알림을 받고 스폰서를 호출하여 자체 갱신을 시도합니다.
임대 관리자는 임대가 응답을 기다리는 스폰서의 목록도 관리합니다. 스폰서가 SponsorshipTimeout 시간 범위로 지정된 시간 안에 응답하지 않으면 해당 스폰서는 스폰서 목록에서 제거됩니다.
악의적인 원격 클라이언트가 임대 시스템을 악용하여 원격 서버에 서비스 거부(DOS) 공격을 가할 수도 있습니다. 악의적인 클라이언트는 여러 임대를 스폰서한 다음 서버의 갱신 쿼리에 응답하는 것을 거부합니다. 이 DOS 공격은 TypeFilterLevel이 full로 설정된 경우에만 가능합니다.
임대 만료가 허용되면 임대 메시지나 스폰서 반환은 더 이상 사용할 수 없습니다. 해당 임대의 참조는 임대 목록에서 제거되고 .NET Framework Remoting 시스템에서는 해당 개체 참조를 내부 테이블에서 제거합니다. 그런 다음에는 가비지 수집 시스템에서 해당 임대 및 개체를 제거합니다.
참고 항목
작업
방법: InitializeLifetimeService 인터페이스 재정의
방법: 임대 갱신
참조
원격 설정 스키마
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService