Bagikan melalui


Identitas grain

Biji-bijian di Orleans masing-masing memiliki pengidentifikasi tunggal, unik, yang ditentukan pengguna yang terdiri dari dua bagian:

  1. Nama jenis biji-bijian, yang secara unik mengidentifikasi kelas biji-bijian.
  2. Kunci biji-bijian, yang secara unik mengidentifikasi instans logis dari kelas biji-bijian itu.

Jenis biji-bijian dan kunci keduanya direpresentasikan sebagai string yang dapat dibaca manusia dalam dan, menurut konvensi, identitas biji-bijian ditulis dengan jenis biji-bijian dan kunci yang / dipisahkan Orleans oleh karakter. Misalnya, shoppingcart/bob65 mewakili jenis biji-bijian bernama shoppingcart dengan kunci bob65.

Tidak umum untuk membangun identitas biji-bijian secara langsung. Sebaliknya, lebih umum untuk membuat referensi biji-bijian menggunakan Orleans.IGrainFactory.

Bagian berikut membahas nama jenis biji-bijian dan kunci biji-bijian secara lebih rinci.

Nama jenis biji-bijian

Orleans membuat nama jenis biji-bijian untuk Anda berdasarkan kelas implementasi biji-bijian Anda dengan menghapus akhiran "Grain" dari nama kelas, jika ada, dan mengonversi string yang dihasilkan menjadi representasi huruf kecilnya. Misalnya, kelas bernama ShoppingCartGrain akan diberi nama shoppingcartjenis biji-bijian . Disarankan agar nama dan kunci jenis biji-bijian hanya terdiri dari karakter yang dapat dicetak seperti karakter alfa-numerik (a-z,ZA- , dan9-0 ) dan simbol seperti -, , . =_@ Karakter lain mungkin atau mungkin tidak didukung dan sering memerlukan perlakuan khusus ketika dicetak dalam log atau muncul sebagai pengidentifikasi di sistem lain seperti database.

Atau, Orleans.GrainTypeAttribute atribut dapat digunakan untuk menyesuaikan nama jenis biji-bijian untuk kelas biji-bijian yang dilampirkan, seperti dalam contoh berikut:

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

Dalam contoh sebelumnya, kelas biji-bijian, ShoppingCartGrain memiliki nama jenis biji-bijian dari cart. Setiap biji-bijian hanya dapat memiliki satu nama jenis biji-bijian.

Untuk butir generik, aritas generik harus disertakan dalam nama jenis biji-bijian. Misalnya, pertimbangkan kelas berikut DictionaryGrain<K, V> :

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

Kelas biji-bijian memiliki dua parameter generik, sehingga backtick ` diikuti oleh aritas generik, 2, ditambahkan ke akhir nama jenis biji-bijian, dict untuk membuat nama dict`2jenis biji-bijian , seperti yang ditentukan dalam atribut pada kelas grain, [GrainType("dict`2")].

Kunci biji-bijian

Untuk kenyamanan, Orleans mengekspos metode yang memungkinkan pembangunan kunci biji-bijian dari Guid atau Int64, selain String. Kunci primer dilingkup ke jenis biji-bijian. Oleh karena itu, identitas lengkap biji-bijian terbentuk dari jenis biji-bijian dan kuncinya.

Pemanggil biji-bijian memutuskan skema mana yang harus digunakan. Opsinya adalah:

Karena data yang mendasar sama, skema dapat digunakan secara bergantian: semuanya dikodekan sebagai string.

Situasi yang memerlukan instans biji-bijian tunggal dapat menggunakan nilai tetap yang terkenal seperti "default". Ini hanyalah konvensi, tetapi dengan mematuhi konvensi ini, itu menjadi jelas di situs pemanggil bahwa biji-bijian tunggal digunakan.

Menggunakan pengidentifikasi unik global (GUID) sebagai kunci

System.Guid membuat kunci yang berguna ketika keacakan dan keunikan global diinginkan, seperti saat membuat pekerjaan baru dalam sistem pemrosesan pekerjaan. Anda tidak perlu mengoordinasikan alokasi kunci, yang dapat menyebabkan satu titik kegagalan dalam sistem, atau kunci sisi sistem pada sumber daya yang dapat menghadirkan hambatan. Ada kemungkinan guid yang sangat rendah bertabrakan, sehingga mereka adalah pilihan umum saat merancang sistem yang perlu mengalokasikan pengidentifikasi acak.

Mereferensikan grain dengan GUID dalam kode klien:

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

Mengambil kunci primer dari kode biji-bijian:

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

Menggunakan bilangan bulat sebagai kunci

Bilangan bulat panjang juga tersedia, yang masuk akal jika biji-bijian dipertahankan ke database relasional, di mana indeks numerik lebih disukai daripada GUID.

Mereferensikan butiran dengan bilangan bulat panjang dalam kode klien:

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

Mengambil kunci primer dari kode biji-bijian:

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

Menggunakan string sebagai kunci

String juga tersedia.

Mereferensikan grain menurut String dalam kode klien:

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

Mengambil kunci primer dari kode biji-bijian:

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

Menggunakan kunci gabungan

Jika Anda memiliki sistem yang tidak cocok dengan GUID atau panjang, Anda dapat memilih kunci primer majemuk, yang memungkinkan Anda menggunakan kombinasi GUID atau panjang dan string untuk mereferensikan biji-bijian.

Anda dapat mewarisi antarmuka Anda dari IGrainWithGuidCompoundKey atau IGrainWithIntegerCompoundKey antarmuka seperti ini:

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

Dalam kode klien, ini menambahkan argumen kedua ke IGrainFactory.GetGrain metode pada pabrik biji-bijian:

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

Untuk mengakses kunci senyawa dalam biji-bijian, kita dapat memanggil kelebihan beban pada GrainExtensions.GetPrimaryKey metode ():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;
    }
}

Mengapa biji-bijian menggunakan pengidentifikasi logis

Di lingkungan berorientasi objek, seperti .NET, identitas objek sulit dibedakan dari referensi ke dalamnya. Saat objek dibuat menggunakan new kata kunci, referensi yang Anda dapatkan kembali mewakili semua aspek identitasnya kecuali objek yang memetakan objek ke beberapa entitas eksternal yang diwakilinya. Orleans dirancang untuk sistem terdistribusi. Dalam sistem terdistribusi, referensi objek tidak dapat mewakili identitas instans karena referensi objek terbatas pada satu ruang alamat proses. Orleans menggunakan pengidentifikasi logis untuk menghindari batasan ini. Grain menggunakan pengidentifikasi logis sehingga referensi biji-bijian tetap valid di seluruh masa proses dan portabel dari satu proses ke proses lain, memungkinkan mereka disimpan dan kemudian diambil atau dikirim di seluruh jaringan ke proses lain dalam aplikasi, semua sambil masih mengacu pada entitas yang sama: butir tempat referensi dibuat.