Bagikan melalui


Manajemen status Reliable Actor

Reliable Actor adalah objek single-thread yang dapat merangkum logika dan status. Karena actor berjalan pada Reliable Services, actor dapat mempertahankan status secara andal dengan menggunakan mekanisme persistensi dan replikasi yang sama. Dengan cara ini, actor tidak kehilangan statusnya setelah kegagalan, saat reaktivasi setelah pengumpulan sampah, atau ketika mereka dipindahkan di antara node dalam kluster karena penyeimbangan sumber daya atau peningkatan.

Persistensi dan replikasi status

Semua Reliable Actor dianggap stateful karena setiap instans actor memetakan ke ID unik. Ini berarti bahwa panggilan berulang ke ID actor yang sama dialihkan ke instans actor yang sama. Sebaliknya, dalam sistem stateless, panggilan klien tidak dijamin akan dirutekan ke server yang sama setiap saat. Untuk alasan ini, layanan actor selalu merupakan layanan stateful.

Meskipun actor dianggap stateful, tidak berarti actor harus menyimpan status dengan andal. Actor dapat memilih tingkat persistensi dan replikasi status berdasarkan persyaratan penyimpanan data mereka:

  • Status persisten: Status persisten pada disk dan direplikasi ke tiga replika atau lebih. Status persisten adalah opsi penyimpanan status yang paling tahan lama karena status dapat bertahan melalui ketidaktersediaan kluster yang lengkap.
  • Keadaan volatil: Status direplikasi ke tiga replika atau lebih dan hanya disimpan dalam memori. Keadaan volatil memberikan durabilitas terhadap kegagalan node dan kegagalan actor, dan selama peningkatan dan penyeimbangan sumber daya. Namun, status tidak bertahan di disk. Jadi jika semua replika hilang sekaligus, status hilang juga.
  • Status persisten: Status tidak direplikasi atau ditulis ke disk, hanya digunakan untuk actor yang tidak perlu mempertahankan status dengan andal.

Setiap tingkat persistensi hanyalah penyedia status dan konfigurasi replikasi layanan Anda yang berbeda. Penulisan ke disk bergantung pada penyedia status--komponen dalam reliable service yang menyimpan status. Replikasi bergantung pada jumlah replika yang disebarkan layanan. Seperti halnya Reliable Service, penyedia status dan jumlah replika dapat dengan mudah diatur secara manual. Kerangka kerja actor menyediakan atribut yang, ketika digunakan pada actor, secara otomatis memilih penyedia status default dan secara otomatis menghasilkan pengaturan untuk jumlah replika guna mencapai salah satu dari tiga pengaturan persistensi ini. Atribut StatePersistence tidak diwariskan oleh kelas turunan, setiap jenis cktor harus memberikan tingkat StatePersistence-nya.

Status persisten

