Panduan dan rekomendasi untuk Reliable Collections di Azure Service Fabric
Bagian ini menyediakan panduan untuk menggunakan Reliable State Manager dan Reliable Collections. Tujuannya adalah untuk membantu pengguna menghindari perangkap umum.
Guildeline Reliable Collection
Panduan tersebut disusun sebagai rekomendasi sederhana yang diawali dengan istilah Lakukan, Pertimbangkan, Hindari, dan Jangan.
- Jangan mengubah objek jenis kustom yang dikembalikan oleh operasi baca (misalnya,
TryPeekAsync
atauTryGetValueAsync
). Reliable Collections, sama seperti Concurrent Collections, mengembalikan referensi ke objek dan bukan salinan. - Lakukan salinan mendalam objek yang dikembalikan dari jenis kustom sebelum memodifikasinya. Karena struct dan jenis bawaan adalah pass-by-value, Anda tidak perlu melakukan salinan mendalam padanya kecuali berisi bidang atau properti yang diketik referensi yang ingin Anda ubah.
- Jangan gunakan
TimeSpan.MaxValue
untuk waktu habis. Waktu habis harus digunakan untuk mendeteksi kebuntuan. - Jangan menggunakan transaksi setelah dilakukan, dibatalkan, atau dibuang.
- Jangan gunakan enumerasi di luar cakupan transaksi tempat transaksi dibuat.
- Jangan membuat transaksi dalam pernyataan
using
transaksi lain karena dapat menyebabkan kebuntuan. - Jangan membuat keadaan yang dapat diandalkan dengan
IReliableStateManager.GetOrAddAsync
dan menggunakan keadaan yang dapat diandalkan dalam transaksi yang sama. Ini menghasilkan InvalidOperationException. - Pastikan implementasi
IComparable<TKey>
Anda benar. Sistem ini mengambil ketergantunganIComparable<TKey>
untuk menggabungkan titik pemeriksaan dan baris. - Gunakan kunci Perbarui saat membaca item dengan niat untuk memperbaruinya untuk mencegah kelas kebuntuan tertentu.
- Pertimbangkan untuk menyimpan jumlah Reliable Collections per partisi menjadi kurang dari 1000. Lebih suka Reliable Collections dengan lebih banyak item daripada Reliable Collections dengan lebih sedikit item.
- Pertimbangkan untuk menyimpan item Anda (misalnya, TKey + TValue untuk Reliable Dictionary) di bawah 80 KByte: lebih kecil semakin baik. Ini mengurangi jumlah penggunaan Heap Objek Besar serta persyaratan IO disk dan jaringan. Seringkali, ini mengurangi replikasi data duplikat ketika hanya satu bagian kecil dari nilai yang diperbarui. Cara umum untuk mencapainya dalam Reliable Dictionary, adalah dengan memecah baris Anda menjadi beberapa baris.
- Pertimbangkan untuk menggunakan fungsionalitas pencadangan dan pemulihan untuk memiliki pemulihan bencana.
- Hindari pencampuran operasi entitas tunggal dan operasi multi-entitas (misalnya
GetCountAsync
,CreateEnumerableAsync
) dalam transaksi yang sama karena tingkat isolasi yang berbeda. - Tangani InvalidOperationException. Transaksi pengguna dapat dibatalkan oleh sistem karena berbagai alasan. Misalnya, ketika Reliable State Manager mengubah perannya dari Primer atau ketika transaksi yang berjalan lama memblokir pemotongan log transaksional. Dalam kasus tersebut, pengguna mungkin menerima InvalidOperationException yang menunjukkan bahwa transaksi mereka telah dihentikan. Dengan asumsi, penghentian transaksi tidak diminta oleh pengguna, cara terbaik untuk menangani pengecualian ini adalah dengan membuang transaksi, periksa apakah token pembatalan telah diberi sinyal (atau peran replika telah diubah), dan jika tidak membuat transaksi baru dan mencoba kembali.
- Jangan menerapkan operasi paralel atau bersamaan dalam transaksi. Hanya satu operasi utas pengguna yang didukung dalam transaksi. Jika tidak, itu akan menyebabkan kebocoran memori dan masalah kunci.
- Pertimbangkan untuk membuang transaksi sesegera mungkin setelah penerapan selesai (terutama jika menggunakan ConcurrentQueue).
- Jangan melakukan kode pemblokiran di dalam transaksi.
- Ketika string digunakan sebagai kunci untuk kamus yang andal, urutan pengurutan menggunakan string default comparer CurrentCulture. Perhatikan bahwa urutan pengurutan CurrentCulture berbeda dari pembanding string Ordinal.
- Jangan buang atau batalkan transaksi yang dilakukan. Ini tidak didukung dan dapat menabrak proses host.
- Pastikan urutan operasi kamus yang berbeda tetap sama untuk semua transaksi bersamaan saat membaca atau menulis beberapa kamus untuk menghindari kebuntuan.
Berikut beberapa hal yang perlu diperhatikan:
- Waktu habis default adalah selama 4 detik untuk semua API Reliable Collection. Sebagian besar pengguna harus menggunakan waktu habis default.
- Token pembatalan default adalah
CancellationToken.None
di semua Reliable Collections API. - Parameter jenis kunci (TKey) untuk Reliable Dictionary harus diimplementasikan dengan benar
GetHashCode()
danEquals()
. Kunci harus tidak dapat diubah. - Untuk mencapai ketersediaan tinggi untuk Reliable Collections, setiap layanan harus memiliki setidaknya satu target dan ukuran replika set minimal 3.
- Operasi baca pada sekunder dapat membaca versi yang tidak dilakukan kuorum. Ini berarti bahwa versi data yang dibaca dari satu sekunder mungkin mengalami kemajuan palsu. Baca dari Primer selalu stabil: tidak pernah bisa mengalami kemajuan palsu.
- Keamanan/Privasi data yang disimpan oleh aplikasi Anda dalam kumpulan tepercaya merupakan keputusan Anda dan tunduk pada perlindungan yang disediakan oleh manajemen penyimpanan Anda; Mis. Enkripsi disk Sistem Operasi dapat digunakan untuk melindungi data Anda ketika data tidak aktif.
- Enumerasi
ReliableDictionary
menggunakan struktur data yang diurutkan menurut kunci. Untuk membuat enumerasi efisien, penerapan ditambahkan ke hashtable sementara dan kemudian dipindahkan ke titik pemeriksaan pos struktur data utama yang diurutkan. Adds/Updates/Deletes memiliki runtime kasus terbaik O(1) dan runtime kasus terburuk O(log n), dalam kasus pemeriksaan validasi pada keberadaan kunci. Gets dapat berupa O(1) atau O(log n) tergantung apakah Anda membaca dari penerapan terbaru atau dari penerapan yang lebih lama.
Panduan tambahan untuk Reliable Collections yang volatil
Saat memutuskan untuk menggunakan koleksi yang dapat diandalkan yang volatil, pertimbangkan hal berikut:
ReliableDictionary
memang memiliki dukungan yang volatilReliableQueue
memang memiliki dukungan yang volatilReliableConcurrentQueue
TIDAK memiliki dukungan yang volatil- Layanan bertahan TIDAK DAPAT dibuat volatil. Mengubah bendera
HasPersistedState
kefalse
mengharuskan membuat ulang seluruh layanan dari awal - Layanan volatil TIDAK DAPAT dibuat bertahan. Mengubah bendera
HasPersistedState
ketrue
mengharuskan membuat ulang seluruh layanan dari awal HasPersistedState
adalah konfigurasi tingkat layanan. Ini berarti bahwa SEMUA koleksi akan bertahan atau volatil. Anda tidak dapat mencampur koleksi yang volatil dan bertahan- Hilangnya kuorum dari partisi volatil mengakibatkan hilangnya data lengkap
- Pencadangan dan pemulihan TIDAK tersedia untuk layanan yang volatil