Najlepsze rozwiązania dotyczące zestawu Java SDK usługi Azure Cosmos DB

DOTYCZY: NoSQL

W tym artykule przedstawiono najlepsze rozwiązania dotyczące korzystania z zestawu SDK java usługi Azure Cosmos DB. Zgodnie z tymi rozwiązaniami pomoże zwiększyć opóźnienie, dostępność i zwiększyć ogólną wydajność.

Lista kontrolna

Zaznaczony Temat Szczegóły/łącza
Wersja zestawu SDK Zawsze używaj najnowszej wersji zestawu SDK usługi Azure Cosmos DB dostępnej w celu uzyskania optymalnej wydajności.
Klient pojedynczy Użyj pojedynczego CosmosClient wystąpienia dla okresu istnienia aplikacji, aby uzyskać lepszą wydajność.
Regiony Pamiętaj, aby uruchomić aplikację w tym samym regionie świadczenia usługi Azure co konto usługi Azure Cosmos DB, jeśli to możliwe, aby zmniejszyć opóźnienie. Włącz 2–4 regiony i zreplikuj konta w wielu regionach, aby uzyskać najlepszą dostępność. W przypadku obciążeń produkcyjnych włącz tryb failover zarządzany przez usługę. W przypadku braku tej konfiguracji konto utraci dostępność zapisu przez cały czas trwania awarii regionu zapisu, ponieważ ręczne przejście w tryb failover nie powiedzie się z powodu braku łączności z regionem. Aby dowiedzieć się, jak dodać wiele regionów przy użyciu zestawu JAVA SDK , odwiedź tutaj
Dostępność i tryb failover Ustaw preferowaneRegiony w zestawie SDK w wersji 4. Podczas pracy w trybie failover operacje zapisu są wysyłane do bieżącego regionu zapisu, a wszystkie operacje odczytu są wysyłane do pierwszego regionu na liście preferowanych regionów. Aby uzyskać więcej informacji na temat regionalnej mechaniki trybu failover, zobacz przewodnik rozwiązywania problemów z dostępnością.
Procesor CPU Problemy z łącznością/dostępnością mogą wystąpić z powodu braku zasobów na maszynie klienckiej. Monitoruj użycie procesora CPU w węzłach z uruchomionym klientem usługi Azure Cosmos DB i skaluj w górę/w poziomie, jeśli użycie jest bardzo wysokie.
Hosting W przypadku najbardziej typowych przypadków obciążeń produkcyjnych zdecydowanie zalecamy używanie co najmniej 4-rdzeniowych i 8 GB maszyn wirtualnych pamięci, jeśli jest to możliwe.
Tryby Połączenie ivity Użyj trybu bezpośredniego, aby uzyskać najlepszą wydajność. Aby uzyskać instrukcje dotyczące tego, jak to zrobić, zobacz dokumentację zestawu SDK w wersji 4.
Sieć Jeśli używasz maszyny wirtualnej do uruchamiania aplikacji, włącz przyspieszoną sieć na maszynie wirtualnej, aby pomóc w wąskich gardłach z powodu dużego ruchu i zmniejszyć opóźnienia lub zakłócenia procesora CPU. Warto również rozważyć użycie wyższej maszyny wirtualnej, w której maksymalne użycie procesora CPU wynosi poniżej 70%.
Wyczerpanie portów efemerycznych W przypadku rozrzedzonego lub sporadycznych połączeń zalecamy ustawienie idleEndpointTimeout wartości na wyższą wartość. Właściwość idleEndpointTimeout w DirectConnectionConfig programie pomaga kontrolować czas, w którym nieużywane połączenia są zamykane. Spowoduje to zmniejszenie liczby nieużywanych połączeń. Domyślnie bezczynne połączenia z punktem końcowym są otwarte przez 1 godzinę. Jeśli nie ma żądań do określonego punktu końcowego dla limitu czasu bezczynności punktu końcowego, bezpośredni klient zamyka wszystkie połączenia z tym punktem końcowym w celu zaoszczędzenia zasobów i kosztów operacji we/wy.
Użyj odpowiedniego harmonogramu (unikaj kradzieży wątków we/wy pętli zdarzeń) Unikaj blokowania wywołań: .block(). Cały stos wywołań jest asynchroniczny, aby korzystać z asynchronicznych wzorców interfejsu API i używania odpowiednich wątków i harmonogramów
Limity czasu zakończenia Aby uzyskać kompleksowe limity czasu, zaimplementuj zasady limitu czasu kompleksowego w zestawie SDK języka Java. Aby uzyskać więcej informacji na temat limitów czasu w usłudze Azure Cosmos DB , odwiedź tutaj
Logika ponowień Błąd przejściowy to błąd, który ma podstawową przyczynę, która wkrótce się rozwiąże. Aplikacje łączące się z bazą danych powinny być tworzone w taki sposób, aby spodziewały się tych przejściowych błędów. Aby je obsłużyć, zaimplementuj logikę ponawiania prób w kodzie zamiast nadawać je użytkownikom jako błędy aplikacji. Zestaw SDK ma wbudowaną logikę do obsługi tych przejściowych niepowodzeń dotyczących żądań możliwych do ponawiania, takich jak operacje odczytu lub zapytań. Zestaw SDK nie ponawia próby zapisu w przypadku błędów przejściowych, ponieważ zapisy nie są idempotentne. Zestaw SDK umożliwia użytkownikom konfigurowanie logiki ponawiania prób dla ograniczania przepustowości. Aby uzyskać szczegółowe informacje na temat błędów, które należy ponowić, odwiedź tutaj
Buforowanie nazwy bazy danych/kolekcji Pobierz nazwy baz danych i kontenerów z konfiguracji lub buforuj je podczas uruchamiania. Wywołania takie jak CosmosAsyncDatabase#read() lub CosmosAsyncContainer#read() spowodują wywołania metadanych do usługi, które zużywają limit jednostek RU zarezerwowanych przez system. createDatabaseIfNotExists() należy również używać tylko raz do konfigurowania bazy danych. Ogólnie rzecz biorąc, te operacje powinny być wykonywane rzadko.
Zapytania równoległe Zestaw SDK usługi Azure Cosmos DB obsługuje równoległe uruchamianie zapytań w celu uzyskania lepszych opóźnień i przepływności zapytań. Zalecamy ustawienie maxDegreeOfParallelism właściwości w obrębie CosmosQueryRequestsOptions wartości na liczbę posiadanych partycji. Jeśli nie wiesz o liczbie partycji, ustaw wartość na -1 , aby zapewnić najlepsze opóźnienie. Ponadto ustaw maxBufferedItemCount wartość na oczekiwaną liczbę zwróconych wyników, aby ograniczyć liczbę wstępnie pobranych wyników.
Wycofywanie testów wydajnościowych Podczas testowania aplikacji należy zaimplementować wycofywanie w RetryAfter odstępach czasu. Przestrzeganie wycofywania pomaga zagwarantować, że będziesz spędzać minimalny czas oczekiwania między ponownych prób.
Indeksowanie Zasady indeksowania usługi Azure Cosmos DB umożliwiają również określenie ścieżek dokumentów do uwzględnienia lub wykluczenia z indeksowania przy użyciu ścieżek IndexingPolicy#getIncludedPaths() indeksowania i IndexingPolicy#getExcludedPaths(). Upewnij się, że nieużywane ścieżki zostały wykluczone z indeksowania w celu szybszego zapisu. Przykład tworzenia indeksów przy użyciu zestawu SDK można znaleźć tutaj
Rozmiar dokumentu Opłata za żądanie określonej operacji jest skorelowana bezpośrednio z rozmiarem dokumentu. Zalecamy zmniejszenie rozmiaru dokumentów, ponieważ operacje na dużych dokumentach kosztują więcej niż operacje na mniejszych dokumentach.
Rozmiar strony Domyślnie wyniki zapytania są zwracane we fragmentach 100 elementów lub 4 MB, w zależności od tego, który limit zostanie osiągnięty jako pierwszy. Jeśli zapytanie zwróci więcej niż 100 elementów, zwiększ rozmiar strony, aby zmniejszyć liczbę wymaganych rund. Zużycie pamięci zwiększa się wraz ze wzrostem rozmiaru strony.
Włączanie metryk zapytań Aby uzyskać dodatkowe rejestrowanie wykonań zapytań zaplecza, postępuj zgodnie z instrukcjami dotyczącymi przechwytywania metryk zapytań SQL przy użyciu zestawu Java SDK
Rejestrowanie zestawu SDK Rejestrowanie zestawu SDK umożliwia przechwytywanie dodatkowych informacji diagnostycznych i rozwiązywanie problemów z opóźnieniami. Zarejestruj usługę CosmosDiagnostics w zestawie JAVA SDK, aby uzyskać bardziej szczegółowe informacje diagnostyczne usługi Azure Cosmos DB dotyczące bieżącego żądania do usługi. Jako przykładowy przypadek użycia przechwyć diagnostykę dla dowolnego wyjątku i wykonanych operacji, jeśli CosmosDiagnostics#getDuration() wartość jest większa niż wyznaczona wartość progowa (tj. jeśli masz umowę SLA 10 sekund, a następnie przechwyć diagnostykę po getDuration()> 10 sekundach). Zaleca się używanie tych danych diagnostycznych tylko podczas testowania wydajnościowego. Aby uzyskać więcej informacji, postępuj zgodnie z diagnostyką przechwytywania w zestawie Java SDK
Unikaj używania znaków specjalnych w identyfikatorach Niektóre znaki są ograniczone i nie można ich używać w niektórych identyfikatorach: '/', '\', '?', '#'. Ogólne zalecenie polega na tym, aby nie używać żadnych znaków specjalnych w identyfikatorach, takich jak nazwa bazy danych, nazwa kolekcji, identyfikator elementu lub klucz partycji, aby uniknąć nieoczekiwanego zachowania.

