Sprawdzone metody dotyczące Cloud Firestore

Skorzystaj z opisanych tu sprawdzonych metod podczas tworzenia aplikacji korzystającej z Cloud Firestore.

Lokalizacja bazy danych

Podczas tworzenia instancji bazy danych wybierz bazę danych lokalizacji znajdującej się najbliżej użytkowników i zasobów obliczeniowych. Duże przeskoki sieciowe są bardziej podatne na błędy i zwiększają czas oczekiwania na odpowiedź.

Aby zmaksymalizować dostępność i trwałość swojej aplikacji, wybierz lokalizację obejmującą wiele regionów, umieść kluczowe zasoby obliczeniowe w co najmniej 2 regionach.

Wybierz lokalizację regionalną, aby obniżyć koszty i obniżyć koszty zapisu jeśli aplikacja jest wrażliwa na czas oczekiwania; w celu współlokalizacji z innymi zasobami GCP.

Identyfikatory dokumentów

  • Unikaj stosowania dokumentów o identyfikatorach . i ...
  • Unikaj używania ukośników / w identyfikatorach dokumentów.
  • Nie używaj monotonicznie rosnących identyfikatorów dokumentów, takich jak:

    • Customer1, Customer2, Customer3, ...
    • Product 1, Product 2, Product 3, ...

    Takie sekwencyjne identyfikatory mogą powodować występowanie hotspotów, które skracają czas oczekiwania.

