Freigeben über


Silometadaten

Silo-Metadaten sind eine Funktion in Orleans, mit der Entwickler benutzerdefinierte Metadaten Silos innerhalb eines Clusters zuweisen können. Diese Metadaten bieten einen flexiblen Mechanismus zum Kommentieren von Silos mit beschreibenden Informationen oder spezifischen Funktionen.

Diese Funktion ist besonders nützlich in Szenarien, in denen unterschiedliche Silos unterschiedliche Rollen, Hardwarekonfigurationen oder andere eindeutige Merkmale aufweisen. So können Silos beispielsweise basierend auf ihrer Region, der Berechnungsleistung oder speziellen Zuständigkeiten innerhalb des Systems kategorisiert werden.

Silometadaten legen die Grundlagen für zusätzliche Orleans Features wie z. B. die Kornplatzierungsfilterung dar.

Wichtige Begriffe

Silometadaten stellen eine Möglichkeit zum Anfügen von Schlüsselwertpaaren an Silos innerhalb eines Orleans Clusters dar. Mit diesem Feature können Entwickler silospezifische Merkmale konfigurieren, die von Orleans Komponenten genutzt werden können.

Silometadaten werden als unveränderliches Wörterbuch von Schlüsselwertpaaren dargestellt:

  • Schlüssel: Zeichenfolgen, die die Metadaten identifizieren (z. B "cloud.region". , "compute.reservation.type").
  • Werte: Zeichenfolgen, die die entsprechende Eigenschaft beschreiben (z. B "us-east1". , "spot").

Konfiguration

Silo-Metadaten werden in Orleans mit zwei Methoden konfiguriert, entweder durch die .NET Konfiguration oder direkt im Code.

Konfigurieren von Silometadaten mit Konfiguration

Silometadaten können in der Konfiguration der App definiert werden, z. B. appsettings.json, Umgebungsvariablen oder eine andere verfügbare Konfigurationsquelle.

Beispiel: appsettings.json Konfiguration

{
  "Orleans": {
    "Metadata": {
      "cloud.region": "us-east1",
      "compute.reservation.type": "spot",
      "role": "worker"
    }
  }
}

Die vorangehende Konfiguration definiert Metadaten für ein Silo und kategorisiert sie mit:

  • cloud.region: "us-east1"
  • compute.reservation.type: "spot"
  • role: "worker"

Verwenden Sie zum Anwenden dieser Konfiguration das folgende Setup in Ihrem Silohost-Generator:

Host.CreateApplicationBuilder(args).UseOrleans(siloBuilder =>
{
    // Configuration section Orleans:Metadata is used by default
    siloBuilder.UseSiloMetadata();
});

Alternativ kann eine explizite IConfiguration oder IConfigurationSection übergeben werden, um zu steuern, aus welcher Stelle in der Konfiguration die Metadaten abgerufen werden.

Konfigurieren von Silometadaten im Code

Für Szenarien, die eine programmgesteuerte Metadatenkonfiguration erfordern, können Entwickler Metadaten direkt im Silo-Host-Generator hinzufügen.

Beispiel: Direkte Codekonfiguration

var builder = Host.CreateApplicationBuilder(args);
builder.UseOrleans(siloBuilder =>
{
    siloBuilder.UseSiloMetadata(new Dictionary<string, string>
    {
        ["cloud.region"] = "us-east1",
        ["compute.reservation.type"] = "spot",
        ["role"] = "worker"
    });
});

Im vorherigen Beispiel wird dasselbe Ergebnis wie die JSON-Konfiguration erzielt, es können jedoch Metadatenwerte während der Siloinitialisierung dynamisch berechnet oder geladen werden.

Zusammenführen von Konfigurationen

Wenn sowohl .NET-Konfiguration als auch direkte Codekonfiguration verwendet werden, überschreibt die direkte Konfiguration alle in Konflikt stehenden Metadatenwerte aus der .NET-Konfiguration. Auf diese Weise können Entwickler Standardwerte mit Konfigurationsdateien festlegen und bestimmte Metadaten während der Laufzeit dynamisch anpassen.

Usage

Entwickler können Metadaten über die ISiloMetadataCache Schnittstelle abrufen. Diese Schnittstelle ermöglicht das Abfragen von Metadaten für einzelne Silos im gesamten Cluster. Metadaten werden immer aus einem lokalen Metadatencache zurückgegeben, der im Hintergrund aktualisiert wird, wenn sich die Clustermitgliedschaft ändert.

Zugreifen auf Metadaten für ein bestimmtes Silo

Das ISiloMetadataCache bietet eine Methode zum Abrufen der Metadaten für ein bestimmtes Silo anhand des eindeutigen Bezeichners SiloAddress. Die ISoloMetadataCache Implementierung wird in der UseSiloMetadata Methode registriert und kann als Abhängigkeit eingefügt werden.

Beispiel: Zugreifen auf Metadaten für ein Silo

var siloMetadata = siloMetadataCache.GetSiloMetadata(siloAddress);

if (siloMetadata.Metadata.TryGetValue("role", out var role))
{
    Console.WriteLine($"Silo Role for {siloAddress}: {role}");
    // Execute role-specific logic
}

Im vorherigen Beispiel:

  • GetSiloMetadata(siloAddress) ruft die Metadaten für das angegebene Silo ab.
  • Metadatenschlüssel "role" können z. B. verwendet werden, um die Anwendungslogik zu beeinflussen.

Interne Implementierung

Intern überwacht SiloMetadataCache Änderungen in der Clustermitgliedschaft auf MembershipTableManager und hält einen lokalen Cache der Metadaten synchron mit den Mitgliedschaftsänderungen. Metadaten können für ein bestimmtes Silo unveränderlich sein, sodass sie einmal abgerufen und zwischengespeichert werden, bis dieser Silo den Cluster verlässt. Zwischengespeicherte Metadaten für Cluster, die Dead sind oder die Mitgliedschaftstabelle verlassen haben, werden aus dem lokalen Cache gelöscht.

Jedes Silo hostet eine ISystemTarget, die die Metadaten dieses Silos bereitstellt. Aufrufe an SiloMetadataCache : ISiloMetadataCache geben ein Ergebnis aus dem lokalen Cache zurück.