Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Die Filterung der Körnerplatzierung in Orleans ermöglicht Entwicklern zusätzliche Kontrolle über die Platzierung von Körnern innerhalb eines Clusters. Es funktioniert in Verbindung mit Platzierungsstrategien und fügt eine zusätzliche Filterschicht hinzu, um Kandidatensilos für die Kornaktivierung zu bestimmen.
Diese Filterung erfolgt, bevor Kandidatensilos an die konfigurierte Platzierungsmethode weitergegeben werden, sodass mehr Flexibilität und Wiederverwendung der Filter möglich ist.
Beispielsweise ist die vorhandene PreferLocal Platzierungsstrategie hartcodiert, um auf die Platzierung zurückzugreifen Random , wenn das lokale Silo den Korntyp nicht hosten kann. Aber durch die Verwendung von Filtern könnte eine PreferLocalPlacementFilter implementiert werden, um entweder auf das lokale Silo oder auf alle kompatiblen Silos zu filtern. Anschließend kann jede Platzierungsstrategie (Random, ResourceOptimizedPlacement, ActivationCountusw.) für diesen Getreidetyp konfiguriert werden. Auf diese Weise können alle Filter und jede Platzierungsstrategie für einen Korntyp konfiguriert werden.
Funktionsweise der Platzierungsfilterung
Die Platzierungsfilterung funktioniert als zusätzlicher Schritt im Kornplatzierungsprozess. Nachdem alle kompatiblen Silos für den Korntyp identifiziert wurden, werden alle Platzierungsfilter angewendet, die für diese Kornart konfiguriert sind, falls vorhanden, um eine weitere Einschränkung der Auswahl zu ermöglichen, indem Silos eliminiert werden, die nicht den definierten Kriterien entsprechen.
Bestellung
Filter, die in unterschiedlichen Reihenfolgen ausgeführt werden, können zu einem anderen Verhalten führen, sodass eine explizite Sortierung erforderlich ist, wenn zwei oder mehr Filter für einen Typ definiert sind. Dies muss mit dem order: Parameter konfiguriert werden, da die zur Laufzeit abgerufenen Typmetadaten die Attribute eines Typs in einer anderen Reihenfolge als die Darstellung im Quellcode zurückgeben können. Die Sortierung muss eindeutige Werte aufweisen, damit eine explizite Sortierung bestimmt werden kann.
Integrierte Filter
Orleans stellt verschiedene integrierte Filter bereit, aus der Sie auswählen können. Wenn Sie jedoch eines nicht finden können, das Ihren Anforderungen entspricht, können Sie immer Eigene implementieren.
Silometadatenfilter
Diese Filter funktionieren mit Silometadaten , um Kandidatensilos zu filtern. Die Filter vergleichen Metadatenwerte zwischen dem aufrufenden Silo (dem Silo, das die Platzierungsanforderung macht) und Kandidatensilos. Nur Silos, deren Metadatenwerte den Werten des aufrufenden Silos für die angegebenen Schlüssel entsprechen, werden für die Platzierung berücksichtigt. Dies ermöglicht die ortsbezogene Platzierung, bei der Getreide in Silos in derselben Zone, einem Gestell oder einer Region wie der Anrufer platziert werden.
Bevor Sie diese Filter verwenden, konfigurieren Sie Metadaten in Ihren 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
Filtert Kandidaten-Silos nur auf diejenigen, die mit allen angegebenen Metadatenschlüsseln des aufrufenden Silos übereinstimmen. Wenn keine kompatiblen Silos mit allen Schlüsseln übereinstimmen, wird ein leerer Satz zurückgegeben, und die Platzierung schlägt für das Korn fehl.
Verwenden Sie die erforderliche Abgleichsfilterung, wenn ein Getreide in ein Silo mit bestimmten Metadaten platziert werden muss:
// 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
Dieser Filter versucht, nur Silos auszuwählen, die mit allen konfigurierten Metadatenschlüsseln mit den Werten des aufrufenden Silos übereinstimmen. Anstatt jedoch einen leeren Satz zurückzugeben, wenn keine Übereinstimmungen vorhanden sind (wie bei der erforderlichen Filterung), fällt dies auf partielle Übereinstimmungen zurück. Der erste konfigurierte Metadatenschlüssel wird gelöscht, und es wird eine Übereinstimmung mit den verbleibenden Schlüsseln vorgenommen. Dies wird fortgesetzt, wobei die Anfangsschlüssel gelöscht werden, bis eine ausreichende Anzahl von Übereinstimmungen vorgenommen wird. Wenn keine kompatiblen Silos mit einem der Metadatenschlüssel übereinstimmen, werden alle Kandidatensilos zurückgegeben.
Der minCandidates Wert konfiguriert, wie viele Kandidaten gefunden werden müssen, um den Filtervorgang zu beenden. Dieser Wert verhindert, dass einzelne Silos oder eine kleine Anzahl von Silos schnell überlastet werden, wenn das Szenario so klein ist.
Wenn minCandidates nicht berücksichtigt wird, könnte ein Szenario entstehen, in dem es eine große Anzahl von Silos gibt, aber nur ein Silo am besten mit den konfigurierten Metadatenschlüsseln übereinstimmt. Alle Platzierungen würden sich auf dieses Silo konzentrieren, obwohl viele weitere verfügbar sind, die Aktivierungen hosten könnten. Der Zweck minCandidates besteht darin, ein Gleichgewicht zwischen der Bevorzugtheit der besten Übereinstimmungen und der Vermeidung von heißen Silos zu ermöglichen. Es ist oft wünschenswert, die Aktivierung nicht auf ein einzelnes Ziel zu konzentrieren oder im Allgemeinen Planung durchzuführen. Legen Sie ihn auf einen Wert fest, der größer als 1 ist, um sicherzustellen, dass eine mindestgröße von Kandidaten festgelegt wird, damit zukünftige Platzierungsentscheidungen die Konzentration von Aktivierungen auf einem oder mehreren heißen Silos vermeiden können. Beachten Sie, dass diese Konfiguration ein Minimalwert ist; weitere Kandidaten könnten zurückgegeben werden. Wenn Sie die meisten spezifischen Übereinstimmungen bevorzugen, legen Sie fest minCandidates: 1 , dass immer die beste Übereinstimmung bevorzugt wird. Dies kann in bestimmten Anwendungsfällen bevorzugt werden, in denen ein geringer Aktivierungsdurchsatz vorliegt und ein Wechsel von einer spezifischeren zu einer weniger spezifischen Übereinstimmung erhebliche Konsequenzen nach sich zieht. Im Allgemeinen sollte der Standardwert 2 verwendet werden (und muss nicht im Attribut angegeben werden).
Wenn beispielsweise nach [PreferredMatchSiloMetadataPlacementFilter(["cloud.availability-zone", "cloud.region"], minCandidates: 2)] gefiltert wird und es sowohl auf cloud.availability-zone als auch auf cloud.region nur einen passenden Silo gibt, würde dieses Szenario bei minCandidates: 2 nicht mit beiden Schlüsseln übereinstimmen, da nur ein Silo beide Metadatenschlüssel erfüllt und dies unter der mindestens konfigurierten Größe von 2 liegt. Es würde dann auf cloud.region zurückfallen und nur noch auf Übereinstimmungen reagieren. Wenn es 2 oder mehr Silos gäbe, die nur cloud.region entsprechen, würden diese zurückgegeben werden. Andernfalls würde es auf die Rückgabe aller Kandidaten zurückfallen.
// 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
}
Zugriff auf Silometadaten zur Laufzeit
Getreide kann auf Metadaten für jedes Silo zugreifen, indem 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"));
}
}
Platzierungsfilter implementieren
Führen Sie die folgenden Schritte aus, um einen benutzerdefinierten Platzierungsfilter zu Orleansimplementieren:
Implementierung
- Marker-Attribut erstellen, das von
PlacementFilterAttributeabgeleitet ist - Erstellen Sie eine Strategie, die aus
PlacementFilterStrategyabgeleitet wird, um Konfigurationswerte zu verwalten. - Erstellen Sie einen Director, abgeleitet von
IPlacementFilterDirector, der die Filterlogik enthält.- Definieren Sie die Filterlogik in der
FilterMethode, die eine Liste von Kandidatensilos akzeptiert und eine gefilterte Liste zurückgibt.
- Definieren Sie die Filterlogik in der
- Marker-Attribut erstellen, das von
Registrieren des Filters
- Rufen Sie
AddPlacementFilteran, um die Strategie und den zugehörigen Direktor zu registrieren.
- Rufen Sie
Anwenden des Filters
- Hinzufügen des Attributs zu einer Granularitätsklasse, um den Filter anzuwenden
Hier ist ein Beispiel für einen einfachen benutzerdefinierten Platzierungsfilter. Es ist ähnlich wie bei der Verwendung [PreferLocalPlacement] ohne Filter, aber dies hat den Vorteil, jede Platzierungsmethode anzugeben. Wenn das lokale Silo kein Grain hosten kann, fällt dieses Beispiel auf eine zufällige Platzierung zurück, wobei PreferLocalPlacement konfiguriert ist. Jede andere Platzierung kann auch mit diesem Filter verwendet werden.
[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;
}
}
Nach der Implementierung dieses Filters kann er registriert und auf Getreide angewendet werden.
builder.Services.AddPlacementFilter<
ExamplePreferLocalPlacementFilterStrategy,
ExamplePreferLocalPlacementFilterDirector>();
[ExamplePreferLocalPlacementFilter]
[ActivationCountBasedPlacement]
public class MyGrain() : Grain, IMyGrain
{
// ...
}