Szemcsés identitás
Az egyes szemcsék Orleans egyetlen, egyedi, felhasználó által meghatározott azonosítóval rendelkeznek, amely két részből áll:
- A gabonatípus neve, amely egyedileg azonosítja a gabonaosztályt.
- A gabonakulcs, amely egyedileg azonosítja az adott szemcsés osztály logikai példányát.
A szemcsetípus és a kulcs egyaránt emberi olvasásra alkalmas sztringként jelenik meg, és konvenció szerint a szemcsés Orleans identitás a szemcsetípussal és a karakterrel /
elválasztott kulccsal van megírva. Például shoppingcart/bob65
egy kulccsal bob65
elnevezett shoppingcart
gabonatípust jelöl.
Nem gyakori a szemcsés identitások közvetlen létrehozása. Ehelyett gyakoribb a szemcsés hivatkozások létrehozása a használatávalOrleans.IGrainFactory.
Az alábbi szakaszok részletesebben ismertetik a gabonatípusneveket és a gabonakulcsokat.
Szemcsés típusnevek
Orleans A szemcsés implementálási osztály alapján létrehoz egy szemcsetípusnevet. Ehhez távolítsa el a "Grain" utótagot az osztálynévből, ha van ilyen, és konvertálja az eredményül kapott sztringet a kisbetűs megjelenítésre. Egy elnevezett ShoppingCartGrain
osztály például a szemcsés típus nevét shoppingcart
kapja. Ajánlott, hogy a szemcsés típusnevek és kulcsok csak nyomtatható karakterekből, például alfa-numerikus (a
-z
-Z
A
és ) karakterekből és9
-0
szimbólumokból, például -
, _
, . @
=
Előfordulhat, hogy más karakterek nem támogatottak, és gyakran speciális kezelést igényelnek, ha naplókba nyomtatják, vagy más rendszerekben, például adatbázisokban azonosítóként jelennek meg.
Másik lehetőségként az Orleans.GrainTypeAttribute attribútum segítségével testre szabhatja annak a szemcsés osztálynak a gabonatípusnevét, amelyhez hozzá van csatolva, ahogyan az alábbi példában is látható:
[GrainType("cart")]
public class ShoppingCartGrain : IShoppingCartGrain
{
// Add your grain implementation here
}
Az előző példában a szemcsés osztály ShoppingCartGrain
neve .cart
Minden gabona csak egy szemtípusnévvel rendelkezhet.
Általános szemcsék esetén az általános aritásnak szerepelnie kell a szemcsetípus nevében. Vegyük például a következő DictionaryGrain<K, V>
osztályt:
[GrainType("dict`2")]
public class DictionaryGrain<K, V> : IDictionaryGrain<K, V>
{
// Add your grain implementation here
}
A szemcsés osztály két általános paraméterrel rendelkezik, ezért a rendszer hozzáad egy háttérszínt`
, majd a 2. általános aritást a szemcsetípus nevének végéhez, dict
hogy létrehozza a szemcsetípus nevét dict`2
a szemcsés osztály attribútumában megadott módon. [GrainType("dict`2")]
Szemcsés kulcsok
A kényelem érdekében olyan módszereket tesz elérhetővé, Orleans amelyek lehetővé teszik a szemcsekulcsok Guid építését egy vagy egy Int64, valamint egy String. Az elsődleges kulcs hatóköre a szemcsés típusra van korlátozva. Ezért a szem teljes identitása a gabona típusából és kulcsából jön létre.
A gabona hívója dönti el, hogy melyik sémát kell használni. A következő lehetőségek közül választhat:
Mivel a mögöttes adatok azonosak, a sémák felcserélhetők: mindegyik sztringként van kódolva.
Az egyszeri szemcsés példányt igénylő helyzetek jól ismert, rögzített értéket használhatnak, például "default"
. Ez csupán egy konvenció, de ennek a konvenciónak a betartásával egyértelművé válik a hívóhelyen, hogy egy egytonnás gabona van használatban.
Globálisan egyedi azonosítók (GUID-k) használata kulcsként
System.Guid a véletlenszerűség és a globális egyediség céljából hasznos kulcsokat hozhat létre, például új feladat létrehozásakor egy feladatfeldolgozó rendszerben. Nem kell koordinálnia a kulcsok lefoglalását, ami egyetlen meghibásodási pontot eredményezhet a rendszerben, vagy egy olyan erőforrás rendszeroldali zárolását, amely szűk keresztmetszetet okozhat. Nagyon alacsony az esélye annak, hogy a grafikus GUID-k ütköznek, ezért gyakori választás egy olyan rendszer létrehozásakor, amelynek véletlenszerű azonosítókat kell lefoglalnia.
Szemcsék hivatkozása GUID alapján az ügyfélkódban:
var grain = grainFactory.GetGrain<IExample>(Guid.NewGuid());
Az elsődleges kulcs beolvasása a gabonakódból:
public override Task OnActivateAsync()
{
Guid primaryKey = this.GetPrimaryKey();
return base.OnActivateAsync();
}
Egész számok használata kulcsként
Egy hosszú egész szám is rendelkezésre áll, ami akkor lenne értelme, ha a szemcse egy relációs adatbázisban maradna, ahol a numerikus indexek előnyben részesülnek a GRAFIKUS GUID-k helyett.
Hosszú egész számra hivatkozik az ügyfélkódban:
var grain = grainFactory.GetGrain<IExample>(1);
Az elsődleges kulcs beolvasása a gabonakódból:
public override Task OnActivateAsync()
{
long primaryKey = this.GetPrimaryKeyLong();
return base.OnActivateAsync();
}
Sztringek használata kulcsként
Egy sztring is elérhető.
Hivatkozás sztring szerint az ügyfélkódban:
var grain = grainFactory.GetGrain<IExample>("myGrainKey");
Az elsődleges kulcs beolvasása a gabonakódból:
public override Task OnActivateAsync()
{
string primaryKey = this.GetPrimaryKeyString();
return base.OnActivateAsync();
}
Összetett kulcsok használata
Ha olyan rendszere van, amely nem illeszkedik sem a GRAFIKUS GUID-khoz, sem a hosszúakhoz, választhat összetett elsődleges kulcsot, amely lehetővé teszi a GUID vagy a long és a sztring kombinációját a szemcsékre való hivatkozáshoz.
A felületet IGrainWithGuidCompoundKey IGrainWithIntegerCompoundKey az alábbi módon örökölheti:
public interface IExampleGrain : Orleans.IGrainWithIntegerCompoundKey
{
Task Hello();
}
Az ügyfélkódban ez hozzáad egy második argumentumot a IGrainFactory.GetGrain grain factory metódusához:
var grain = grainFactory.GetGrain<IExample>(0, "a string!", null);
A gabona összetett kulcsának eléréséhez túlterhelést hívhatunk a GrainExtensions.GetPrimaryKey metóduson (a GrainExtensions.GetPrimaryKeyLong):
public class ExampleGrain : Orleans.Grain, IExampleGrain
{
public Task Hello()
{
long primaryKey = this.GetPrimaryKeyLong(out string keyExtension);
Console.WriteLine($"Hello from {keyExtension}");
Task.CompletedTask;
}
}
Miért használnak logikai azonosítókat a szemcsék?
Az objektumorientált környezetekben, például a .NET-ben az objektum identitását nehéz megkülönböztetni a hivatkozástól. Amikor egy objektumot a new
kulcsszó használatával hoz létre, a visszakapott hivatkozás az identitás minden aspektusát képviseli, kivéve azokat, amelyek az objektumot valamilyen külső entitáshoz rendelik, amelyet képvisel. Orleans elosztott rendszerekhez készült. Elosztott rendszerekben az objektumhivatkozások nem jelölhetik a példány identitását, mivel az objektumhivatkozások egyetlen folyamat címterére korlátozódnak. Orleans a korlátozás elkerülése érdekében logikai azonosítókat használ. A szemcsék logikai azonosítókat használnak annak érdekében, hogy a szemcsés hivatkozások a folyamat teljes élettartama alatt érvényesek maradjanak, és az egyik folyamatból a másikba hordozhatóak legyenek, lehetővé téve számukra a tárolást és a későbbi lekérést, illetve az alkalmazás egy másik folyamatának való elküldését, miközben továbbra is ugyanarra az entitásra hivatkoznak: arra a szemre, amelyhez a hivatkozást létrehozták.