[StatePersistence(StatePersistence.Persisted)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
class MyActorImpl  extends FabricActor implements MyActor
{
}

Pengaturan ini menggunakan penyedia status yang menyimpan data pada disk dan secara otomatis mengatur jumlah replika layanan menjadi 3.

Status volatil

[StatePersistence(StatePersistence.Volatile)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Volatile)
class MyActorImpl extends FabricActor implements MyActor
{
}

Pengaturan ini menggunakan penyedia status hanya dalam memori dan mengatur jumlah replika menjadi 3.

Status nonpersisten

[StatePersistence(StatePersistence.None)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.None)
class MyActorImpl extends FabricActor implements MyActor
{
}

Pengaturan ini menggunakan penyedia status hanya dalam memori dan mengatur jumlah replika menjadi 1.

Default dan pengaturan yang dihasilkan

Saat Anda menggunakan atribut StatePersistence, penyedia status secara otomatis dipilih untuk Anda pada waktu proses saat layanan actor dimulai. Namun, jumlah replika diatur pada waktu kompilasi oleh alat build actor Visual Studio. Alat build secara otomatis menghasilkan layanan default untuk layanan actor di ApplicationManifest.xml. Parameter dibuat untuk ukuran set replika min dan ukuran set replika target.

Anda dapat mengubah parameter ini secara manual. Tetapi setiap kali atribut StatePersistence diubah, parameter diatur ke nilai ukuran replika set default untuk atribut StatePersistence yang dipilih, mengambil alih nilai sebelumnya. Dengan kata lain, nilai yang Anda tetapkan ServiceManifest.xml hanya diambil alih pada waktu build saat Anda mengubah nilai atribut StatePersistence.

<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application12Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Parameters>
      <Parameter Name="MyActorService_PartitionCount" DefaultValue="10" />
      <Parameter Name="MyActorService_MinReplicaSetSize" DefaultValue="3" />
      <Parameter Name="MyActorService_TargetReplicaSetSize" DefaultValue="3" />
   </Parameters>
   <ServiceManifestImport>
      <ServiceManifestRef ServiceManifestName="MyActorPkg" ServiceManifestVersion="1.0.0" />
   </ServiceManifestImport>
   <DefaultServices>
      <Service Name="MyActorService" GeneratedIdRef="77d965dc-85fb-488c-bd06-c6c1fe29d593|Persisted">
         <StatefulService ServiceTypeName="MyActorServiceType" TargetReplicaSetSize="[MyActorService_TargetReplicaSetSize]" MinReplicaSetSize="[MyActorService_MinReplicaSetSize]">
            <UniformInt64Partition PartitionCount="[MyActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatefulService>
      </Service>
   </DefaultServices>
</ApplicationManifest>

Pengelola status

Setiap instans actor memiliki pengelola statusnya sendiri: struktur data seperti dictionary yang menyimpan pasangan key/nilai secara andal. Pengelola status adalah pembungkus di sekitar penyedia status. Anda dapat menggunakannya untuk menyimpan data terlepas dari pengaturan persistensi mana yang digunakan. Ini tidak memberikan jaminan bahwa layanan actor yang sedang berjalan dapat diubah dari pengaturan status yang volatil (hanya dalam memori) ke pengaturan status yang persisten melalui peningkatan bergulir sambil mempertahankan data. Namun, perubahan jumlah replika untuk layanan yang sedang berjalan dapat dilakukan.

Key pengelola status harus string. Nilai berdasarkan generik dan bisa menjadi jenis apa pun, termasuk jenis kustom. Nilai yang disimpan di pengelola status harus dapat diserialisasikan kontrak data karena mungkin dikirimkan melalui jaringan ke node lain selama replikasi dan mungkin ditulis ke disk, tergantung pada pengaturan kegigihan status actor.

Pengelola status mengekspos metode kamus umum untuk mengelola status, mirip dengan yang ditemukan dalam Reliable Dictionary.

Untuk contoh pengelolaan status actor, baca Akses, simpan, dan hapus status Reliable Actor.

Praktik terbaik

Berikut adalah beberapa praktik yang disarankan dan tips pemecahan masalah untuk mengelola status actor Anda.

Jadikan status actor sebagai segranular mungkin

Ini sangat penting untuk kinerja dan penggunaan sumber daya aplikasi Anda. Setiap kali ada tulisan/pembaruan untuk "status bernama" suatu actor, seluruh nilai yang sesuai dengan "status bernama" itu diserialisasikan dan dikirim melalui jaringan ke replika sekunder. Sekunder menulisnya ke disk lokal dan membalas kembali ke replika utama. Ketika utama menerima pernyataan dari kuorum replika sekunder, utama menulis keadaan ke disk lokalnya. Misalnya, jika nilainya adalah kelas yang memiliki 20 anggota dan ukuran 1 MB. Bahkan jika Anda hanya memodifikasi salah satu anggota kelas yang berukuran 1 KB, Anda akhirnya membayar biaya serialisasi dan jaringan dan disk menulis untuk 1 MB penuh. Demikian pula, jika nilainya adalah koleksi (seperti daftar, array, atau dictionary), Anda membayar biaya untuk koleksi lengkap bahkan jika Anda memodifikasi salah satu anggotanya. Antarmuka StateManager dari kelas actor seperti dictionary. Anda harus selalu memodelkan struktur data yang merepresentasikan status actor di atas dictionary ini.

Mengelola siklus hidup actor

Anda harus memiliki kebijakan yang jelas tentang mengelola ukuran status di setiap partisi layanan actor. Layanan actor Anda harus memiliki sejumlah actor tetap dan menggunakannya kembali sebanyak mungkin. Jika Anda terus membuat actor baru, Anda harus menghapusnya setelah selesai dengan pekerjaan mereka. Kerangka actor menyimpan beberapa metadata tentang setiap actor yang ada. Menghapus semua keadaan seorang actor tidak menghapus metadata tentang actor tersebut. Anda harus menghapus actor (lihat menghapus actor dan statusnya) untuk menghapus semua informasi tentangnya yang disimpan dalam sistem. Sebagai pemeriksaan tambahan, Anda harus meminta layanan actor (lihat menghitung actor) sesekali untuk memastikan jumlah actor berada dalam kisaran yang diharapkan.

Jika Anda pernah melihat bahwa ukuran file database dari Actor Service meningkat melampaui ukuran yang diharapkan, pastikan bahwa Anda mengikuti pedoman sebelumnya. Jika Anda mengikuti panduan ini dan masih mengalami masalah ukuran file database, Anda harus membuka tiket dukungan dengan tim produk untuk mendapatkan bantuan.

Langkah berikutnya

Status yang disimpan dalam Reliable Actor harus diserialisasikan sebelum ditulis ke disk dan direplikasi untuk ketersediaan tinggi. Pelajari selengkapnya tentang Serialisasi jenis actor.

Selanjutnya, pelajari lebih lanjut tentang Diagnostik actor dan pemantauan kinerja.