Sprawdzone metody dotyczące Cloud Firestore

Podczas tworzenia aplikacji korzystającej z funkcji Cloud Firestore możesz skorzystać z wymienionych tutaj sprawdzonych metod.

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ść aplikacji, wybierz lokalizację w wielu regionach i umieść kluczowe zasoby obliczeniowe w co najmniej 2 regionach.

Wybierz lokalizację regionalną, aby obniżyć koszty, skrócić opóźnienia zapisu (jeśli Twoja aplikacja jest wrażliwa na opóźnienia) lub kolokować zasoby w tym samym regionie z innymi zasobami GCP.

Identyfikatory dokumentów

  • Unikaj stosowania dokumentów o identyfikatorach . i ...
  • Unikaj stosowania / ukośnych nawiasów wstecznych 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 identyfikatory sekwencyjne mogą prowadzić do punktów krytycznych, które wpływają na opóźnienia.

Nazwy pól

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

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

Indeksy

Zmniejsz opóźnienia zapisu

Głównym czynnikiem wpływającym na opóźnienie zapisu jest rozgałęzienie indeksu. Sprawdzone metody zmniejszania rozgałęzienia indeksu:

  • Ustaw wykluczenia indeksu na poziomie kolekcji. Łatwym ustawieniem domyślnym jest wyłączenie Malejąco i Indeksowanie tablic. Usunięcie nieużywanych wartości indeksowanych pozwoli też obniżyć koszty przechowywania.

  • Zmniejsz liczbę dokumentów w transakcji. W przypadku zapisywania dużej liczby dokumentów rozważ użycie zbiorczego narzędzia do zapisywania zamiast atomistycznego narzędzia do zapisywania wsadów.

Zwolnienia z indeksu

W przypadku większości aplikacji możesz polegać na automatycznym indeksowaniu oraz linkach w wiadomościach 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ągu znaków

Jeśli masz pole ciągu znaków, które często zawiera długie ciągi znaków, których nie używasz do wykonywania zapytań, możesz obniżyć koszty przechowywania, wykluczając to pole z indeksowania.

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

Jeśli indeksujesz pole, które wzrasta lub maleje sekwencyjnie między dokumentami w kolekcji, np. sygnaturę czasową, maksymalna szybkość zapisu do kolekcji wynosi 500 operacji na sekundę. Jeśli nie wysyłasz zapytań na podstawie pola o wartościach sekwencyjnych, możesz wyłączyć indeksowanie tego pola, 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 dotyczących czasu życia danych (TTL), pamiętaj, że pole 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 tablice lub pola 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 szybkość, z jaką aplikacja może aktualizować pojedynczy dokument, zależy w dużym stopniu od obciążenia. Więcej informacji znajdziesz w artykule Aktualizacje pojedynczego dokumentu.

  • W miarę możliwości używaj wywołań asynchronicznych zamiast synchronicznych. 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 przesunięć. 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. Pomijane dokumenty wpływają na opóźnienie zapytania, a Twoja aplikacja jest obciążana za operacje odczytu wymagane do ich pobrania.

Powtórzenia 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 Cloud Firestore przez 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ższe sprawdzone metody opisują, jak unikać sytuacji, które mogą powodować problemy z konfliktami.

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 te to m.in. szybkość zapisu, współzawodnictwo między żądaniami i liczba indeksów, których dotyczy problem.

Operacja zapisu dokumentu aktualizuje dokument i wszystkie powiązane indeksy, i Cloud Firestore synchronicznie stosują operację zapisu w aby uzyskać kworum replik. Przy wystarczająco wysokich szybkościach zapisu baza danych zacznie napotykać na konflikty, zwiększone opóźnienia lub inne błędy.

wysokie wskaźniki odczytu, zapisu i usuwania w wąskim zakresie 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 przypisuje własne monotonicznie rosnące identyfikatory.

    Funkcja Cloud Firestore przydziela identyfikatory dokumentów za pomocą algorytmu punktowego. Jeśli tworzysz nowe dokumenty za pomocą automatycznych identyfikatorów dokumentów, nie powinno dojść do zjawiska hotspottingu podczas zapisywania.

  • Tworzy nowe dokumenty z dużą częstotliwością 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ą.

  • Zapisywanie danych w bazie danych z bardzo dużą częstotliwością bez stopniowego zwiększania natężenia 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()

Za każdym razem, gdy to zapytanie jest wykonywane, skanuje ono wpisy indeksu w polu created w przypadku ostatnio usuniętych dokumentów. Spowalnia to zapytania.

Aby zwiększyć skuteczność, użyj metody start_at, aby znaleźć najlepsze miejsce na rozpoczęcie. 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ć aplikacji 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, Limity standardowe 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 Firestoremoże nie być w stanie efektywnie przygotować nowej kolekcji na zwiększony ruch, zwłaszcza jeśli zawiera ona niewiele dokumentów.

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

Najlepsza strategia migracji ruchu do nowej kolekcji zależy od modelu danych. Poniżej przedstawiamy przykładową strategię, która nosi nazwę czytanie równoległe. Musisz określić, czy ta strategia jest skuteczna w przypadku Twoich danych. Ważnym czynnikiem jest wpływ kosztów operacji równoległych na migrację.

Czytanie równoległe

Aby zastosować równoległe odczyty podczas przenoszenia ruchu do nowej kolekcji, najpierw odczytaj dane 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 potem usunięcie starego dokumentu. stopniowo zwiększać liczbę równoczesnych odczytów, aby mieć pewność, że Cloud Firestore będzie w stanie obsłużyć ruch kierowany do nowej kolekcji.

Możliwą strategią stopniowego zwiększania liczby odczytów lub zapisów w nowej kolekcji jest użycie deterministycznego hasha identyfikatora użytkownika w celu wybrania losowego odsetka użytkowników próbujących zapisać nowe dokumenty. Upewnij się, że wynik użytkownika Hasz identyfikatora nie jest zniekształcony przez funkcję ani przez zachowanie użytkownika.

W międzyczasie uruchom zadanie zbiorcze, które skopiuje wszystkie dane ze starych dokumentów do nowej kolekcji. Zadanie wsadowe powinno unikać zapisów w dokumentach sekwencyjnych identyfikatory, aby zapobiec tworzeniu hotspotów. Po zakończeniu zadania zbiorczego możesz odczytywać dane tylko 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 tego użytkownika. Wybierz grupę użytkowników do przeniesienia na podstawie hasza identyfikatora użytkownika. Użyj 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żesz łatwo cofnąć zmian, chyba że w trakcie migracji wykonasz zapis podwójny zarówno starych, jak i nowych elementów. Spowoduje to zwiększenie poniesionych kosztówCloud Firestore.

Prywatność

  • Unikaj przechowywania informacji poufnych w identyfikatorze projektu Cloud. Identyfikator projektu Cloud może być przechowywany dłużej niż czas trwania projektu.
  • Zgodnie ze sprawdzoną metodą zgodności z zasadami dotyczącymi danych zalecamy, aby nie przechowywać poufnych informacji w nazwach dokumentów i nazwach pól dokumentów.

Zapobieganie nieautoryzowanemu dostępowi

Zapobiegaj nieautoryzowanym operacjom w bazie danych za pomocą Cloud Firestore Security Rules. 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 korzystaniu z usługi Cloud Firestore Security Rules.