Najlepsze rozwiązania dotyczące korzystania z trybu bramy

Żądania usługi Azure Cosmos DB są wysyłane za pośrednictwem protokołu HTTPS/REST w przypadku korzystania z trybu bramy. Podlegają one domyślnemu limitowi połączeń na nazwę hosta lub adres IP. Może być konieczne dostosowanie wartości maksymalnej Połączenie ionPoolSize do innej wartości (od 100 do 1000), aby biblioteka kliencka mogła używać wielu równoczesnych połączeń z usługą Azure Cosmos DB. W zestawie SDK języka Java w wersji 4 wartość GatewayConnectionConfig#maxConnectionPoolSize domyślna to 1000. Aby zmienić wartość, możesz ustawić GatewayConnectionConfig#maxConnectionPoolSize inną wartość.

Najlepsze rozwiązania dotyczące obciążeń z dużą liczbą operacji zapisu

W przypadku obciążeń, które mają duże ładunki tworzenia, ustaw CosmosClientBuilder#contentResponseOnWriteEnabled() opcję żądania na falsewartość . Usługa nie zwróci już utworzonego ani zaktualizowanego zasobu do zestawu SDK. Zwykle, ponieważ aplikacja ma tworzony obiekt, nie potrzebuje usługi, aby ją zwrócić. Wartości nagłówka są nadal dostępne, na przykład opłata za żądanie. Wyłączenie odpowiedzi na zawartość może pomóc zwiększyć wydajność, ponieważ zestaw SDK nie musi już przydzielać pamięci ani serializować treści odpowiedzi. Zmniejsza również użycie przepustowości sieci w celu zwiększenia wydajności.

Następne kroki

Aby dowiedzieć się więcej na temat wskazówek dotyczących wydajności zestawu Java SDK, zobacz Porady dotyczące wydajności zestawu Java SDK usługi Azure Cosmos DB w wersji 4.

Aby dowiedzieć się więcej na temat projektowania aplikacji pod kątem skalowania i wysokiej wydajności, zobacz Partycjonowanie i skalowanie w usłudze Azure Cosmos DB.

Próbujesz zaplanować pojemność migracji do usługi Azure Cosmos DB? Informacje o istniejącym klastrze bazy danych można użyć do planowania pojemności.