Taneli kimlik

Her birindeki Orleans tanecikler, iki bölümden oluşan tek, benzersiz, kullanıcı tanımlı bir tanımlayıcıya sahiptir:

  1. Tanecik sınıfını benzersiz olarak tanımlayan tanecik türü adı.
  2. Bu tanecik sınıfının mantıksal örneğini benzersiz olarak tanımlayan tanecik anahtarı.

Hem tanecik türü hem de anahtar, içinde insan tarafından okunabilen dizeler Orleans olarak temsil edilir ve kural gereği, taneli kimlik, bir karakterle ayrılmış / tanecik türü ve anahtarla yazılır. Örneğin, shoppingcart/bob65 adlı tanecik türünü shoppingcart bir anahtarla bob65temsil eder.

Doğrudan tahıl kimlikleri oluşturmak yaygın değildir. Bunun yerine, kullanarak Orleans.IGrainFactorytaneli başvurular oluşturmak daha yaygındır.

Aşağıdaki bölümlerde, tanecik türü adları ve tanecik anahtarları daha ayrıntılı olarak açıklanmıştır.

Tanecik türü adları

Orleans , varsa sınıf adından "Grain" sonekini kaldırarak ve sonuçta elde edilen dizeyi küçük harf gösterimine dönüştürerek, grain uygulama sınıfınızı temel alarak sizin için bir taneli tür adı oluşturur. Örneğin, adlı ShoppingCartGrain bir sınıfa tanecik türü adı shoppingcartverilir. Gren türü adlarının ve anahtarlarının yalnızca alfasayısal (az-, A-Zve ) gibi yazdırılabilir karakterlerden ve90- , , _, =@gibi simgelerden -oluşması önerilir. Diğer karakterler desteklenebilir veya desteklenmeyebilir ve genellikle günlüklerde yazdırıldığında veya veritabanları gibi diğer sistemlerde tanımlayıcı olarak göründüğünde özel bir işleme ihtiyaç duyar.

Alternatif olarak, Orleans.GrainTypeAttribute özniteliği aşağıdaki örnekte olduğu gibi eklendiği tanecik sınıfı için tanecik türü adını özelleştirmek için kullanılabilir:

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

Yukarıdaki örnekte, tanecik sınıfının ShoppingCartGrain tanecik türü adı vardır cart. Her dilimin yalnızca bir tanecik türü adı olabilir.

Genel tanecikler için genel arity, tanecik türü adına eklenmelidir. Örneğin, aşağıdaki DictionaryGrain<K, V> sınıfı göz önünde bulundurun:

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

Tanecik sınıfı iki genel parametreye sahiptir; bu nedenle, tanecik sınıfındaki özniteliğinde belirtildiği gibi, tanecik türü adını oluşturmak için, tanecik türü adının dictdict`2sonuna bir ters ` köşe ve ardından genel arity( [GrainType("dict`2")]2) eklenir.

Tanecik anahtarları

Kolaylık sağlamak için, Orleans bir veya Int64bir Guid 'den bir tanecik anahtarlarının oluşturulmasına Stringolanak tanıyan yöntemleri kullanıma sunar. Birincil anahtarın kapsamı tahıl türüne göre belirlenmiştir. Bu nedenle, bir tanenin tam kimliği, tahılın türünden ve anahtarından oluşturulur.

Hangi düzenin kullanılacağına tahılın çağıranı karar verir. Seçenekler şunlardır:

Temel alınan veriler aynı olduğundan, şemalar birbirinin yerine kullanılabilir: hepsi dize olarak kodlanır.

Tek taneli örnek gerektiren durumlar gibi "default"iyi bilinen, sabit bir değer kullanabilir. Bu yalnızca bir kuraldır, ancak bu kurala bağlı kalınarak arayan sitede tek bir tanenin kullanıldığı netleşir.

Anahtar olarak genel benzersiz tanımlayıcıları (GUID) kullanma

System.Guid rastgelelik ve genel benzersizlik istendiğinde, örneğin bir iş işleme sisteminde yeni bir iş oluştururken yararlı anahtarlar oluşturabilirsiniz. Sistemde tek bir hata noktasına veya bir performans sorunu oluşturabilecek bir kaynakta sistem tarafı kilidine neden olabilecek anahtarları ayırmayı koordine etmeniz gerekmez. GUID'lerin çarpışma olasılığı çok düşüktür, bu nedenle rastgele tanımlayıcıları ayırması gereken bir sistemin mimarisini oluştururken yaygın bir seçenektir.

İstemci kodunda GUID'ye göre bir taneye başvurma:

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

Birincil anahtarı taneli koddan alma:

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

Tamsayıları anahtar olarak kullanma

Uzun bir tamsayı da kullanılabilir; bu da, dilim guid'ler yerine sayısal dizinlerin tercih edildiği ilişkisel bir veritabanında kalıcı hale getirildiğinde anlamlı olur.

İstemci kodunda bir taneye uzun bir tamsayıyla başvurma:

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

Birincil anahtarı taneli koddan alma:

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

Dizeleri anahtar olarak kullanma

Bir dize de kullanılabilir.

İstemci kodunda Dizeye göre bir taneye başvurma:

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

Birincil anahtarı taneli koddan alma:

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

Bileşik anahtarları kullanma

GUID'lere veya uzunluklara uygun olmayan bir sisteminiz varsa, guid veya uzun ile bir dize birleşimini kullanarak bir taneye başvurmanızı sağlayan bileşik bir birincil anahtar seçebilirsiniz.

Arabiriminizi veya IGrainWithIntegerCompoundKey arabiriminizi IGrainWithGuidCompoundKey şu şekilde devralabilirsiniz:

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

İstemci kodunda bu, tahıl fabrikasındaki IGrainFactory.GetGrain yöntemine ikinci bir bağımsız değişken ekler:

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

Tahıldaki bileşik anahtara erişmek için yönteminde GrainExtensions.GetPrimaryKey bir aşırı yükleme çağırabiliriz (: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;
    }
}

Tanecikler neden mantıksal tanımlayıcıları kullanır?

.NET gibi nesne odaklı ortamlarda, bir nesnenin kimliğini buna yapılan başvurudan ayırt etmek zordur. Bir nesne anahtar sözcüğü kullanılarak new oluşturulduğunda, geri aldığın başvuru, nesneyi temsil ettiği bir dış varlıkla eşleyenler dışında kimliğinin tüm yönlerini temsil eder. Orleans dağıtılmış sistemler için tasarlanmıştır. Dağıtılmış sistemlerde, nesne başvuruları tek bir işlemin adres alanıyla sınırlı olduğundan nesne başvuruları örnek kimliğini temsil edemez. Orleans bu sınırlamayı önlemek için mantıksal tanımlayıcıları kullanır. Tanecik başvuruların işlem ömrü boyunca geçerli kalmasını ve bir işlemden diğerine taşınabilir olmasını sağlamak için mantıksal tanımlayıcılar kullanır ve bu sayede bunların depolanmasına ve daha sonra alınmasına veya bir ağ üzerinden uygulamadaki başka bir işleme gönderilmesine olanak tanırken, yine de aynı varlığa başvurur: başvurunun oluşturulduğu tahıl.