Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il filtro di posizionamento granulare in Orleans consente agli sviluppatori di controllare ulteriormente la posizione dei grani all'interno di un cluster. Funziona in combinazione con le strategie di posizionamento, aggiungendo un ulteriore livello di filtro per determinare i silo candidati per l'attivazione granulare.
Questo filtro viene eseguito prima che i silo candidati vengano passati al metodo di posizionamento configurato, consentendo maggiore flessibilità e riutilizzo dei filtri.
Ad esempio, la strategia di posizionamento esistente PreferLocal è definita nel codice per ricorrere al posizionamento Random se il silo locale non è in grado di ospitare il tipo di grain. Tuttavia, usando i filtri, è possibile implementare un oggetto PreferLocalPlacementFilter per filtrare verso il basso in base al silo locale o a tutti i silo compatibili. È quindi possibile configurare qualsiasi strategia di posizionamento (Random, ResourceOptimizedPlacement, ActivationCounte così via) per quel tipo di granularità. In questo modo è possibile configurare qualsiasi set di filtri e qualsiasi strategia di posizionamento per un tipo di granularità.
Funzionamento del filtro di posizionamento
Il filtro di posizionamento funziona come passaggio aggiuntivo nel processo di sistemazione del grano. Dopo che tutti i silo compatibili per il tipo di granularità vengono identificati, tutti i filtri di posizionamento configurati per tale tipo di granularità, se presenti, vengono applicati per consentire un ulteriore perfezionamento della selezione eliminando i silo che non soddisfano i criteri definiti.
Ordinando
I filtri in esecuzione in ordini diversi possono comportare un comportamento diverso, in modo da richiedere l'ordinamento esplicito quando due o più filtri vengono definiti in un tipo. Questa operazione deve essere configurata con il order: parametro , poiché i metadati del tipo estratti in fase di esecuzione possono restituire gli attributi in un tipo in un ordine diverso da quello visualizzato nel codice sorgente. L'ordinamento deve avere valori univoci in modo che sia possibile determinare un ordinamento esplicito.
Filtri predefiniti
Orleans offre vari filtri predefiniti tra cui scegliere. Tuttavia, se non si riesce a trovarne uno adatto alle proprie esigenze, è sempre possibile implementare il proprio.
Filtri dei metadati silo
Questi filtri funzionano con i Metadati Silo per filtrare i silo candidati. I filtri confrontano i valori dei metadati tra il silo chiamante (il silo che effettua la richiesta di posizionamento) e i silo candidati. Solo i silo i cui valori di metadati corrispondono ai valori del silo chiamante per le chiavi specificate vengono considerati per il posizionamento. In questo modo è possibile un posizionamento consapevole della località, in cui i grain vengono collocati su silo nella stessa zona, rack o area di chi effettua la chiamata.
Prima di usare questi filtri, configurare i metadati nei tuoi silos.
// From environment variables (ORLEANS__METADATA__key=value)
builder.UseSiloMetadata();
// From IConfiguration
builder.UseSiloMetadata(configuration.GetSection("Orleans:Metadata"));
// From a dictionary
builder.UseSiloMetadata(new Dictionary<string, string>
{
["zone"] = "us-east-1a",
["tier"] = "premium",
["rack"] = "rack-42"
});
RequiredMatchSiloMetadata
Filtra i silo candidati solo a quelli che corrispondono a tutte le chiavi di metadati specificate con il silo chiamante. Se nessun silo compatibile abbina tutte le chiavi, viene restituito un set vuoto e il posizionamento del grano fallisce.
Usare il filtro di corrispondenza necessario quando è necessario posizionare un grain su un silo con metadati specifici.
// Grain will only be placed on silos where the "zone" metadata
// matches the calling silo's "zone" value
[RequiredMatchSiloMetadataPlacementFilter(new[] { "zone" })]
public class ZoneRestrictedGrain : Grain, IZoneRestrictedGrain
{
// This grain will only activate on silos in the same zone as the caller
}
// Multiple metadata keys can be specified
[RequiredMatchSiloMetadataPlacementFilter(new[] { "zone", "tier" })]
public class ZoneAndTierGrain : Grain, IZoneAndTierGrain
{
// Requires both zone AND tier to match the calling silo's values
}
PreferredMatchSiloMetadata
Questo filtro tenta di selezionare solo silo che corrispondono a tutte le chiavi di metadati configurate con i valori del silo chiamante. Tuttavia, invece di restituire un set vuoto se non sono presenti corrispondenze (come con il filtro richiesto), si ricorre alle corrispondenze parziali. La prima chiave di metadati configurata viene eliminata e si effettua una corrispondenza con le chiavi rimanenti. Ciò continua, eliminando le chiavi iniziali, finché non si raggiunge un numero sufficiente di corrispondenze. Se nessun silo compatibile corrisponde a una delle chiavi di metadati, vengono restituiti tutti i silo candidati.
Il minCandidates valore configura il numero di candidati che devono essere trovati per arrestare il processo di filtro. Questo valore impedisce a un singolo silo o a un numero ridotto di silo di essere rapidamente sovraccaricato se la corrispondenza fosse ridotta.
Se minCandidates non sono stati considerati, potrebbe esserci uno scenario in cui è presente un numero elevato di silo, ma solo un silo che corrisponde meglio alle chiavi di metadati configurate. Tutte le collocazioni si concentrerebbero su quel singolo silo, nonostante la disponibilità di molti altri silos che potrebbero ospitare le attivazioni. Lo scopo di minCandidates è consentire un equilibrio tra preferire solo le corrispondenze migliori ed evitare silos caldi. Spesso è consigliabile non concentrarsi sull'attivazione (o pianificare in generale) su una destinazione. Impostarlo su un valore maggiore di 1 per garantire una dimensione minima del set di candidati in modo che le decisioni future sul posizionamento possano evitare di concentrare le attivazioni su uno o pochi silo caldi. Si noti che questa configurazione è un valore minimo; potrebbero essere restituiti più candidati. Se si preferisce esclusivamente la corrispondenza più specifica, impostare minCandidates: 1 in modo da selezionare sempre la corrispondenza migliore. Ciò potrebbe essere preferibile in casi d'uso specifici in cui è presente una velocità effettiva di attivazione ridotta e in cui si verifica una notevole penalità quando si passa a una corrispondenza meno specifica da una corrispondenza più specifica. In generale, è consigliabile usare il valore predefinito 2 e non deve essere specificato nell'attributo .
Ad esempio, se si filtra su [PreferredMatchSiloMetadataPlacementFilter(["cloud.availability-zone", "cloud.region"], minCandidates: 2)] e è presente un solo silo corrispondente su cloud.availability-zone e cloud.region, questo scenario con minCandidates: 2 non corrisponde a entrambe le chiavi perché un solo silo corrisponde a entrambe le chiavi di metadati e che è inferiore alla dimensione minima configurata di 2. Verrà quindi eseguito il fallback alla corrispondenza solo in cloud.region. Se ci fossero 2 o più silos che corrispondono solo a cloud.region, quelli verrebbero ritornati. In caso contrario, tornerebbe a restituire tutti i candidati.
// Prefer silos with matching "zone" and "rack" values, but allow fallback
// minCandidates ensures at least 2 silos are considered even without matches
[PreferredMatchSiloMetadataPlacementFilter(new[] { "zone", "rack" }, minCandidates: 2)]
public class LocalityAwareGrain : Grain, ILocalityAwareGrain
{
// Prefers silos in the same zone/rack as the caller, but can activate elsewhere
}
Accedere ai metadati silo in fase di esecuzione
I grani possono accedere ai metadati per qualsiasi silo usando ISiloMetadataCache:
public class MyGrain : Grain, IMyGrain
{
private readonly ISiloMetadataCache _metadataCache;
public MyGrain(ISiloMetadataCache metadataCache)
{
_metadataCache = metadataCache;
}
public Task<string?> GetCurrentSiloZone()
{
var siloAddress = this.GetSiloAddress();
var metadata = _metadataCache.GetMetadata(siloAddress);
return Task.FromResult(metadata?.Metadata.GetValueOrDefault("zone"));
}
}
Implementare i filtri di posizionamento
Per implementare un filtro di posizionamento personalizzato in Orleans, seguire questa procedura:
Implementazione
- Creare l'attributo marcatore derivato da
PlacementFilterAttribute - Creare una strategia derivata da
PlacementFilterStrategyper gestire tutti i valori di configurazione - Creare Director derivato da
IPlacementFilterDirectorche contiene la logica di filtro- Definire la logica di filtro nel metodo
Filter, che accetta un elenco di silo candidati e restituisce un elenco filtrato.
- Definire la logica di filtro nel metodo
- Creare l'attributo marcatore derivato da
Registrare il filtro
- Chiamare
AddPlacementFilterper registrare la strategia e il direttore corrispondente
- Chiamare
Applicare il filtro
- Aggiungere l'attributo a una classe granulare per applicare il filtro
Di seguito è riportato un esempio di semplice filtro di posizionamento personalizzato. È simile all'uso [PreferLocalPlacement] senza filtro, ma questo ha il vantaggio di poter specificare qualsiasi metodo di posizionamento. Mentre PreferLocalPlacement esegue il fallback al posizionamento casuale se il silo locale non è in grado di ospitare un grain, questo esempio ha configurato ActivationCountBasedPlacement. Qualsiasi altra posizione potrebbe essere usata in modo analogo con questo filtro
[AttributeUsage(
AttributeTargets.Class, AllowMultiple = false)]
public class ExamplePreferLocalPlacementFilterAttribute(int order)
: PlacementFilterAttribute(
new ExamplePreferLocalPlacementFilterStrategy(order));
public class ExamplePreferLocalPlacementFilterStrategy(int order)
: PlacementFilterStrategy(order)
{
public ExamplePreferLocalPlacementFilterStrategy() : this(0) { }
}
internal class ExamplePreferLocalPlacementFilterDirector(
ILocalSiloDetails localSiloDetails)
: IPlacementFilterDirector
{
public IEnumerable<SiloAddress> Filter(PlacementFilterStrategy filterStrategy, PlacementTarget target, IEnumerable<SiloAddress> silos)
{
var siloList = silos.ToList();
var localSilo = siloList.FirstOrDefault(s => s == localSiloDetails.SiloAddress);
if (localSilo is not null)
{
return [localSilo];
}
return siloList;
}
}
Dopo aver implementato questo filtro, può essere registrato e applicato ai grani.
builder.Services.AddPlacementFilter<
ExamplePreferLocalPlacementFilterStrategy,
ExamplePreferLocalPlacementFilterDirector>();
[ExamplePreferLocalPlacementFilter]
[ActivationCountBasedPlacement]
public class MyGrain() : Grain, IMyGrain
{
// ...
}