Megosztás a következőn keresztül:


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:

  1. A gabonatípus neve, amely egyedileg azonosítja a gabonaosztályt.
  2. 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 bob65elnevezett 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 shoppingcartkapja. Ajánlott, hogy a szemcsés típusnevek és kulcsok csak nyomtatható karakterekből, például alfa-numerikus (a-z-ZAé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`2a 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.