Azure Service Fabric'te Güvenilir Koleksiyonlar için yönergeler ve öneriler
Bu bölümde Reliable State Manager ve Reliable Collections kullanma yönergeleri sağlanır. Amaç, kullanıcıların yaygın tuzaklardan kaçınmasına yardımcı olmaktır.
Reliable Collection guildelines
Yönergeler, Do, Consider, Avoid ve Do not terimleriyle önekli basit öneriler olarak düzenlenmiştir.
- Okuma işlemleri tarafından döndürülen özel türde bir nesneyi değiştirmeyin (örneğin,
TryPeekAsync
veyaTryGetValueAsync
). Eşzamanlı Koleksiyonlar gibi Güvenilir Koleksiyonlar da nesnelere bir başvuru döndürür, kopya döndürmez. - Özel türü değiştirmeden önce döndürülen nesnesini ayrıntılı olarak kopyalayın. Yapılar ve yerleşik türler birer birer değer olduğundan, değiştirmek istediğiniz başvuru türüne sahip alanlar veya özellikler içermediği sürece bunlar üzerinde derin bir kopya yapmanız gerekmez.
- Zaman aşımları için kullanmayın
TimeSpan.MaxValue
. Kilitlenmeleri algılamak için zaman aşımları kullanılmalıdır. - İşlem tamamlandıktan, durdurulduktan veya atıldıktan sonra işlem kullanmayın.
- Içinde oluşturulduğu işlem kapsamının dışında bir numaralandırma kullanmayın.
- Kilitlenmelere neden olabileceği için başka bir işlemin
using
deyimi içinde işlem oluşturmayın. - ile
IReliableStateManager.GetOrAddAsync
güvenilir durum oluşturmayın ve aynı işlemde güvenilir durumu kullanmayın. Bunun sonucunda InvalidOperationException elde edilir. - Uygulamanızın
IComparable<TKey>
doğru olduğundan emin olun. Sistem denetim noktalarını ve satırları birleştirmek için bağımlılığıIComparable<TKey>
alır. - Belirli bir kilitlenme sınıfını önlemek için bir öğeyi güncelleştirmek amacıyla okurken Güncelleştirme kilidini kullanın.
- Bölüm başına Güvenilir Koleksiyon sayısını 1000'den az olarak tutmayı göz önünde bulundurun. Daha az öğe içeren daha fazla Güvenilir Koleksiyon yerine daha fazla öğe içeren Güvenilir Koleksiyonlar'ı tercih edin.
- Öğelerinizi (örneğin, Güvenilir Sözlük için TKey + TValue) 80 KByte'ın altında tutmayı göz önünde bulundurun: daha küçüktür. Bu, Büyük Nesne Yığını kullanımının yanı sıra disk ve ağ GÇ gereksinimlerini azaltır. Genellikle, değerin yalnızca küçük bir bölümü güncelleştirilirken yinelenen verilerin çoğaltılmasını azaltır. Güvenilir Sözlük'te bunu başarmak için sık kullanılan yol, satırlarınızı birden çok satıra bölmektir.
- Olağanüstü durum kurtarma için yedekleme ve geri yükleme işlevlerini kullanmayı göz önünde bulundurun.
- Farklı yalıtım düzeylerinden dolayı tek varlık işlemlerini ve çok varlıklı işlemleri (örneğin
GetCountAsync
,CreateEnumerableAsync
) aynı işlemde karıştırmaktan kaçının. - InvalidOperationException işle. Kullanıcı işlemleri çeşitli nedenlerle sistem tarafından durdurulabilir. Örneğin, Reliable State Manager rolünü Birincil olarak değiştirdiğinde veya uzun süre çalışan bir işlem işlem günlüğünün kesilmesini engelliyorsa. Böyle durumlarda kullanıcı, işlemlerinin zaten sonlandırıldığını belirten InvalidOperationException alabilir. İşlemin sonlandırılması kullanıcı tarafından istenmediği varsayıldığında, bu özel durumu işlemenin en iyi yolu işlemi atmak, iptal belirtecinin sinyal alıp almadığını (veya çoğaltmanın rolünün değiştirilip değiştirilmediğini) denetlemek ve yeni bir işlem oluşturup yeniden denemektir.
- Bir işlem içinde paralel veya eşzamanlı işlemler uygulamayın. Bir işlem içinde yalnızca bir kullanıcı iş parçacığı işlemi desteklenir. Aksi takdirde, bellek sızıntısı ve kilit sorunlarına neden olur.
- İşleme tamamlandıktan sonra (özellikle ConcurrentQueue kullanılıyorsa) işlemi mümkün olan en kısa sürede atmayı göz önünde bulundurun.
- Bir işlem içinde herhangi bir engelleme kodu gerçekleştirmeyin.
- Dize güvenilir bir sözlüğün anahtarı olarak kullanıldığında, sıralama düzeni varsayılan dize karşılaştırıcısı CurrentCulture kullanır. CurrentCulture sıralama düzeninin Sıralı dize karşılaştırıcısından farklı olduğunu unutmayın.
- İşleme işlemini atmayın veya iptal etmeyin. Bu desteklenmez ve konak işlemi kilitlenebilir.
- Kilitlenmeyi önlemek için birden çok sözlük okurken veya yazarken farklı sözlüklerin işlem sırasının tüm eşzamanlı işlemlerde aynı kaldığından emin olun.
Aklınızda bulundurması gereken bazı şeyler şunlardır:
- Tüm Reliable Collection API'leri için varsayılan zaman aşımı 4 saniyedir. Kullanıcıların çoğu varsayılan zaman aşımını kullanmalıdır.
- Varsayılan iptal belirteci tüm Reliable Collections API'lerindedir
CancellationToken.None
. - Reliable Dictionary için anahtar türü parametresinin (TKey) ve
Equals()
değerlerini doğru şekilde uygulamasıGetHashCode()
gerekir. Anahtarlar sabit olmalıdır. - Güvenilir Koleksiyonlar için yüksek kullanılabilirlik elde etmek için her hizmetin en az bir hedef ve en düşük çoğaltma kümesi boyutu 3 olmalıdır.
- İkincil üzerindeki okuma işlemleri çekirdek işlenmeyen sürümleri okuyabilir. Bu, tek bir ikincilden okunan bir veri sürümünün yanlış ilerletilmiş olabileceği anlamına gelir. Birincil okumalar her zaman kararlıdır: hiçbir zaman yanlış ilerleme olamaz.
- Güvenilir bir koleksiyonda uygulamanız tarafından kalıcı hale gelen verilerin güvenliği/gizliliği sizin kararınızdır ve depolama yönetiminiz tarafından sağlanan korumalara tabidir; Diğer bir deyişle, bekleyen verilerinizi korumak için İşletim Sistemi disk şifrelemesi kullanılabilir.
ReliableDictionary
numaralandırması anahtara göre sıralanmış bir sıralanmış veri yapısı kullanır. Numaralandırmayı verimli hale getirmek için işlemeler geçici bir karma tabloya eklenir ve daha sonra denetim noktasından sonra ana sıralanmış veri yapısına taşınır. Ekler/Güncelleştirmeler/Silmeler, anahtarın varlığıyla ilgili doğrulama denetimleri söz konusu olduğunda en iyi O(1) çalışma zamanına ve en kötü durum çalışma zamanı olan O(günlük n)'ye sahiptir. Son işlemeden mi yoksa eski bir işlemeden mi okuduğuna bağlı olarak, almalar O(1) veya O(günlük n) olabilir.
Geçici Güvenilir Koleksiyonlar için ek yönergeler
Geçici güvenilir koleksiyonları kullanmaya karar verirken aşağıdakileri göz önünde bulundurun:
ReliableDictionary
geçici desteğe sahipReliableQueue
geçici desteğe sahipReliableConcurrentQueue
geçici desteğe sahip DEĞİlDİ- Kalıcı hizmetler geçici yapılamaz. Bayrağın
HasPersistedState
olarakfalse
değiştirilmesi, hizmetin tamamını sıfırdan yeniden oluşturmanızı gerektirir - Geçici hizmetler kalıcı yapılamaz. Bayrağın
HasPersistedState
olaraktrue
değiştirilmesi, hizmetin tamamını sıfırdan yeniden oluşturmanızı gerektirir HasPersistedState
bir hizmet düzeyi yapılandırmasıdır. Bu, ALL koleksiyonlarının kalıcı veya geçici olacağı anlamına gelir. Geçici ve kalıcı koleksiyonları karıştıramazsınız- Geçici bir bölümün çekirdek kaybı tam veri kaybına neden olur
- Geçici hizmetler için yedekleme ve geri yükleme KULLANıLAMAZ