MemoryStoreService canlı bir oturumdaki tüm sunuculardan erişilebilen hızlı bellek içi veri depolama sağlayan yüksek kapasiteli ve düşük gecikmeli veri hizmetidir. Hafıza Dükkanları , hızlı bir şekilde değişen ve dayanıklı olması gerekmeyen sık ve geçici verilere uygundur, çünkü erişimleri daha hızlıdır ve maksimum ömür süresine ulaştıklarında kaybolurlar.Oturumlar arasında sürekli kalması gereken veriler için, veri depoları kullanın.
Veri yapıları
Doğrudan brüt verilere erişmek yerine, hafıza depoları hızlı işlem için sunucular arasında paylaşılan üç ilkel veri yapısına sahiptir: sıralanmış harita , sıra ve hafıza haritası .Her veri yapısı belirli kullanım durumları için iyi bir uyumdur:
- Beceri tabanlı eşleştirme - Kullanıcı bilgilerini, beceri seviyesi gibi, sunucular arasında paylaşılan bir sıraya kaydedin ve maç yapma dönemlerinde lobi sunucularını kullanarak kullanın.
- Arası sunucu ticareti ve açık artırması - Kullanıcıların gerçek zaman değişen fiyatlarla eşyalara teklif verebilecekleri evrensel bir ticaret etkinleştirin, anahtar-değer çiftlerinin sıralanmış bir haritasıyla. - Enable universal trading between different servers, where users can bid on items with real-time changing prices, with a sorted map of key-value pairs.
- Küresel lider tabloları - Bir sıralanmış haritanın içinde paylaşılan bir lider tablosunda kullanıcı rütbe sıralamalarını saklayın ve güncelleştirin.
- Paylaşılan envanterler - Kullanıcıların envanter öğelerini birbiriyle aynı anda kullanabilmesine izin veren paylaşılan bir hash haritasında envanter öğeleri ve istatistikleri kaydedin.
- Kalıcı Veriler için Önbellek - Kalıcı verilerinizi bir veri depolamasında bir bellek depolamasına senkronize edin ve kullanıcı deneyiminizin sözleşme imzalamaartırmak için bir önbellek haritası hashedleyin .
Genel genel, belirli bir anahtara dayalı verilere erişmeniz gerekiyorsa, bir hash haritası kullanın.Bu verilerin sipariş edilmesi gerekiyorsa, sıralı bir harita kullanın.Verilerinizi belirli bir sırayla işlemek zorunda kalırsanız, bir sıra kullanın.
Sınırlar ve kotalar
Ölçeklenebilirliği ve sistem sözleşme imzalamakorumak için, bellek depolarının bellek boyutu, API istekleri ve veri yapısı boyutu için veri kullanım kotası vardır.
Hafıza depolarının, son kullanma süresine dayalı bir tahliye politikası vardır, ayrıca yaşama süresi olarak bilinir (TTL).Öğeler sona erdikten sonra tahliye edilir ve hafıza kotası yeni girişler için serbest bırakılır.Hafıza sınırına ulaştığınızda, tüm sonraki yazma isteği başarısız olur veya eşyalar sona erene kadar manuel olarak silinir.
Hafıza boyutu kotası
Hafıza kotası, bir deneyimin tüketebileceği toplam hafızayı sınırlandırır.Sabit bir değer değil.Bunun yerine, deneyimdeki kullanıcı sayısına göre zamanla değişir ve aşağıdaki formüle göre değişir: 64KB + 1KB * [kullanıcı sayısı] .Kota, sunucu seviyesi yerine deneyim seviyesine uygulanır.
Kullanıcılar deneyime katıldığında, ekstra hafıza kotası hemen mevcut olur.Kullanıcılar deneyimi terk ettiğinde, kota hemen azalmaz.Kota daha düşük bir değere yeniden değerlendirilmeden önce sekiz günlük bir izleme süresi vardır.
Deneyiminiz bellek boyutu sınırına ulaştıktan sonra, bellek boyutunu artıran herhangi bir API isteği daima başarısız olur.Hafıza boyutunu azaltan veya değiştirmeyen istekler hala başarılıdır.
Gözlemlenebilirlik panosuyla, deneyiminizin bellek boyutu kotasını gerçek zamanda Hafıza Kullanımı grafiği kullanarak görebilirsiniz.
API istek sınırları
API istek sınırları için, tüm API çağrıları için uygulanan bir istenme birimi vardır.Kota 1000 + 100 * [çalışan kullanıcı sayısı] dakika başına istek birimi.
Çoğu API çağrısı yalnızca bir istek birimi tüketir, birkaç istisna dışında:
MemoryStoreSortedMap:GetRangeAsync()
Döndürülen öğe sayısına dayalı birimleri tüketir.Örneğin, bu yöntem 10 öğe döndürürse, çağrı 10 istek birimi olarak sayılır.Boş bir yanıt döndürürse, bir istek birimi olarak sayılır.
Döndürülen öğe sayısına dayalı birimleri tüketir, tıpkı MemoryStoreSortedMap:GetRangeAsync() gibi, ancak okuma sırasında her iki saniye ek bir birim tüketir.Maksimum okuma süresini waitTimeout parametresi ile belirtin.
MemoryStoreHashMap:UpdateAsync()
En az iki birim tüketir.
MemoryStoreHashMap:ListItemsAsync()
Tüketir [taranan bölüm sayısı] + [iade edilen öğeler] birimler.
Talep kotası ayrıca sunucu seviyesi yerine deneyim seviyesine uygulanır.Bu, toplam istek oranı sınırın üzerine çıkmadığı sürece, istekleri sunucular arasında yerleştirmeye esneklik sağlar.Kota sınırını aşarsanız, hizmet isteklerinizi sınırlandığında bir hata yanıtı alırsınız.
Mevcut gözlemlenebilirlik özelliği ile deneyiminizin istek birimi kotasını gerçek zamanlı olarak görebilirsiniz.
Veri yapısı boyut sınırları
Tek bir sıralanmış harita veya sıra için, aşağıdaki boyut ve öğe sayısı sınırları uygulanır:
- Maksimum eşya sayısı: 1,000,000
- Toplam maksimum boyut (sıralanmış harita için anahtarlar dahil): 100 MB
Bölüm sınırları
Bakın her bölüm sınırı.
En iyi uygulamalar
Hafıza kullanım modelinizi optimal tutmak ve sınırlara ulaşmaktan kaçınmak için, şu en iyi uygulamaları izleyin:
İşlenmiş öğeleri kaldır.: Yığınlar ve sıralanmış haritalar için metodu kullanarak okunan öğeleri tutarlı bir şekilde temizlemek, hafızayı özgürleştirebilir ve veri yapısını güncel tutabilir.
Veri eklerken mümkün olan en küçük zaman dilimine son kullanma süresini ayarlayın.: Varsayılan süre dolum süresi her iki durumda da 45 gün olmasına rağmen, en kısa olası süreyi ayarlamak, hafıza kullanım kotanızı doldurmalarını engellemek için eski verileri otomatik olarak temizleyebilir.
Uzun bir sona sahip büyük miktarda veri depolamayın, çünkü hafıza sınırınızı aşmak ve tüm deneyiminizi bozabilecek sorunlara neden olma riski taşıyor.
Her zaman gerekli olmayan öğeleri açıkça sil veya kısa bir öğe süresi ayarlayın.
Genel olarak, bellek ve öğe süresi sona ermesini güvenlik mekanizması olarak uzun bir süre boyunca belleği işgal etmekten kaçınmak için açık silmeyi kullanmalısınız.
Sadece gerekli değerleri belleğe tutun.
Örneğin, bir ihale evi deneyimi için, yalnızca en yüksek teklifi korumana ihtiyacınız var.Tüm teklifleri veri yapınızda tutmak yerine en yüksek teklifi korumak için bir anahtarda MemoryStoreSortedMap:UpdateAsync() kullanabilirsiniz.
API istek sınırlarının altında kalmaya yardımcı olmak için üstel geri çekmeyi kullanın.
Örneğin, bir DataUpdateConflict alırsanız, iki saniye sonra, dört, sekiz vb. yeniden deneyebilirsiniz.Doğru yanıtı almak için sürekli olarak MemoryStoreService 'ye istek göndermek yerine.
Devasa veri yapılarını parçalama ile birden fazla küçük yapıya bölünüz.
Bütün verileri tek bir büyük veri yapısında depolamak yerine, daha küçük yapılarda verileri yönetmek genellikle daha kolaydır.Bu yaklaşım ayrıca kullanım ve oran sınırlarının önlenmesine yardımcı olabilir.Örneğin, anahtarları için tercihler kullanan sıralı bir haritanız varsa, her bir tercihi kendi sıralı haritasına ayırmayı düşünün.Özellikle popüler bir deneyim için, kullanıcıların kullanıcı kimliklerinin son sayılarına dayanarak birden fazla haritaya bölünebilirsiniz.
Depolanmış değerleri sıkıştır.
Örneğin, depolanan değer boyutunu azaltmak için LZW algoritmasını kullanmayı düşünün.
Gözlemlenebilirlik
Gözlemlenebilirlik Panosu, hafıza depolama kullanımınızı izleme ve sorun giderme için bilgiler ve analizler sağlar.Hafıza kullanımının ve API isteklerinin farklı yönlerinde gerçek zaman güncelleme tablolarıyla, deneyiminizin hafıza kullanımı modelini izleyebilir, mevcut ayrılan kotaları görebilir, API durumunu izleyebilir ve performans optimizasyonu için potansiyel sorunları tanımlayabilirsiniz.
Aşağıdaki tablo, Observability Dashboard'daki Durum Kodlarına Göre İstek Sayısı ve API x Durum ile İstekler tablolarında mevcut API yanıtlarının tüm durum kodlarını listeler ve açıklar.Bu hataların nasıl çözüleceğine dair daha fazla bilgi için, Sorun Giderme bakın.Bir hata ile ilgili belirli kota veya sınır için, bakın Sınırlar ve Kotalar.
Durum kodu | Açıklama |
---|---|
Başarı | Başarı. |
Veri Yapısı Hafıza Sınırını Aşma | Veri yapısı seviye bellek boyutu sınırını aşar (100MB). |
VeriGüncellemeÇatışması | Eşzamanlı güncelleme nedeniyle çatışma. |
Erişim Reddedildi | Deneyim veriye erişimi yetkisiz. Bu istek, istek birimlerini tüketmez veya kota kullanmaz. |
İçsel Hata | Dahili hata. |
Geçersiz İstek | İstek gerekli bilgilere sahip değil veya yanlış bilgiye sahip. |
Veri Yapısı Öğeleri Sınırının Üzerinde DataStructureItemsOverLimit | Veri yapısı seviyesi öğe sayı sınırını aşar (1M). |
NoItemFound bulunamadı | MemoryStoreQueue:ReadAsync() veya MemoryStoreSortedMap:UpdateAsync() 'de herhangi bir öğe bulunamadı. ReadAsync() her 2 saniye anket yapar ve sıraya öğeler bulana kadar bu durum kodunu geri döndürür. |
Veri Yapısı İstekleri Sınırın Üzerinde DataStructureRequestsOverLimit | Veri yapısı seviye istek birim sınırını aşar (dakika başına 100,000 istek birimi). |
Bölüm İstekleri Sınırının Üzerindeki İstekler | Bölüm isteği birimi sınırını aşar. |
Toplam İstekler Sınırını Aştı | Evren seviyesi istek birimi sınırını aşar. |
Toplam Hafıza Sınırını Aşma | Evren seviyesi bellek kotasını aşar. |
EşyaDeğeri Boyutu Çok Büyük | Değer boyutu sınırı aşıyor (32KB). |
Aşağıdaki tablo, mevcut olmayan durum kodlarını listeler, şu anda Gözlem Ekranı'nda mevcut değil.
Durum kodu | Açıklama |
---|---|
İçsel Hata | Dahili Hata. |
Yayınlanmamış Yer | MemoryStoreService'i kullanmak için bu yeri yayınlamanız gerekir. |
Geçersiz Müşteri Erişimi | MemoryStoreService, sunucudan çağrılmalıdır. |
GeçersizSonaErmeSüresi | Süre 'son kullanma' alanı 0 ile 3,888,000 arasında olmalıdır. |
Geçersiz İstek | Değeri json'a dönüştüremiyoruz. |
Geçersiz İstek | sortKey'i geçerli bir sayı veya dizidönüştüremiyor. |
TransformCallbackBaşarısız | Dönüşüm geri çağırma işlevi çağrılamadı. |
İstekSınırlandı | Yakın MemoryStores istekleri bir veya daha fazla sınıra ulaştı. |
Güncelleme Çatışması | Maksimum yeniden deneme sayısı aşıldı. |
Sorun çözme
Aşağıdaki tablo, her yanıt durum kodu için önerilen çözümü listeler ve açıklar:
Error İngilizce: Error | Sorun giderme seçenekleri |
---|---|
Veri Yapısı İstekleri Sınırının Üzerinde / Bölüm İstekleri Sınırının Üzerinde |
|
Toplam İstekler Sınırını Aştı | |
Veri Yapısı Öğeleri Sınırının Üzerinde DataStructureItemsOverLimit |
|
Veri Yapısı Hafıza Sınırını Aşma | |
Toplam Hafıza Sınırını Aşma | |
VeriGüncellemeÇatışması |
Çatışmaları önlemek için verimli bir şekilde çağrıp çağırmadığınızı görmek için araştırın MemoryStoreService .İdeal olarak, talepleri aşırı göndermemelisiniz.: Öğeleri, sıralı süreçler ve sıralı haritalar için MemoryStoreQueue:RemoveAsync() yöntemi kullanılarak okunduktan sonra tutarlı bir şekilde kaldırın. |
İçsel Hata |
|
Geçersiz İstek |
|
EşyaDeğeri Boyutu Çok Büyük |
|
Studio'da test ve hata ayıklama
MemoryStoreService 'deki veriler Studio ve üretim arasında izole edilmiştir, bu nedenle Studio'daki verileri değiştirmek üretim davranışını etkilemez.Bu, Studio'dan API çağrılarının üretim verilerine erişmediği ve böylece üretime gitmeden önce güvenle bellek depolarını ve yeni özellikleri test edebileceğiniz anlamına gelir.
Stüdyo testi, üretimle aynı sınırlara ve kotalara sahiptir.Kullanıcı sayısına dayalı olarak hesaplanan kotalar için, Studio testi için tek kullanıcı olduğunuz için sonuç kotası çok küçük olabilir.Stüdyodan test yaparken, erişim ve izinlerin doğrulanması için yapılan bazı ek kontroller nedeniyle üretimde kullanıma kıyasla biraz daha yüksek gecikme ve hata oranları fark edebilirsiniz.
Canlı deneyimlerde bir bellek depolamasını nasıl depura edeceğiniz veya stüdyoda test ederken bilgi almak için Geliştirici Konsolu kullanın.