Agregační identita

Zrna v Orleans každé z nich mají jeden jedinečný identifikátor definovaný uživatelem, který se skládá ze dvou částí:

  1. Název typu zrnitosti, který jednoznačně identifikuje třídu zrnitosti.
  2. Klíč odstupňovaného intervalu, který jednoznačně identifikuje logickou instanci této třídy agregace.

Typ zrnitosti a klíč jsou reprezentovány jako řetězce Orleans čitelné pro člověka a podle konvence se identita zrnitosti zapisuje s typem zrnitosti a klíčem odděleným znakem / . shoppingcart/bob65 Například představuje typ zrnitosti pojmenovaný shoppingcart klíčem bob65.

Přímé vytváření identit agregačního intervalu není běžné. Místo toho je častější vytvářet odkazy na agregace pomocí Orleans.IGrainFactory.

V následujících částech najdete podrobnější informace o názvech typů podrobností a klíčích odstupňovaného intervalu.

Názvy typů podrobností

Orleans vytvoří pro vás název typu zrnitosti na základě třídy implementace agregace odebráním přípony "Grain" z názvu třídy, pokud je k dispozici, a převodem výsledného řetězce na jeho malé písmeno reprezentace. Například pojmenovaná ShoppingCartGrain třída bude mít název shoppingcarttypu zrnitosti . Doporučuje se, aby názvy a klíče typů zrn se skládají pouze z tištěných znaků, jako jsou alfanumerické znaky (a-z,ZA- a90-) znaky a symboly, jako -jsou , _, @, . = Jiné znaky mohou nebo nemusí být podporovány a při tisku v protokolech nebo zobrazení jako identifikátory v jiných systémech, jako jsou databáze, často potřebují zvláštní zacházení.

Orleans.GrainTypeAttribute Případně lze atribut použít k přizpůsobení názvu typu zrnitosti třídy, ke které je připojen, jako v následujícím příkladu:

[GrainType("cart")]
public class ShoppingCartGrain : IShoppingCartGrain
{
    // Add your grain implementation here
}

V předchozím příkladu má třída ShoppingCartGrain grain název carttypu. Každý z nich může mít pouze jeden název typu zrnitosti.

U obecných zrn musí být obecná arity zahrnuta do názvu typu zrnka. Představte si například následující DictionaryGrain<K, V> třídu:

[GrainType("dict`2")]
public class DictionaryGrain<K, V> : IDictionaryGrain<K, V>
{
    // Add your grain implementation here
}

Třída zrnitosti má dva obecné parametry, takže backtick ` následovaný obecným arity, 2, je přidán na konec názvu typu zrnitého typu, dict pro vytvoření názvu dict`2typu zrnitého typu , jak je uvedeno v atributu třídy grain, [GrainType("dict`2")].

Klíče odstupňované

Pro usnadnění přístupu zpřístupňuje metody, Orleans které umožňují vytváření odstupňovaných klíčů z GuidInt64nebo , kromě .String Primární klíč je vymezený na typ zrnitosti. Proto se úplná identita agregace vytvoří z typu a jeho klíče.

Volající agregace rozhoduje, které schéma se má použít. Možnosti jsou následující:

Vzhledem k tomu, že podkladová data jsou stejná, dají se schémata použít zaměnitelně: všechny jsou kódovány jako řetězce.

Situace, které vyžadují instanci jednotonového agregace, mohou použít dobře známou pevnou hodnotu, například "default". Jedná se pouze o konvenci, ale dodržováním této konvence je jasné na místě volajícího, že se používá jednotonové zrno.

Použití globálně jedinečných identifikátorů (GUID) jako klíčů

System.Guid užitečné klíče, pokud jsou požadovaná náhodnost a globální jedinečnost, například při vytváření nové úlohy v systému zpracování úloh. Nemusíte koordinovat přidělování klíčů, což může v systému představovat kritický bod způsobující selhání, nebo zámek na straně systému u prostředku, který by mohl představovat kritický bod. Existuje velmi nízká pravděpodobnost kolísání identifikátorů GUID, takže jsou běžnou volbou při navrhování systému, který potřebuje přidělit náhodné identifikátory.

Odkazování na agregační interval podle identifikátoru GUID v kódu klienta:

var grain = grainFactory.GetGrain<IExample>(Guid.NewGuid());

Načtení primárního klíče z kódu odstupňovaného kódu:

public override Task OnActivateAsync()
{
    Guid primaryKey = this.GetPrimaryKey();
    return base.OnActivateAsync();
}

Použití celých čísel jako klíčů

K dispozici je také dlouhé celé číslo, které by dávalo smysl, pokud je agregační interval trvalý v relační databázi, kde jsou upřednostňovány číselné indexy před identifikátory GUID.

Odkazování na agregační interval dlouhé celé číslo v kódu klienta:

var grain = grainFactory.GetGrain<IExample>(1);

Načtení primárního klíče z kódu odstupňovaného kódu:

public override Task OnActivateAsync()
{
    long primaryKey = this.GetPrimaryKeyLong();
    return base.OnActivateAsync();
}

Použití řetězců jako klíčů

K dispozici je také řetězec.

Odkazování na agregační interval podle řetězce v klientském kódu:

var grain = grainFactory.GetGrain<IExample>("myGrainKey");

Načtení primárního klíče z kódu odstupňovaného kódu:

public override Task OnActivateAsync()
{
    string primaryKey = this.GetPrimaryKeyString();
    return base.OnActivateAsync();
}

Použití složených klíčů

Pokud máte systém, který se nevejde dobře s identifikátory GUID nebo longy, můžete zvolit složený primární klíč, který umožňuje použít kombinaci identifikátoru GUID nebo dlouhého řetězce a odkazovat na agregaci.

Rozhraní můžete zdědit takto IGrainWithGuidCompoundKeyIGrainWithIntegerCompoundKey :

public interface IExampleGrain : Orleans.IGrainWithIntegerCompoundKey
{
    Task Hello();
}

V klientském IGrainFactory.GetGrain kódu se přidá druhý argument do metody v objektu pro vytváření zrna:

var grain = grainFactory.GetGrain<IExample>(0, "a string!", null);

Pro přístup ke složeného klíči v agregačním intervalu můžeme volat přetížení GrainExtensions.GetPrimaryKey metody (the 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;
    }
}

Proč zrna používají logické identifikátory

V objektově orientovaných prostředích, jako je .NET, je obtížné odlišit identitu objektu od odkazu na něj. Při vytvoření objektu pomocí klíčového new slova představuje odkaz, který získáte zpět, všechny aspekty jeho identity s výjimkou těch, které mapují objekt na nějakou externí entitu, kterou představuje. Orleans je určen pro distribuované systémy. V distribuovaných systémech nemohou odkazy na objekty představovat identitu instance, protože odkazy na objekty jsou omezené na adresní prostor jednoho procesu. Orleans používá logické identifikátory, aby se zabránilo tomuto omezení. Agregační identifikátory používají logické identifikátory, aby odkazy na agregační intervaly zůstaly platné v průběhu životnosti procesu a jsou přenosné z jednoho procesu do druhého, což umožňuje jejich uložení a pozdější načtení nebo odeslání v síti do jiného procesu v aplikaci, přičemž stále odkazuje na stejnou entitu: agregační interval, pro který byl odkaz vytvořen.