Аренда времени существования

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  Windows Communication Foundation (WCF).

Маршалируемые по ссылке объекты (MBR) не хранятся в памяти вечно независимо от того, являются они активируемыми сервером объектами Singleton или активируемыми клиентом объектами. Вместо этого, если только тип не переопределяет значение MarshalByRefObject.InitializeLifetimeService для управления своей политикой времени существования, все MBR-объекты имеют время существования, которое зависит от объектов аренды, диспетчера аренды и нескольких спонсоров. В этом случае время существования MBR-объекта равняется общему времени, в течение которого объект остается активным в памяти. Аренда — это интервал времени, в течение которого конкретный объект остается активным в памяти, прежде чем система удаленного взаимодействия .NET не начнет процесс удаления этого объекта и очистки памяти. Диспетчер аренды домена серверного приложения — это объект, который определяет, когда удаленный объект будет помечен для сборки мусора. Спонсор — это объект, который может запрашивать для конкретного объекта новую аренду путем регистрации себя в диспетчере аренды.

Как только за пределами домена приложения создается удаленный MBR-объект, для этого объекта создается аренда времени существования. Каждый домен приложения содержит диспетчер аренды, который отвечает за управление арендой в своем домене. Диспетчер аренды периодически проверяет все сроки действия аренды. Если срок действия аренды истек, диспетчер аренды отправляет запрос по списку спонсоров данного объекта и узнает, требует ли какой-либо из спонсоров обновления аренды. Если ни один из спонсоров не обновляет аренду, диспетчер аренды удаляет аренду, объект удаляется, а занимаемая им память очищается при сборке мусора. Время существования объекта может быть намного дольше, чем продолжительность аренды времени существования, если аренда была более одного раза обновлена спонсором или если объект постоянно вызывается клиентами.

Существование удаленного объекта не зависит от существования его клиентов. Время аренды простого объекта может быть очень продолжительным, и таким объектом может пользоваться несколько клиентов. Аренда объекта может периодически обновляться клиентом, увеличивая продолжительность его существования. Такой подход обеспечивает очень эффективное управление арендой, поскольку распределенная сборка мусора практически не создает нагрузки на сеть. Однако удаленные объекты, использующие дефицитные ресурсы, могут получать аренду на короткое время существования, в результате чего клиент чаще будет обновлять ее на небольшой промежуток времени. Если все клиенты завершили работу с удаленным объектом, система удаленного взаимодействия .NET Framework сразу помечает объект для сборки мусора. Такая политика позволяет избежать увеличения нагрузки на сеть и боле эффективно использовать ресурсы сервера.

Управление временем существования удаленных объектов с помощью аренды является альтернативой процедуре учета ссылок, которая может быть сложной и неэффективной при использовании ненадежных сетевых подключений. Хотя параметры аренды можно настроить таким образом, что существование удаленного объекта продлится дольше, чем требуется, снижение нагрузки на сеть, связанной с учетом ссылок и отправкой запросов клиентам, делает применение аренды привлекательным решением, если ее правильно настроить в соответствии с особенностями конкретного сценария.

В следующей таблице представлено описание основных свойств аренды.

Свойство Описание

InitialLeaseTime

Задает начальный промежуток времени, в течение которого объект остается в памяти, пока диспетчер аренды не начнет процесс удаления объекта. В файле конфигурации это атрибут leaseTime элемента конфигурации Элемент <lifetime>. Значение по умолчанию — 5 минут. Значение 0 указывает на бесконечное время существования.

CurrentLeaseTime

Задает промежуток времени, оставшегося до истечения времени аренды. При обновлении аренды его свойство CurrentLeaseTime устанавливается равным максимальному из значений CurrentLeaseTime и RenewOnCallTime.

RenewOnCallTime

Задает максимальный промежуток времени, присваиваемый свойству CurrentLeaseTime после каждого удаленного вызова объекта. Значение по умолчанию — 2 минуты.

