Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Körner Orleans haben jeweils einen einzelnen, eindeutigen, benutzerdefinierten Bezeichner, der aus zwei Teilen besteht:
- Der Korntypname , der die Kornklasse eindeutig identifiziert.
- Der Kornschlüssel, der eindeutig eine logische Instanz dieser Kornklasse identifiziert.
Orleans stellt sowohl den Korntyp als auch den Schlüssel als lesbare Zeichenfolgen dar. Gemäß der Konvention schreiben Sie die Grain-Identität mit dem Korntyp und dem Schlüssel, getrennt durch ein /
Zeichen. Der Korntyp shoppingcart/bob65
wird zum Beispiel als shoppingcart
mit dem Schlüssel bob65
bezeichnet.
Das direkte Erstellen von Kornidentitäten ist ungewöhnlich. Stattdessen ist das Erstellen von Grain-ReferenzenOrleans.IGrainFactory häufiger.
In den folgenden Abschnitten werden korntypnamen und Kornschlüssel ausführlicher erläutert.
Korntypnamen
Orleans erstellt einen Korntypnamen basierend auf der Kornimplementierungsklasse. Es entfernt das Suffix "Grain" aus dem Klassennamen, falls vorhanden, und konvertiert die resultierende Zeichenfolge in die kleingeschriebene Darstellung. Beispielsweise erhält eine Klasse mit dem Namen ShoppingCartGrain
den Korntypnamen shoppingcart
. Es wird empfohlen, dass Korntypnamen und Schlüssel nur aus druckbaren Zeichen bestehen, z. B. alphanumerische Zeichen (a
-z
, A
-Z
und 0
-9
) und Symbole wie -
, _
, @
und =
. Andere Zeichen werden möglicherweise nicht unterstützt und erfordern häufig eine spezielle Behandlung, wenn sie in Protokollen gedruckt oder in anderen Systemen als Bezeichner angezeigt werden, z. B. Datenbanken.
Alternativ können Sie das Orleans.GrainTypeAttribute Attribut verwenden, um den Korntypnamen für die Kornklasse anzupassen, der sie zugeordnet ist, wie im folgenden Beispiel gezeigt:
[GrainType("cart")]
public class ShoppingCartGrain : IShoppingCartGrain
{
// Add your grain implementation here
}
Im vorherigen Beispiel weist die Kornklasse ShoppingCartGrain
den Namen des Korntyps cart
auf. Jedes Getreide kann nur einen Korntypnamen haben.
Fügen Sie für generische Getreide den generischen Arität in den Korntypnamen ein. Betrachten Sie beispielsweise die folgende DictionaryGrain<K, V>
Klasse:
[GrainType("dict`2")]
public class DictionaryGrain<K, V> : IDictionaryGrain<K, V>
{
// Add your grain implementation here
}
Die Kornklasse verfügt über zwei generische Parameter, sodass ein Backtick `
, gefolgt von der generischen Arität, 2, am Ende des Korntypnamens dict
hinzugefügt wird, um den Korntypnamen dict`2
zu erstellen. Dies wird im Attribut für die Kornklasse [GrainType("dict
2")]' angegeben.
Korntasten
Zur Bequemlichkeit bietet Orleans Methoden an, die den Aufbau von Grain-Schlüsseln aus einem Guid oder Int64 sowie zusätzlich aus einem String ermöglichen. Der Primärschlüssel ist auf den Korntyp abgestimmt. Daher bildet sich die vollständige Identität eines Korns aus seinem Typ und seinem Schlüssel.
Der Aufrufer des Grain entscheidet, welches Schema zu verwenden ist. Die Optionen sind:
Da die zugrunde liegenden Daten identisch sind, können die Schemas austauschbar verwendet werden: Sie sind alle als Zeichenfolgen codiert.
Situationen, in denen eine Singleton-Körnerinstanz erforderlich ist, können einen bekannten, festen Wert wie "default"
verwenden. Dies ist lediglich eine Konvention, aber die Einhaltung dieser Konvention stellt an der Aufruferstelle klar, dass ein Singletonkorn verwendet wird.
Verwenden von GUIDs (Globally Unique Identifiers) als Schlüssel
System.Guid Erstellen Sie nützliche Schlüssel, wenn Zufälligkeit und globale Einzigartigkeit gewünscht werden, z. B. beim Erstellen eines neuen Auftrags in einem Auftragsverarbeitungssystem. Die Koordination der Schlüsselzuweisung ist nicht erforderlich, was zu einem einzigen Fehlerpunkt oder einer systemseitigen Sperre für eine Ressource führen könnte, wodurch möglicherweise ein Engpass entsteht. Die Wahrscheinlichkeit von GUID-Kollisionen ist sehr gering und macht sie zu einer gemeinsamen Wahl, wenn Architektursysteme zufällige Bezeichnerzuordnung benötigen.
Verweisen auf einen Grain mittels GUID im Client-Code.
var grain = grainFactory.GetGrain<IExample>(Guid.NewGuid());
Abrufen des Primärschlüssels aus dem Grain-Code:
public override Task OnActivateAsync()
{
Guid primaryKey = this.GetPrimaryKey();
return base.OnActivateAsync();
}
Verwenden von ganzzahligen Zahlen als Schlüssel
Eine lange ganze Zahl ist ebenfalls verfügbar. Dies ist sinnvoll, wenn das Korn in einer relationalen Datenbank beibehalten wird, wobei numerische Indizes häufig über GUIDs bevorzugt werden.
Verweisen auf ein Korn durch eine lange ganze Zahl im Clientcode:
var grain = grainFactory.GetGrain<IExample>(1);
Abrufen des Primärschlüssels aus dem Grain-Code:
public override Task OnActivateAsync()
{
long primaryKey = this.GetPrimaryKeyLong();
return base.OnActivateAsync();
}
Verwenden von Zeichenfolgen als Schlüssel
Auch ein Zeichenfolgenschlüssel ist verfügbar.
Referenzierung eines Grains durch String im Client-Code:
var grain = grainFactory.GetGrain<IExample>("myGrainKey");
Abrufen des Primärschlüssels aus dem Grain-Code:
public override Task OnActivateAsync()
{
string primaryKey = this.GetPrimaryKeyString();
return base.OnActivateAsync();
}
Verwenden von Verbundschlüsseln
Wenn das System weder gut zu GUIDs noch zu Longs passt, sollten Sie sich für einen zusammengesetzten Primärschlüssel entscheiden. Dies ermöglicht die Verwendung einer Kombination aus einer GUID oder einem Long-Integer und einer Zeichenfolge, um auf ein Grain zu verweisen.
Erben Sie die Schnittstelle von IGrainWithGuidCompoundKey oder IGrainWithIntegerCompoundKey wie folgt:
public interface IExampleGrain : Orleans.IGrainWithIntegerCompoundKey
{
Task Hello();
}
Im Clientcode wird der Methode in der IGrainFactory.GetGrain Kornfabrik ein zweites Argument hinzugefügt:
var grain = grainFactory.GetGrain<IExample>(0, "a string!", null);
Um auf den Verbundschlüssel im Korn zuzugreifen, rufen Sie eine Überladung der GrainExtensions.GetPrimaryKey Methode auf (z. B. GrainExtensions.GetPrimaryKeyLong):
public class ExampleGrain : Orleans.Grain, IExampleGrain
{
public Task Hello()
{
long primaryKey = this.GetPrimaryKeyLong(out string keyExtension);
Console.WriteLine($"Hello from {keyExtension}");
return Task.CompletedTask;
}
}
Warum Getreide logische Bezeichner verwenden
In objektorientierten Umgebungen wie .NET ist die Identität eines Objekts schwer von einem Verweis darauf zu unterscheiden. Wenn ein Objekt mithilfe des new
Schlüsselworts erstellt wird, stellt der zurückgegebene Verweis alle Aspekte seiner Identität dar, mit Ausnahme derJenigen, die das Objekt einer externen Entität zuordnen, die es darstellt.
Orleans ist für verteilte Systeme konzipiert. In verteilten Systemen können Objektverweise keine Instanzidentität darstellen, da sie auf den Adressraum eines einzelnen Prozesses beschränkt sind.
Orleans verwendet logische Bezeichner, um diese Einschränkung zu vermeiden. Getreide verwendet logische Bezeichner, sodass Kornverweise während der gesamten Prozesslebensdauer gültig bleiben und von einem Prozess in einen anderen portierbar sind. Auf diese Weise können sie gespeichert und später abgerufen oder über ein Netzwerk an einen anderen Prozess innerhalb der Anwendung gesendet werden, wobei sie sich immer noch auf dieselbe Entität beziehen: das Korn, für das der Verweis erstellt wurde.