MemoryStoreService adalah layanan data putaran tinggi dan latensi rendah yang menyediakan penyimpanan data dalam memori cepat yang dapat diakses dari semua server dalam sesi langsung. Toko Memori cocok untuk data yang sering dan sementara yang berubah dengan cepat dan tidak perlu menjadi tahan lama, karena lebih cepat diakses dan lenyap saat mencapai masa hidup maksimum.Untuk data yang perlu bertahan melintasi sesi, gunakan toko data.
Struktur data
Alih-alih mengakses data mentah secara langsung, penyimpanan memori memiliki tiga struktur data primitif yang dibagikan di antara server untuk pemrosesan cepat: peta diurutkan , antrian , dan peta hash .Setiap struktur data adalah cocok untuk kasus penggunaan tertentu:
- Pencocokan berdasarkan keterampilan - Simpan informasi pengguna, seperti levelketerampilan, di antara server bersama, dan gunakan server lobi untuk menjalankan periode pencocokan secara berkala.
- Perdagangan dan lelang antar server - Aktifkan perdagangan universal di antara server yang berbeda, di mana pengguna dapat menawar item dengan harga berubah real time, dengan peta kunci-nilai pasangan kunci.
- Papan peringkat global - Menyimpan dan memperbarui peringkat pengguna di papan peringkat bersama di dalam peta terurut .
- Inventaris bersama - Simpan item inventaris dan statistik di peta hash bersama, di mana pengguna dapat menggunakan item inventaris secara bersamaan dengan satu sama lain.
- Cache untuk Data Tetap - Sinkronkan dan salin data tetap Anda ke penyimpanan memori ke dalam cache peta hash yang dapat bertindak sebagai cache dan meningkatkan pelaksanaanpengalaman.
Secara umum, jika Anda perlu mengakses data berdasarkan unittertentu, gunakan peta hash.Jika Anda membutuhkan data tersebut untuk dipesan, gunakan peta yang disortir.Jika Anda perlu memproses data Anda dalam urutan tertentu, gunakan antrian.
Batas dan kuota
Untuk mempertahankan pelaksanaandan kinerja sistem, penyimpanan memori memiliki kuota penggunaan data untuk ukuran memori, permintaan API, dan ukuran struktur data.
Toko memori memiliki kebijakan eviksi berdasarkan waktu kedaluwarsa, juga dikenal sebagai waktu untuk hidup (TTL).Item diusir setelah mereka kedaluwarsa, dan kuota memori dibebaskan untuk entri baru.Ketika Anda mencapai batas memori, semua permintaan penulisan berikutnya gagal sampai item kedaluwarsa atau Anda secara manual menghapusnya.
Kuota ukuran memori
Kuota memori membatasi jumlah memori total yang dapat dikonsumsi oleh pengalaman.Ini bukan nilai tetap.Sebagai gantinya, itu berubah seiring waktu tergantung pada jumlah pengguna dalam pengalaman sesuai dengan formula berikut: 64KB + 1KB * [jumlah pengguna] .Kuota diterapkan pada tingkat pengalaman bukan levelserver.
Ketika pengguna bergabung dengan pengalaman, kuota memori tambahan tersedia segera.Ketika pengguna meninggalkan pengalaman, kuota tidak berkurang secara langsung.Ada periode pelacakan kembali selama delapan hari sebelum kuota diuji ulang ke nilai yang lebih rendah.
Setelah pengalaman Anda mencapai batas ukuran memori, semua permintaan API yang meningkatkan ukuran memori selalu gagal.Permintaan yang mengurangi atau tidak mengubah ukuran memori masih berhasil.
Dengan dashboard pengamatan, Anda dapat melihat kuota ukuran memori pengalaman Anda secara real time menggunakan grafik Penggunaan Memori .
Batas permintaan API
Untuk batas permintaan API, ada kuota permintaan unit yang berlaku untuk semua panggilan API MemoryStoreService.Kuota adalah 1000 + 100 * [jumlah pengguna bersamaan] unit permintaan per menit.
Kebanyakan panggilan API hanya mengkonsumsi satu unit permintaan, dengan beberapa pengecualian:
MemoryStoreSortedMap:GetRangeAsync()
Konsumsi unit berdasarkan jumlah item yang dikembalikan.Sebagai contoh, jika metode ini mengembalikan 10 item, panggilan dihitung sebagai 10 unit permintaan.Jika ia mengembalikan respons kosong, ia dihitung sebagai satu unit permintaan.
Mengkonsumsi unit berdasarkan jumlah item yang dikembalikan, seperti MemoryStoreSortedMap:GetRangeAsync() , tetapi mengkonsumsi unit tambahan setiap dua detik saat membaca.Spesifikasikan waktu baca maksimum dengan parameter waitTimeout.
MemoryStoreHashMap:UpdateAsync()
Mengkonsumsi minimal dua unit.
MemoryStoreHashMap:ListItemsAsync()
Mengkonsumsi [jumlah partisi yang dipindai] + [item yang dikembalikan] unit.
Kuota permintaan juga diterapkan pada tingkat pengalaman bukan pada tingkat server.Ini memberikan fleksibilitas untuk mengalokasikan permintaan di antara server selama tingkat permintaan total tidak melebihi kuota.Jika Anda melebihi kuota, Anda menerima respons kesalahan saat layanan membatasi permintaan Anda.
Dengan fitur observabilitas yang tersedia, Anda dapat melihat kuota unit permintaan pengalaman Anda secara real time.
Batas ukuran struktur data
Untuk satu peta atau antrian terurut, batas ukuran dan jumlah item berikut berlaku:
- Jumlah maksimum item: 1.000.000
- Ukuran total maksimum (termasuk kunci untuk peta terurut): 100 MB
Batas per-bagian
Lihat batas per-partisi.
Praktik terbaik
Untuk menjaga pola penggunaan memori Anda optimal dan menghindari mencapai batas , ikuti praktik terbaik berikut:
Hapus item yang diproses.: Secara konsisten membersihkan item baca menggunakan metode MemoryStoreQueue:RemoveAsync() untuk antrian dan MemoryStoreSortedMap:RemoveAsync() untuk peta terurut dapat membebaskan memori dan menjaga struktur data tetap up-to-date.
Tetapkan waktu kedaluwarsa ke frame waktu terkecil yang mungkin saat menambahkan data.: Meskipun waktu kedaluwarsa default adalah 45 hari untuk kedua MemoryStoreQueue:AddAsync() dan MemoryStoreSortedMap:SetAsync(), mengatur waktu paling singkat yang mungkin dapat secara otomatis membersihkan data lama untuk mencegah mereka mengisi kuota penggunaan memori Anda.
- Jangan menyimpan banyak data dengan kedaluwarsa yang lama, karena berisiko melebihi kuota memori Anda dan potensial menyebabkan masalah yang dapat merusak seluruh pengalaman Anda.
- Selalu menghapus secara eksplisit item yang tidak diperlukan atau atur batas waktu item pendek.
- Secara umum, Anda harus menggunakan penghapusan eksplisit untuk melepaskan memori dan kedaluwarsa item sebagai mekanisme keamanan untuk mencegah item yang tidak digunakan menempati memori untuk jangka waktu yang lama.
Hanya menyimpan nilai yang diperlukan di memori.
Sebagai contoh, untuk pengalaman rumah lelang, Anda hanya perlu memelihara tawaran tertinggi.Anda dapat menggunakan MemoryStoreSortedMap:UpdateAsync() pada satu kunci untuk menyimpan tawaran tertinggi daripada menyimpan semua tawaran di struktur data Anda.
Gunakan penurunan eksponensial untuk membantu tetap di bawah batas permintaan API.
Sebagai contoh, jika Anda menerima DataUpdateConflict, Anda mungkin mencoba kembali setelah dua detik, lalu empat, delapan, dll.daripada terus-menerus mengirim permintaan ke MemoryStoreService untuk mendapatkan respons yang benar.
Membagi struktur data raksasa menjadi beberapa yang lebih kecil dengan pemecahan .
Seringkali lebih mudah untuk mengelola data di struktur yang lebih kecil daripada menyimpan semuanya dalam satu struktur data besar.Pendekatan ini juga dapat membantu menghindari batas penggunaan dan tingkat.Sebagai contoh, jika Anda memiliki peta yang disortir yang menggunakan pr prefik untuk kuncinya, pertimbangkan untuk memisahkan setiap pr prefik ke dalam peta terpisah.Untuk pengalaman yang sangat populer, Anda bahkan dapat memisahkan pengguna menjadi beberapa peta berdasarkan digit terakhir dari ID pengguna mereka.
Kompres nilai yang disimpan.
Sebagai contoh, pertimbangkan menggunakan algoritma LZW untuk mengurangi ukuran nilai yang disimpan.
Dapat Diamati
Dashboard Observabilitas memberikan wawasan dan analisis untuk memantau dan memecahkan masalah penggunaan penyimpanan memori Anda.Dengan grafik pembaruan waktu nyata tentang berbagai aspek penggunaan memori dan permintaan API, Anda dapat melacak pola penggunaan memori pengalaman Anda, melihat kuota yang ditugaskan saat ini, memantau status API, dan mengidentifikasi masalah potensial untuk optimisasi kinerja.
Tabel berikut daftar dan menjelaskan semua kode status balasan API yang tersedia di Request Count by Status dan Requests by API x Status bagan.Untuk informasi lebih lanjut tentang cara menyelesaikan kesalahan ini, lihat Memecahkan Masalah.Untuk kuota atau batas tertentu yang terkait dengan kesalahan, lihat Batas dan Kuota.
Kode kode | Deskripsi |
---|---|
Keberhasilan | Berhasil. |
Memori Struktur Data Lebih dari Batas | Melebihi batas ukuran memori struktur data (100MB). |
Konflik DataUpdate | Konflik karena update bersamaan. |
Akses Ditolak | Tidak berwenang untuk mengakses data pengalaman. Permintaan ini tidak mengkonsumsi unit permintaan atau menggunakan kuota. |
Kesalahan internal | Kesalahan internal. |
Permintaan Tidak Valid | Permintaan tidak memiliki informasi yang diperlukan atau memiliki informasi yang tidak valid. |
Item Struktur Data di Atas Batas | Melebihi batas jumlah item struktur data (1M). |
Tidak ada Item Ditemukan | Tidak ada item yang ditemukan di MemoryStoreQueue:ReadAsync() atau MemoryStoreSortedMap:UpdateAsync() . ReadAsync() polling setiap 2 detik dan mengembalikan kode status ini sampai menemukan item di antrian. |
Permintaan Struktur Data di Limitasi | Melebihi batas permintaan tingkat struktur data (100.000 permintaan per menit). |
Permintaan Pembagian Lebih dari Batas | Melebihi batas permintaan unit pembagian. |
Permintaan Total Lebih dari Batas | Melebihi batas unit permintaan tingkat alam semesta. |
TotalMemori Lebih Batas | Melebihi kuota memori tingkat alam semesta. |
ItemValueSizeTerlalu Besar | Ukuran nilai melebihi batas (32KB). |
Tabel berikut daftar kode negara dari sisi klien, yang saat ini tidak tersedia di Dashboard Observabilitas.
Kode kode | Deskripsi |
---|---|
Kesalahan internal | Kesalahan internal. |
Tempat Tidak Dipublikasikan | Anda harus mempublikasikan tempat ini untuk menggunakan MemoryStoreService. |
Akses Klien Tidak Valid | Layanan Penyimpanan Memori harus dipanggil dari server. |
Waktu Kedaluwarsa Tidak Valid | Waktu bidang 'kadaluarsa' harus berada di antara 0 dan 3,888,000. |
Permintaan Tidak Valid | Tak dapat mengkonversi nilai ke json. |
Permintaan Tidak Valid | Tak dapat mengonversi sortKey ke angka atau string yang valid. |
Transformasi Callback Gagal | Gagal memanggil fungsi panggilan transformasi. |
Permintaan Dibatasi | Permintaan Memori Terbaru terkena satu atau lebih batas. |
Konflik Pembaruan | Melebihi batas maksimum jumlah percobaan ulang. |
Pemecahan Masalah
Tabel berikut daftar dan menjelaskan solusi yang direkomendasikan untuk setiap kode status balasan:
Kesalahan | Opsi pemecahan masalah |
---|---|
Permintaan Struktur Data Terlampau Batas / Permintaan Partisi Terlampau Batas |
|
Permintaan Total Lebih dari Batas | |
Item Struktur Data di Atas Batas |
|
Memori Struktur Data Lebih dari Batas | |
TotalMemori Lebih Batas | |
Konflik DataUpdate |
Selidiki untuk melihat apakah Anda memanggil MemoryStoreService secara efisien untuk menghindari konflik.Idealnya, Anda tidak harus mengirim terlalu banyak permintaan.: Hapus item secara konsisten setelah dibaca menggunakan metode MemoryStoreQueue:RemoveAsync() untuk antrian dan MemoryStoreSortedMap:RemoveAsync() untuk peta yang disortir. |
Kesalahan internal |
|
Permintaan Tidak Valid |
|
ItemValueSizeTerlalu Besar |
|
Tes dan debug di Studio
Data di MemoryStoreService diisolasi antara Studio dan produksi, jadi mengubah data di Studio tidak memengaruhi perilaku produksi.Ini berarti bahwa panggilan API Anda dari Studio tidak mengakses data produksi, memungkinkan Anda untuk menguji penyimpanan memori dan fitur baru dengan aman sebelum masuk ke produksi.
Pengujian studio memiliki batas dan kuota yang sama seperti produksi.Untuk kuota yang dihitung berdasarkan jumlah pengguna, kuota yang dihasilkan bisa sangat kecil karena Anda adalah satu-satunya pengguna untuk pengujian Studio.Saat menguji dari Studio, Anda juga mungkin memperhatikan latensi sedikit lebih tinggi dan tingkat kesalahan yang lebih tinggi dibandingkan dengan penggunaan di produksi karena beberapa pemeriksaan tambahan yang dilakukan untuk memverifikasi akses dan izin.
Untuk informasi tentang cara mem debug penyimpanan memori pada pengalaman langsung atau saat menguji di studio, gunakan Konsol Pengembang.