SponsorshipTimeout

Задает время, в течение которого диспетчер аренды ожидает ответа от спонсора, который получил уведомление об истечении времени аренды. Если спонсор не отвечает в течение заданного времени, этот спонсор удаляется из списка и вызывается другой спонсор. Если в списке больше не осталось спонсоров, время аренды истекает, а удаленный объект помечается для сборки мусора. Если значение свойства равно 0 (TimeSpan.Zero), для этой аренды спонсоры не регистрируются. Значение по умолчанию — 2 минуты.

LeaseManagerPollTime

Задает время бездействия диспетчера аренды после проверки на окончание времени аренды. Значение по умолчанию — 10 секунд.

Аренда создается при активации MBR-объекта в другом домене приложения. В этот момент, когда свойство ILease.CurrentState имеет значение LeaseState.Initial, можно задать свойства аренды. После задания эти свойства нельзя изменить напрямую. Может быть изменено только свойство CurrentLeaseTime — либо с помощью вызова метода ILease.Renew, либо когда диспетчер аренды вызывает метод ISponsor.Renewal спонсора, а спонсор передает в ответ объект TimeSpan. У класса MarshalByRefObject имеется реализация по умолчанию для аренды времени существования, и если аренда не была изменена при создании, ее свойства остаются неизменными.

Изменение свойств аренды

Свойства аренды времени существования можно изменить следующими способами:

  • объявление пользовательских свойств аренды времени существования путем переопределения свойства MarshalByRefObject.InitializeLifetimeService в MBR-объекте, чтобы задать собственные свойства аренды или вернуть пустую (NULL) ссылку (Nothing в Visual Basic). Последний вариант указывает системе удаленного взаимодействия .NET Framework на то, что время существования экземпляров этого типа бесконечно;

  • разработчик или администратор могут задать свойства времени существования всех объектов в конкретном приложении в элементе Элемент <lifetime> в файле конфигурации приложения или компьютера. Дополнительные сведения см. в разделе Инициализация аренды.

После создания аренду можно обновить следующими способами:

  • клиент вызывает метод Renew напрямую;

  • если свойство ILease.RenewOnCallTime задано, каждый вызов удаленного объекта продлевает аренду на заданный интервал времени;

  • аренда вызывает методы Renewal, чтобы запросить обновления, а спонсор отправляет в ответ значение TimeSpan.

Дополнительные сведения см. в разделе Обновление аренды.

Диспетчеры аренды

Диспетчеры аренды должны периодически проверять сроки действия аренды. После истечения времени аренды соответствующий объект аренды получает уведомление и предпринимает попытку обновления с помощью спонсоров.

Кроме того, диспетчер аренды управляет списком спонсоров, от которых ожидают ответов объекты аренды. Если спонсор не отвечает в течение интервала, определяемого свойством SponsorshipTimeout, он удаляется из списка спонсоров.

Обратите внимание, что злонамеренный удаленный клиент может вызвать атаку типа "отказ в обслуживании" на сервер удаленного взаимодействия со стороны системы аренды. Злонамеренный клиент может стать спонсором для большого числа объектов аренда, после чего перестать отвечать на запросы сервера на обновление аренды. Атака типа "отказ в обслуживании" возможна только в том случае, если параметр TypeFilterLevel имеет значение Full.

Если срок действия аренды истек, новые сообщения об аренде и ответы спонсоров больше не принимаются. Ссылка на аренду удаляется из списка объектов аренды, а система удаленного взаимодействия .NET Framework удаляет ссылку на объект из своей внутренней таблицы. После этого система сборки мусора удаляет аренду и объект.

См. также

Задачи

Как переопределить интерфейс InitializeLifetimeService
Как обновить аренду

Справочник

Схема параметров удаленного взаимодействия
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

Основные понятия

Пример удаленного взаимодействия. Время существования
Инициализация аренды
Обновление аренды

Другие ресурсы

Активация и время существования объектов