Baux de durée de vie
Les objets marshalés par référence (MBR, Marshal-By-Reference) ne résident pas indéfiniment en mémoire comme objets Singleton activés par le serveur ou comme objets activés par le client. Au contraire, sauf si le type substitue MarshalByRefObject.InitializeLifetimeService pour contrôler ses propres stratégies de durée de vie, chaque objet marshalé par référence possède une durée de vie qui est contrôlée par une combinaison de baux, un gestionnaire de bail et un certain nombre de sponsors. La durée de vie d'un objet marshalé par référence correspond, dans ce cas, à la durée totale durant laquelle l'objet reste actif en mémoire. Un bail correspond à la période de temps durant laquelle un objet est actif en mémoire avant que .NET Framework Remoting ne commence le processus de suppression de cet objet et de récupération de la mémoire. Le gestionnaire de bail du domaine d'application serveur correspond à l'objet qui détermine le moment où l'objet distant est marqué pour un garbage collection. Un sponsor est un objet qui peut effectuer une demande de nouveau bail pour un objet particulier en l'inscrivant à l'aide du gestionnaire de bail.
À chaque fois qu'un objet marshalé par référence est appelé à distance en dehors d'un domaine d'application, un bail de durée de vie est créé pour cet objet. Chaque domaine d'application contient un gestionnaire de bail chargé d'administrer les baux dans son domaine. Le gestionnaire de bail examine périodiquement tous les baux pour les durées de bail expirées. À l'expiration d'un bail, le gestionnaire de bail envoie une demande à sa liste de sponsors pour cet objet et interroge la liste pour savoir si l'un des sponsors souhaite renouveler le bail. Si aucun sponsor ne renouvelle le bail, le gestionnaire de bail supprime le bail, l'objet est supprimé et sa mémoire est récupérée par un garbage collection. La durée de vie d'un objet peut dans ce cas être beaucoup plus longue que son bail de durée de vie, si celui-ci est renouvelé plusieurs fois par un sponsor ou fait l'objet d'appels constants des clients.
Comme la vie de l'objet distant est indépendante de celle de ses clients, le bail d'un objet simple ou léger peut être très long, être utilisé par plusieurs clients et être renouvelé périodiquement par un administrateur ou un client. Cette approche utilise les baux de manière efficace car elle minimise le trafic réseau nécessaire pour les opérations garbage collection distribuées. Toutefois, des objets distants qui font appel à peu de ressources peuvent avoir un bail court, qu'un client renouvelle fréquemment avec un intervalle de temps court. Lorsque tous les clients en ont terminé avec l'objet distant, le système .NET Framework Remoting supprime l'objet rapidement. Cette stratégie remplace l'augmentation du trafic réseau par une meilleure utilisation des ressources du serveur.
L'utilisation de baux pour gérer la durée de vie des objets distants est une approche différente au décompte de références qui peut s'avérer complexe et inefficace sur des connexions réseau peu fiables. Bien que les baux puissent être configurés pour augmenter plus que nécessaire la durée de vie d'un objet distant, la réduction du trafic réseau dédiée au décompte de références et à l'envoi de demandes aux clients fait du bail une solution attrayante lorsque celui-ci est correctement configuré pour un scénario particulier.
Le tableau suivant décrit les principales propriétés de baux.
Propriété | Description |
---|---|
InitialLeaseTime |
Spécifie l'intervalle de temps initial durant lequel un objet réside en mémoire avant que le gestionnaire de bail n'entame le processus de suppression de l'objet. Dans le fichier de configuration, il s'agit de l'attribut leaseTime de l'élément de configuration <lifetime> Element. La valeur par défaut est 5 minutes. Un temps de bail de zéro assigne au bail une durée de vie infinie. |
CurrentLeaseTime |
Spécifie l'intervalle de temps restant avant l'expiration du bail. Lors du renouvellement d'un bail, sa propriété CurrentLeaseTime est définie au maximum de CurrentLeaseTime ou RenewOnCallTime. |
RenewOnCallTime |
Spécifie l'intervalle de temps maximal de CurrentLeaseTime après chaque appel distant à l'objet. La valeur par défaut est 2 minutes. |
SponsorshipTimeout |
Spécifie le temps pendant lequel le gestionnaire de bail attend une réponse du sponsor une fois que l'expiration du bail a été notifiée. Si le sponsor ne répond pas dans le temps spécifié, il est supprimé et un autre sponsor est appelé. S'il ne reste plus de sponsors, le bail expire et le garbage collector (également appelé ramasse-miettes) supprime l'objet distant. Si la valeur est égale à 0 (TimeSpan.Zero), le bail n'inscrit pas de sponsor. La valeur par défaut est 2 minutes. |
LeaseManagerPollTime |
Spécifie la durée pendant laquelle le gestionnaire de bail est mis en veille après avoir vérifié les baux expirés. La valeur par défaut est 10 secondes. |
Les baux sont créés lorsqu'un objet marshalé par référence est activé dans un autre domaine d'application. À ce stade, lorsque la propriété ILease.CurrentState est LeaseState.Initial, les propriétés de bail peuvent être définies. Une fois définies, celles-ci ne peuvent pas être changées directement. Seule la propriété CurrentLeaseTime peut être changée, soit à l'aide d'un appel à ILease.Renew, soit lorsque le gestionnaire de bail appelle ISponsor.Renewal sur un sponsor et que le sponsor répond à l'aide d'un objet TimeSpan. MarshalByRefObject possède l'implémentation par défaut d'un bail de durée de vie et, sauf modification de ce bail lors de sa création, les propriétés de bail sont toujours les mêmes.
Modification des propriétés de bail
Les propriétés de bail de durée de vie peuvent être modifiées des façons suivantes :
Vous pouvez déclarer des propriétés personnalisées de bail de durée de vie en substituant MarshalByRefObject.InitializeLifetimeService dans votre objet marshalé par référence, soit pour définir les propriétés du bail vous-même, soit pour retourner une référence null (Nothing en Visual Basic). La dernière option indique au système .NET Framework Remoting que des instances de ce type sont conçues pour avoir une durée de vie infinie.
Vous ou un administrateur pouvez également spécifier des propriétés de durée de vie pour tous les objets d'une application particulière dans l'élément <lifetime> Element du fichier de configuration de l'application ou de l'ordinateur. Pour plus d'informations, voir Initialisation des baux.
Une fois créé, un bail peut être renouvelé des façons suivantes :
Un client appelle Renew directement.
Si la propriété ILease.RenewOnCallTime est définie, chaque appel à l'objet distant renouvelle le bail pour la durée spécifiée.
Le bail appelle une méthode Renewal pour demander un renouvellement de bail et le sponsor répond à l'aide de TimeSpan.
Pour plus d'informations, voir Renouvellement des baux.
Gestionnaires de bail
Les gestionnaires de bail doivent examiner périodiquement les baux pour vérifier leur expiration. Lors de l'expiration d'un bail, le bail est informé et cherche à se renouveler lui-même en appelant ses sponsors.
Le gestionnaire de bail maintient également une liste de sponsors dont les baux attendent des réponses. Si un sponsor ne répond pas dans l'intervalle spécifié par l'intervalle de temps SponsorshipTimeout, il est supprimé de la liste des sponsors.
Notez qu'il est possible qu'un client distant malveillant utilise de manière abusive le système de bail pour effectuer une attaque par déni de service contre un serveur d'accès distant. Le client malveillant devient le sponsor de nombreux baux, puis refuse de répondre aux demandes de renouvellement du serveur. Cette attaque par déni de service n'est possible que si TypeFilterLevel est défini à full.
Lorsqu'un sponsor a l'autorisation d'expirer, aucun message de bail supplémentaire ou aucun retour de sponsor n'est autorisé. La référence du bail est supprimée de la liste de baux et le système .NET Framework Remoting supprime la référence d'objet de son tableau interne. Le système garbage collection supprime ensuite le bail et l'objet.
Voir aussi
Tâches
Comment : Substituer l'interface InitializeLifetimeService
Comment : Renouveler un bail
Référence
Remoting Settings Schema
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService
Concepts
Exemple d'accès distant : Durées de vie
Initialisation des baux
Renouvellement des baux