Nazwy pól

  • Unikaj tych znaków w nazwach pól, ponieważ wymagają one dodatkowych ucieczki:

    • . okres
    • [ otwierający nawias
    • ] zamykający nawias
    • Gwiazdka: *
    • Grawis `

Indeksy

Zmniejsz opóźnienia zapisu

Głównym czynnikiem wpływającym na opóźnienia zapisu jest zwielokrotnienie indeksu. Sprawdzone metody Zmniejszenie zwielokrotnienia indeksu to:

  • Ustaw wykluczeniami z indeksu na poziomie kolekcji. Łatwym ustawieniem domyślnym jest wyłączenie Malejąco i Indeksowanie tablic. Usunięcie nieużywanych wartości zindeksowanych, obniży też koszty miejsca na dane.

  • Zmniejsz liczbę dokumentów w transakcji. Do pisania dużej liczby dokumentów, rozważ użycie narzędzia do zbiorczego zapisywania, a nie pojedynczego wsadu. pisarza.

Zwolnienia z indeksu

W przypadku większości aplikacji możesz polegać na automatycznym indeksowaniu oraz komunikatach o błędach aby zarządzać indeksami. Warto jednak dodać wykluczenia z jednego pola, w następujących przypadkach:

Zgłoszenie Opis
Duże pola ciągów

Jeśli masz pole z ciągami znaków, które często zawierają wartości długich ciągów, nie używasz do wysyłania zapytań, możesz obniżyć koszty przechowywania, wykluczając to pole przed indeksowaniem.

Duża szybkość zapisu w kolekcji zawierającej dokumenty z wartościami sekwencyjnymi

Jeśli indeksujesz pole, które rośnie lub maleje kolejno między dokumentów w kolekcji, takich jak sygnatura czasowa, a potem maksymalna szybkość zapisu to 500 zapisów na sekundę. Jeśli nie wysyłasz zapytania na podstawie pola z wartościami sekwencyjnymi, możesz je wykluczyć przed indeksowaniem, aby ominąć ten limit.

Na przykład w przypadku użycia IoT z dużą częstotliwością zapisu kolekcja zawierająca dokumenty z polem sygnatury czasowej może zbliżyć się do limitu 500 zapisów na sekundę.

Pola TTL

Jeśli używasz zasad (TTL), pamiętaj, że wartość TTL musi zawierać sygnaturę czasową. Indeksowanie po polach TTL jest domyślnie włączone i może które wpływają na skuteczność kampanii. Zalecamy dodanie wykluczenia pojedynczego pola dla pól TTL.

Duże pola tablicowe lub mapowania

Duże pola tablic lub mapy mogą zbliżać się do limitu 40 000 wpisów indeksu na dokument. Jeśli nie wysyłasz zapytań na podstawie dużej tablicy lub pola mapy, wyklucz je z indeksowania.

Operacje odczytu i zapisu

  • Dokładna maksymalna częstotliwość, z jaką aplikacja może aktualizować pojedynczy dokument, zależy w dużym stopniu od obciążenia. Aby dowiedzieć się więcej, Więcej informacji: Aktualizacje pojedynczego dokumentu.

  • Zamiast wywołań synchronicznych używaj wywołań asynchronicznych, gdy są dostępne. Wywołania asynchroniczne minimalizują wpływ opóźnień. Weźmy na przykład aplikację który wymaga wyników wyszukiwania dokumentu i wyników zapytania przed podczas renderowania odpowiedzi. Jeśli wyszukiwanie i zapytanie nie mają zależności danych, nie ma potrzeby synchronicznego oczekiwania na zakończenie wyszukiwania przed i zainicjowanie zapytania.

  • Nie używaj odsunięć. Zamiast tego użyj kursorów. Użycie przesunięcia pozwala tylko uniknąć zwracają pominięte dokumenty do aplikacji, ale są one wciąż pobierane wewnętrznie. Pominięte dokumenty wpływają na czas oczekiwania i za nią płacisz za operacje odczytu wymagane do je pobrać.

Ponowne próby transakcji

Pakiety SDK i klient Cloud Firestore biblioteki nie udało się automatycznie ponawiać w celu radzenia sobie z błędami przejściowymi. Jeśli aplikacja uzyskuje dostęp Metoda przetwarzania danych w Cloud Firestore REST lub Bezpośrednie interfejsy API RPC zamiast za pomocą pakietu SDK, powinna zaimplementować ponowienia transakcji, aby zwiększyć niezawodność.

Aktualizacje w czasie rzeczywistym

Sprawdzone metody związane z aktualizacjami w czasie rzeczywistym: Analizuj zapytania w czasie rzeczywistym na dużą skalę.

Projektowanie z myślą o skali

Poniżej znajdziesz sprawdzone metody, jak uniknąć sytuacji, w których powodują spory.

Aktualizacje pojedynczego dokumentu

Podczas projektowania aplikacji weź pod uwagę to, jak szybko aktualizuje ona pojedyncze dokumenty. Najlepszym sposobem scharakteryzowania wydajności zadania jest wykonanie obciążenia i testowania. Dokładna maksymalna częstotliwość, z jaką aplikacja może aktualizować pojedynczy dokument w dużej mierze zależy od obciążenia. Czynniki obejmują szybkość zapisu, rywalizację między żądaniami i liczbę indeksów, których dotyczy problem.

Operacja zapisu dokumentu aktualizuje dokument i wszystkie powiązane indeksy, a Cloud Firestore synchronicznie stosuje operację zapisu w całej aby uzyskać kworum replik. Przy odpowiednio wysokiej szybkości zapisu baza danych zacznie wystąpienia rywalizacji, większych opóźnień lub innych błędów.

Wysoka szybkość odczytu, zapisu i usuwania dokumentów obejmująca wąski zakres dokumentów

Staraj się unikać wysokich szybkości odczytu i zapisu w przypadku zamykania dokumentów pod względem leksykografii. w aplikacji wystąpią błędy rywalizacji. Ten problem jest znany jako może on działać w połączeniu z hotspotem, jeśli: następujące:

  • Tworzy nowe dokumenty z bardzo dużą częstotliwością i przydziela własne monotonicznie rosnące identyfikatory.

    Cloud Firestore przydziela identyfikatory dokumentów za pomocą algorytmu punktowego. Ty nie powinny wystąpić hotspoty przy zapisach, jeśli tworzysz nowe dokumenty za pomocą automatycznych identyfikatorów dokumentów.

  • Szybko tworzy nowe dokumenty w kolekcji z niewielką liczbą dokumentów.

  • Tworzy nowe dokumenty z monotonicznie rosnącym polem, takim jak z bardzo dużą częstotliwością.

  • Usuwa dokumenty z kolekcji z dużą częstotliwością.

  • Zapisuje dane do bazy danych z bardzo dużą szybkością bez stopniowego zwiększania ruchu.

Unikaj pomijania usuniętych danych

Unikaj zapytań, które pomijają niedawno usunięte dane. Zapytanie może zostać pominięte nad dużą liczbą wpisów indeksu, jeśli pierwsze wyniki zapytania zostały niedawno zostały usunięte.

Przykład zadania, które może wymagać pominięcia dużej ilości usuniętych danych, to: która próbuje znaleźć najstarsze elementy robocze w kolejce. Zapytanie może wyglądać tak:

docs = db.collection('WorkItems').order_by('created').limit(100)
delete_batch = db.batch()
for doc in docs.stream():
  finish_work(doc)
  delete_batch.delete(doc.reference)
delete_batch.commit()

Przy każdym uruchomieniu to zapytanie skanuje wpisy indeksu dotyczące created we wszystkich niedawno usuniętych dokumentach. Spowalnia to zapytania.

Aby zwiększyć skuteczność, użyj metody start_at, by znaleźć od miejsca, w którym warto zacząć. Przykład:

completed_items = db.collection('CompletionStats').document('all stats').get()
docs = db.collection('WorkItems').start_at(
    {'created': completed_items.get('last_completed')}).order_by(
        'created').limit(100)
delete_batch = db.batch()
last_completed = None
for doc in docs.stream():
  finish_work(doc)
  delete_batch.delete(doc.reference)
  last_completed = doc.get('created')

if last_completed:
  delete_batch.update(completed_items.reference,
                      {'last_completed': last_completed})
  delete_batch.commit()

UWAGA: w przykładzie powyżej użyto monotonicznie rosnącego pola, które stanowi antywzorzec zapewniający dużą częstotliwość zapisu.

Zwiększanie natężenia ruchu

Stopniowo zwiększaj ruch do nowych kolekcji lub leksykograficznie zamknij dokumenty, aby dać Cloud Firestore wystarczająco dużo czasu na przygotowanie dokumentów w celu zwiększenia ruchu. Zalecamy, aby zacząć od maksymalnie 500 operacji na sekundę do nowej kolekcji, a następnie zwiększyć ruch o 50% co 5 minut. W podobny sposób możesz zwiększyć ruch związany z pisaniem, ale pamiętaj, standardowe limity Cloud Firestore. Upewnij się, aby operacje były stosunkowo równomiernie rozkładane w całym zakresie kluczy. Ten to tzw. „500/50/5”, .

Przenoszenie ruchu do nowej kolekcji

Stopniowe zwiększanie jest szczególnie ważne, jeśli przenosisz ruch z aplikacji z jednej do innej kolekcji. Prostym sposobem obsługi tej migracji jest odczyt z ze starej kolekcji, a jeśli dokument nie istnieje, należy odczytać go z nowej kolekcji. Może to jednak spowodować nagły wzrost natężenia ruchu w leksykograficznie zamknij dokumenty w nowej kolekcji. Cloud Firestore mogą mieć problemy z przygotowaniem nowej kolekcji do zwiększonego ruchu, zwłaszcza gdy jest ich niewiele.

Podobny problem może wystąpić, jeśli zmienisz identyfikatory wielu dokumentów. w ramach tej samej kolekcji.

Najlepsza strategia przenoszenia ruchu do nowej kolekcji zależy od Twoich danych model. Poniżej znajduje się przykładowa strategia nazywana odczytami równoległymi. Wykonaj czy ta strategia jest skuteczna w przypadku Twoich danych oraz będzie ważny wpływ na koszty operacji równoległych migrację.

Odczyty równoległe

Aby wdrożyć równoległe odczyty podczas migracji ruchu do nowej kolekcji, przeczytaj ze starej kolekcji. Jeśli brakuje dokumentu, przeczytaj go na stronie Nowa kolekcja. Duża liczba odczytów nieistniejących dokumentów może prowadzić do podczas korzystania z hotspotu. Pamiętaj, by stopniowo zwiększać obciążenie kolekcji. Lepszą strategią jest skopiowanie starego dokumentu do nowej kolekcji a następnie usuń stary dokument. Stopniowo zwiększaj tempo odczytów równoległych, aby mieć pewność, Cloud Firestore może obsłużyć ruch do nowej kolekcji.

Możliwa strategia stopniowego zwiększania liczby odczytów lub zapisów w nowej kolekcji jest użycie deterministycznego hasza identyfikatora użytkownika do wyboru losowego odsetka którzy próbują tworzyć nowe dokumenty. Upewnij się, że wynik użytkownika Hasz identyfikatora nie jest zniekształcony przez funkcję ani przez zachowanie użytkownika.

Tymczasem uruchom zadanie wsadowe, które skopiuje wszystkie dane ze starych dokumentów do do nowej kolekcji. Zadanie wsadowe powinno unikać zapisów w dokumentach sekwencyjnych identyfikatory, aby zapobiec tworzeniu hotspotów. Po zakończeniu zadania wsadowego będziesz mieć dostęp tylko do odczytu z nowej kolekcji.

Ulepszeniem tej strategii jest migracja niewielkich grup użytkowników naraz. Dodaj do dokumentu użytkownika pole, które będzie śledzić stan migracji danego użytkownika. Wybierz grupę użytkowników do migracji, używając skrótu identyfikatora użytkownika. Używaj zadania wsadowego do migracji dokumentów tej grupy użytkowników, równoległe odczyty dla użytkowników w w trakcie migracji.

Pamiętaj, że nie można łatwo wycofać zmiany, dopóki nie wykonasz podwójnego zapisu i nowych elementów. Zwiększyłoby to Poniesione koszty Cloud Firestore.

Prywatność

  • Unikaj przechowywania informacji poufnych w identyfikatorze projektu Cloud. Identyfikator projektu Cloud mogą być przechowywane przez cały okres realizacji projektu.
  • Zgodnie ze sprawdzoną metodą zachowania zgodności z danymi odradzamy przechowywanie poufnych danych informacje w nazwach dokumentów i nazwach pól dokumentów.

Zapobieganie nieautoryzowanemu dostępowi

Zapobiegaj nieautoryzowanym działaniom w bazie danych za pomocą Reguły zabezpieczeń Cloud Firestore. Stosując reguły, można na przykład uniknąć sytuacji, w której użytkownik wielokrotnie pobiera całą bazę danych.

Dowiedz się więcej o używaniu reguł zabezpieczeń Cloud Firestore.