Lease di durata
Gli oggetti con marshalling per riferimento (MBR, Marshal-by-Reference) non risiedono permanentemente in memoria, sia che si tratti di oggetti Singleton attivati da server che di oggetti attivati da client. Al contrario, a meno che il tipo non esegua l'override di MarshalByRefObject.InitializeLifetimeService per controllare i criteri di durata, ogni oggetto MBR presenta una durata controllata da una combinazione di lease, un gestore di lease e alcuni sponsor. In questo caso, la durata un oggetto MBR corrisponde al tempo totale durante il quale l'oggetto rimane attivo in memoria. Un lease è il periodo di tempo in cui un determinato oggetto rimane in memoria prima che dal sistema .NET Framework Remoting vengano avviati il processo di eliminazione dell'oggetto stesso e il recupero della memoria. Il gestore di lease del dominio di applicazione server è l'oggetto che determina quando l'oggetto remoto è contrassegnato per la procedura di Garbage Collection. Uno sponsor è un oggetto che può richiedere un nuovo lease per un oggetto specifico mediante la propria registrazione con il gestore di lease.
Ogni volta che un oggetto MBR viene utilizzato in modalità remota all'esterno di un dominio di applicazione, viene creato un lease di durata per tale oggetto. In ogni dominio di applicazione è presente un gestore di lease responsabile dell'amministrazione dei lease nel proprio dominio, che esamina periodicamente tutti i lease per controllarne la scadenza. Se un lease è scaduto, il gestore esegue una ricerca nell'elenco di sponsor relativi a tale oggetto per verificare se è richiesto il rinnovo del lease. Se non viene rinnovato da alcuno sponsor, il lease viene rimosso dal relativo gestore, l'oggetto viene eliminato e la memoria viene recuperata mediante la procedura di Garbage Collection. La durata di un oggetto può quindi essere superiore al lease di durata, se viene rinnovata più volte da uno sponsor o chiamata continuamente da parte dei client.
Poiché la durata di un oggetto remoto è indipendente da quella dei relativi client, il lease per un oggetto semplice o poco complesso può essere molto lungo, nonché essere utilizzato da alcuni client e periodicamente rinnovato da un amministratore o da un client. In base a questo approccio i lease vengono utilizzati in modo efficiente poiché il traffico di rete necessario per la procedura distribuita di Garbage Collection è limitato. Gli oggetti remoti che utilizzano poche risorse, tuttavia, possono presentare un lease di breve durata che il client rinnova frequentemente. Al termine delle operazioni dei client sull'oggetto remoto, quest'ultimo viene rapidamente eliminato dal sistema .NET Framework Remoting. Questo criterio consente di ridurre un notevole traffico di rete mediante un utilizzo più efficiente delle risorse del server.
L'utilizzo dei lease per gestire la durata di oggetti remoti è un approccio alternativo al conteggio dei riferimenti, che può essere complesso e inefficiente su connessioni di rete non affidabili. Sebbene sia possibile configurare i lease per estendere la durata di un oggetto remoto per un periodo di tempo maggiore rispetto a quello necessario, il lease rappresenta una soluzione vantaggiosa per ridurre il traffico di rete relativo al conteggio dei riferimenti e all'invio di richieste ai client, se configurato in modo appropriato allo scenario in cui viene utilizzato.
Nella tabella seguente vengono descritte le cinque proprietà principali dei lease.
Proprietà | Descrizione |
---|---|
InitialLeaseTime |
Specifica il periodo di tempo iniziale durante il quale un oggetto rimane in memoria prima che il processo di eliminazione venga avviato dal gestore di lease. Nel file di configurazione tale voce è l'attributo leaseTime dell'elemento di configurazione <lifetime> Element. Il valore predefinito è 5 minuti. Con un valore pari a zero, il lease viene impostato su una durata infinita. |
CurrentLeaseTime |
Specifica il tempo disponibile prima della scadenza del lease. Quando un lease viene rinnovato, la proprietà CurrentLeaseTime è impostata sul valore massimo di CurrentLeaseTime o di RenewOnCallTime. |
RenewOnCallTime |
Specifica il periodo di tempo massimo su cui la proprietà CurrentLeaseTime è impostata dopo ogni chiamata remota all'oggetto. Il valore predefinito è 2 minuti. |
SponsorshipTimeout |
Specifica l'intervallo di attesa del gestore di lease per la risposta dello sponsor quando viene notificato che un lease è scaduto. Se non risponde nel tempo specificato, lo sponsor viene rimosso e ne viene chiamato un altro. Se non esistono altri sponsor, il lease scade e l'oggetto remoto viene eliminato da Garbage Collector. Se il valore è pari a 0 (TimeSpan.Zero), gli sponsor non verranno registrati dal lease. Il valore predefinito è 2 minuti. |
LeaseManagerPollTime |
Specifica l'intervallo di tempo di inattività del gestore di lease dopo il controllo dei lease scaduti. Il valore predefinito è 10 secondi. |
I lease sono creati quando un oggetto MBR viene attivato in un altro dominio di applicazione. In questo caso, quando la proprietà ILease.CurrentState è LeaseState.Initial, è possibile impostare le proprietà del lease. Una volta impostate, le proprietà non possono essere modificate direttamente. È possibile modificare solo la proprietà CurrentLeaseTime, o da una chiamata ILease.Renew oppure quando il gestore di lease chiama ISponsor.Renewal su uno sponsor che risponde con un oggetto TimeSpan. L'implementazione predefinita di MarshalByRefObject è quella di un lease di durata e, a meno che tale lease non venga modificato al momento della creazione, le proprietà rimangono invariate.
Modifica delle proprietà di lease
Le proprietà del lease di durata possono essere modificate nei modi seguenti:
Dichiarando le proprietà di lease di durata mediante l'override di MarshalByRefObject.InitializeLifetimeService nell'oggetto MBR, per impostare le proprietà sul lease o per restituire un riferimento null (Nothing in Visual Basic). Se viene utilizzata la seconda opzione, al sistema .NET Framework Remoting viene comunicato che le istanze di questo tipo dispongono di durata infinita.
Il programmatore o l'amministratore può anche specificare proprietà di durata per tutti gli oggetti di una determinata applicazione nell'elemento <lifetime> Element contenuto nel file di configurazione del computer o dell'applicazione. Per informazioni dettagliate, vedere Inizializzazione dei lease.
Una volta creato, un lease può essere rinnovato nei modi seguenti:
Un client chiama il metodo Renew direttamente.
Se la proprietà ILease.RenewOnCallTime viene impostata, ogni chiamata all'oggetto remoto rinnova il lease per il tempo specificato.
Il lease chiama il metodo Renewal per richiedere un rinnovo e lo sponsor risponde con un oggetto TimeSpan.
Per informazioni dettagliate, vedere Rinnovo dei lease.
Gestori di lease
La scadenza dei lease viene esaminata periodicamente dai gestori di lease. Alla scadenza, il lease viene informato e richiama gli sponsor per tentare di rinnovarsi.
Il gestore di lease gestisce inoltre un elenco di sponsor dai quali i lease attendono risposte. Se uno sponsor non risponde nell'intervallo specificato da SponsorshipTimeout, viene rimosso dall'elenco.
È possibile che un client remoto non autorizzato utilizzi il sistema di lease per condurre un attacco Denial of Service verso il server remoto. Il client non autorizzato potrebbe operare come sponsor di numerosi lease e potrebbe pertanto rifiutare di rispondere alle richieste di rinnovo del server. Un attacco di questo tipo è possibile solo se l'impostazione di TypeFilterLevel è full.
Quando viene concessa la scadenza di un lease, non sono consentiti ulteriori messaggi di lease o restituzioni di sponsor. Il riferimento al lease viene rimosso dall'elenco e il riferimento all'oggetto viene rimosso dalla tabella interna del sistema .NET Framework Remoting. Il lease e l'oggetto vengono quindi rimossi dalla procedura di Garbage Collection.
Vedere anche
Attività
Procedura: eseguire l'override dell'interfaccia InitializeLifetimeService
Procedura: rinnovare un lease
Riferimenti
Remoting Settings Schema
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService
Concetti
Esempio di codice di .NET Remoting: lease di durata
Inizializzazione dei lease
Rinnovo dei lease