MemoryStoreService jest usługą danych o dużej przepustowości i niskim opóźnieniu, która zapewnia szybkie przechowywanie danych w pamięci dostępne z wszystkich serwerów w sesji na żywo. Magazyny pamięci są odpowiednie do częstych i ulotnych danych, które szybko się zmieniają i nie muszą być trwałe, ponieważ są szybsze do uzyskania i znikają, gdy osiągną maksymalny czas życia.Dla danych, które muszą istnieć między sesjami, użyj przechowywanie danych.
Struktury danych
Zamiast bezpośrednio uzyskiwać surowe dane, pamięci masowe mają trzy prostsze struktury danych udostępniane między serwerami do szybkiego przetwarzania: sortowana mapa, kolejka i mapa haszu.Każda struktura danych jest dobrym dopasowaniem do pewnych przypadków użytkowania:
- Matchmaking oparty na umiejętnościach - Zapisz informacje o użytkowniku, takie jak poziom umiejętności, w wspólnej kolejce między serwerami i użyj serwerów lobby do okresowego przeprowadzania meczów.
- Wymiana i licytacja międzyserwerowa - Włącz uniwersalną wymianę między różnymi serwerami, w której użytkownicy mogą licytować przedmioty z cenami zmieniającymi się w czasie rzeczywistym, z sortowaną mapą pary klucz-wartość.
- Globalne tabelki liderów - Przechowywanie i aktualizowanie rankingów użytkowników na wspólnej tabeli liderów w ramach sortowanej mapy .
- Wspólne zapasy - zapisz przedmioty zapasu i statystyki w wspólnej mapie haszu , gdzie użytkownicy mogą korzystać z przedmiotów zapasu jednocześnie z innymi.
- Pamięć podręczna dla trwałych danych - Synchronizuj i kopiuj swoje trwałe dane w magazynie danych do pamięci podręcznej, która może działać jako pamięć podręczna i poprawić wykonywaniedoświadczenia.
ogólnerzecz biorąc, jeśli musisz uzyskać dostęp do danych w oparciu o określony klucz, użyj mapy haszu.Jeśli potrzebujesz, aby dane zostały zamówione, użyj sortowanej mapy.Jeśli musisz przetwarzać dane w określonej kolejności, użyj kolejki.
Ograniczenia i kwoty
Aby zachować skalowalność i wykonywaniesystemu, magazyny pamięci mają limity zużycia danych dla rozmiaru pamięci, żądań API i rozmiaru struktury danych.
Magazyny pamięci mają politykę eksmisji opartą na czasie wygaśnięcia, znany również jako czas na życie (TTL).Przedmioty są wypierane po wygaśnięciu i zostaje uwolniona kwota pamięci na nowe wpisy.Gdy osiągniesz limit pamięci, wszystkie kolejne prośby o zapisanie nie powiodą się, dopóki przedmioty nie wygasną lub nie usuniesz ich ręcznie.
Kwota rozmiaru pamięci
Kwota pamięci ogranicza całkowitą ilość pamięci, którą doświadczenie może zużywać.Nie jest to stała wartość.Zamiast tego zmienia się z czasem w zależności od liczby użytkowników w doświadczeniu zgodnie z następną formułą: 64KB + 1KB * [liczba użytkowników] .Kwota obowiązuje na poziomie doświadczenia zamiast na poziomie serwera.
Gdy użytkownicy dołączą do doświadczenia, dodatkowa kwota pamięci jest dostępna natychmiast.Kiedy użytkownicy opuszczają doświadczenie, kwota nie zmniejsza się natychmiast.Istnieje okres śledzenia przez osiem dni przed ponowną oceną kwoty do niższej wartości.
Po tym, jak twoje doświadczenie osiągnie limit rozmiaru pamięci, wszystkie prośby API, które zwiększają rozmiar pamięci, zawsze zawodzą.Żądania, które zmniejszają lub nie zmieniają rozmiaru pamięci, nadal powodują sukces.
Dzięki pulpitowi nawigacyjnemu obserwowalności, możesz wyświetlać rozmiar kwoty pamięci swojego doświadczenia w czasie rzeczywistym za pomocą wykresu użycia pamięci .
Ograniczenia żądań API
W przypadku ograniczeń wniosków API istnieje żądanie jednostki wniosku na wszystkie wezwania API MemoryStoreService.Kwota to 1000 + 100 * [liczba jednoczesnych użytkowników] jednostek żądań na minutę.
Większość wezwań API zużywa tylko jedną jednostkę żądania, z kilkoma wyjątkami:
MemoryStoreSortedMap:GetRangeAsync()
Konsumuje jednostki w oparciu o liczbę zwróconych przedmiotów.Na przykład, jeśli ta metoda zwraca 10 przedmiotów, wezwanie liczy się jako 10 jednostek żądań.Jeśli zwraca pustą odpowiedź, liczy się jako jednostka żądania.
Konsumuje jednostki w oparciu o liczbę zwróconych przedmiotów, tak jak MemoryStoreSortedMap:GetRangeAsync(), ale zużywa dodatkową jednostkę co 2 sekundy podczas czytania.Określ maksymalny czas odczytu za pomocą parametru waitTimeout.
MemoryStoreHashMap:UpdateAsync()
Wykorzystuje minimalnie dwie jednostki.
MemoryStoreHashMap:ListItemsAsync()
Zużywa [number of partitions scanned] + [items returned] jednostek.
Limit żądań jest również stosowany na poziomie doświadczenia zamiast na poziomie serwera.Zapewnia to elastyczność przypisywania żądań między serwerami tak długo, jak łączna szybkość żądań nie przekracza limitu.Jeśli przekroczysz limit, otrzymasz odpowiedź o błędzie, gdy usługa ogranicza żądania.
Mając dostępną funkcję obserwowalności, możesz wyświetlać kwotę żądań jednostki z doświadczenia w czasie rzeczywistym.
Ograniczenia rozmiaru struktury danych
Dla pojedynczej sortowanej mapy lub kolejki zastosowane są następujące limity rozmiaru i liczby przedmiotów:
- Maksymalna liczba przedmiotów: 1,000,000
- Maksymalny rozmiar całkowity (w tym klucze do sortowanej mapy): 100 MB
Ograniczenia na poziomie partycji
Zobacz limity na poziomie partycji.
Najlepsze praktyki
Aby zachować wzór zużycia pamięci optymalny i uniknąć przekroczenia ograniczeń, postępuj zgodnie z tymi najlepszymi praktykami:
Usuń przetworzone przedmioty.: Konsystentnie sprzątaj przedmioty przeczytane za pomocą metody MemoryStoreQueue:RemoveAsync() dla kolejek i MemoryStoreSortedMap:RemoveAsync() dla uporządkowanych map może uwolnić pamięć i utrzymać strukturę danych na bieżąco.
Ustaw czas ważności na najmniejszy możliwy okres czasu przy dodawaniu danych.: Chociaż domyślny czas wygaśnięcia wynosi 45 dni dla obu MemoryStoreQueue:AddAsync() i MemoryStoreSortedMap:SetAsync(), ustawienie najkrótszego możliwego czasu może automatycznie wyczyścić stare dane, aby zapobiec ich wypełnieniu kwerendą pamięci.
- Nie przechowuj dużej ilości danych z długim wygaśnięciem, ponieważ ryzykuje przekroczenie limitu pamięci i może potencjalnie powodować problemy, które mogą zniszczyć całe twoje doświadczenie.
- Zawsze wyraźnie usuń niepotrzebne przedmioty lub ustaw krótkie wygaśnięcie przedmiotu.
- Zasadniczo powinieneś używać wyraźnego usuwania do uwalniania pamięci i wygaśania przedmiotów jako mechanizm bezpieczeństwa, aby zapobiec wykorzystywaniu nieużywanych przedmiotów do zajmowania pamięci przez długi okres czasu.
Zachowaj tylko niezbędne wartości w pamięci.
Na przykład, dla doświadczenia domu aukcyjnego, musisz tylko utrzymać najwyższą ofertę.Możesz użyć MemoryStoreSortedMap:UpdateAsync() na jednym kluczu, aby zachować najwyższą ofertę, zamiast trzymać wszystkie oferty w swojej strukturze danych.
Użyj ekspresyjnego odrzucenia, aby pomóc utrzymać się poniżej limitów żądań API.
Na przykład, jeśli otrzymasz DataUpdateConflict, możesz spróbować ponownie po dwóch sekundach, a następnie po czterech, ośmiu itd.zamiast stale wysyłać żądania do MemoryStoreService w celu uzyskania poprawnej odpowiedzi.
Rozdziel gigantyczne struktury danych na wiele mniejszych poprzez rozbicie.
Często łatwiej jest zarządzać danymi w mniejszych strukturach niż przechowywać wszystko w jednej dużej strukturze danych.Ta metoda może również pomóc uniknąć ograniczeń zużycia i stawki.Na przykład, jeśli masz uporządkowaną mapę, która używa prefiksów dla swoich kluczy, rozważ oddzielenie każdego prefiksu w osobną uporządkowaną mapę.Dla szczególnie popularnego doświadczenia możesz nawet rozdzielić użytkowników na wiele map w oparciu o ostatnie cyfry ich identyfikatorów użytkowników.
Zmniejsz przechowywane wartości.
Na przykład, rozważ użycie algorytmu LZW do zmniejszenia rozmiaru przechowywanej wartości.
Obserwowalność
Pulpit nawigacyjny Obserwowalność zapewnia wgląd i analizę danych na temat monitorowania i rozwiązywania problemów z użyciem przechowywania pamięci.Dzięki aktualizowaniu wykresów w czasie rzeczywistym w odniesieniu do różnych aspektów zużycia pamięci i żądań API możesz śledzić wzór zużycia pamięci swojego doświadczenia, wyświetlać obecnie przydzielone kwoty, monitorować statusAPI i identyfikować potencjalne problemy związane z optymalizacją wydajności.
Poniższa tabela wymienia i opisuje wszystkie kody stanu odpowiedzi API dostępne na wykresach Liczba żądań według stanu i Żądania API x Status w panelu obserwowalności.Aby uzyskać więcej informacji o tym, jak rozwiązać te błędy, zobacz Rozwiązywanie problemów.Dla konkretnej kwoty lub ograniczenia, do którego odnosi się błąd, zobacz Ograniczenia i kwoty.
Kod kod | Opis |
---|---|
Pomyślny | Sukces. |
Pamięć struktury danych ponad limit | Przekracza limit rozmiaru pamięci struktury danych (100MB). |
Dane aktualizuj konflikt | Konflikt z powodu jednoczesnej aktualizacja. |
Dostęp odmowny | Nieautoryzowano dostępu do danych doświadczenia. Ta prośba nie zużywa jednostek żądań ani nie wykorzystuje kwoty. |
Błąd internałowy | Wewnętrzny błąd. |
Nieważne żądanie | Żądanie nie ma wymaganych informacji lub zawiera nieprawidłowe informacje. |
Przedmioty struktury danych ponad limit | Przekracza limit liczby poziomów struktury danych (1M). |
Nie znaleziono przedmiotu | Nie znaleziono żadnego elementu w MemoryStoreQueue:ReadAsync() lub MemoryStoreSortedMap:UpdateAsync(). ReadAsync() przeprowadza ankiety co 2 sekundy i zwraca ten kod stanu, dopóki nie znajdzie elementów w kolejce. |
Wnioski o strukturę danych ponad limit | Przekracza poziom wymagania struktury danych (100 000 jednostek żądań na minutę). |
Żądania rozdziału ponad limit | Przekracza limit żądania podziału. |
Całkowite żądania ponad limit | Przekracza limit jednostki żądania na poziomie wszechświata. |
Całkowita pamięć ponad limit | Przekracza poziom pamięci na poziomie wszechświata. |
Wartość ItemValueSize zbyt duża | Rozmiar wartości przekracza limit (32KB). |
Poniższa tabela wymienia kody stanów z strony klienta, które obecnie nie są dostępne na tablicy obserwowalności.
Kod kod | Opis |
---|---|
Błąd internałowy | Wewnętrzny błąd. |
Nieopublikowany miejsce | Musisz opublikować to miejsce, aby korzystać z MemoryStoreService. |
Nieprawidłowy dostęp klienta | Usługa MemoryStoreService musi być wywołana z serwera. |
Nieważny czas wygaśnięcia | Czas pola "wygaśnięcie" musi wynosić od 0 do 3,888,000. |
Nieważne żądanie | Nie można przekonwertować wartości na json. |
Nieważne żądanie | Nie można przekonwertować sortKey na ważną liczbę lub ciąg znaków. |
TransformCallback nie powiodło się | Nie udało się wywołać funkcji powrotu transformacji. |
Żądanie ograniczone | Ostatnie prośby o przechowywanie pamięci dotknęły jedną lub więcej ograniczeń. |
Aktualizacja konfliktu | Przekroczono maksymalną liczbę prób. |
Rozwiązywanie problemów
Poniższa tabela wymienia i opisuje zalecane rozwiązanie dla każdego kodu statusu odpowiedzi:
Błąd | Opcje rozwiązywania problemów |
---|---|
DataStructureRequestsOverLimit / PartitionRequestsOverLimit |
|
Całkowite żądania ponad limit | |
Przedmioty struktury danych ponad limit |
|
Pamięć struktury danych ponad limit | |
Całkowita pamięć ponad limit | |
Dane aktualizuj konflikt |
Zbadaj, czy wzywasz MemoryStoreService efektywnie, aby uniknąć konfliktów.Idealnie, nie powinieneś przesyłać zbyt wielu żądań.: Konsystentnie usuwaj elementy po ich przeczytaniu za pomocą metody MemoryStoreQueue:RemoveAsync() dla kolejek i MemoryStoreSortedMap:RemoveAsync() dla sortowanych map. |
Wewnętrzny błąd |
|
Nieważne żądanie |
|
Wartość ItemValueSize zbyt duża |
|
Testuj i debuguj w Studio
Dane w MemoryStoreService są odizolowane między Studio a produkcją, więc zmiana danych w Studio nie wpływa na zachowanie produkcji.Oznacza to, że wezwania API ze Studio nie mają dostępu do danych produkcyjnych, co pozwala bezpiecznie testować magazyny pamięci i nowe funkcje przed przejściem do produkcji.
Testowanie w studiu ma te same ograniczenia i kwoty niż produkcja.Dla limitów obliczanych na podstawie liczby użytkowników wynikowy limit może być bardzo niewielki, ponieważ jesteś jedynym użytkownikiem do testowania Studio.Podczas testowania z Studio możesz również zauważyć nieco wyższą opóźnienie i podwyższoną liczbę błędów w porównaniu do użytku w produkcji ze względu na niektóre dodatkowe kontrolki wykonywane w celu weryfikacji dostępu i uprawnień.
Aby uzyskać informacje o tym, jak debugować przechowywanie pamięci na żywych doświadczeniach lub podczas testowania w studio, użyj Konsoli programisty.