Nagłówki odpowiedzi serwera Gremlin w usłudze Azure Cosmos DB
DOTYCZY: Gremlin
W tym artykule opisano nagłówki, które serwer usługi Azure Cosmos DB dla języka Gremlin powraca do elementu wywołującego po wykonaniu żądania. Te nagłówki są przydatne do rozwiązywania problemów z wydajnością żądań, tworzenia aplikacji, która integruje się natywnie z usługą Azure Cosmos DB i upraszcza obsługę klienta.
Należy pamiętać, że zależność od tych nagłówków ogranicza przenośność aplikacji do innych implementacji języka Gremlin. W zamian zyskujesz ściślejszą integrację z usługą Azure Cosmos DB dla języka Gremlin. Te nagłówki nie są standardem TinkerPop.
Nagłówki
Nagłówek | Typ | Przykładowa wartość | Po dołączeniu | Wyjaśnienie |
---|---|---|---|---|
x-ms-request-charge | double | 11.3243 | Powodzenie i niepowodzenie | Ilość przepływności kolekcji lub bazy danych zużywana w jednostkach żądań (RU/s lub RU) w przypadku częściowego komunikatu odpowiedzi. Ten nagłówek jest obecny w każdej kontynuacji dla żądań, które mają wiele fragmentów. Odzwierciedla on opłatę za określony fragment odpowiedzi. Tylko w przypadku żądań składających się z jednego fragmentu odpowiedzi ten nagłówek jest zgodny z całkowitym kosztem przechodzenia. Jednak w przypadku większości złożonych przechodzenia ta wartość reprezentuje koszt częściowy. |
x-ms-total-request-charge | double | 423.987 | Powodzenie i niepowodzenie | Ilość przepływności kolekcji lub bazy danych zużywana w jednostkach żądań (RU/s lub RU) dla całego żądania. Ten nagłówek jest obecny w każdej kontynuacji dla żądań, które mają wiele fragmentów. Wskazuje ona skumulowane opłaty od początku żądania. Wartość tego nagłówka w ostatnim fragmentzie wskazuje na pełną opłatę za żądanie. |
x-ms-server-time-ms | double | 13.75 | Powodzenie i niepowodzenie | Ten nagłówek jest dołączany do celów rozwiązywania problemów z opóźnieniami. Wskazuje to, ile czasu w milisekundach zajęło wykonanie serwera usługi Azure Cosmos DB dla języka Gremlin i wygenerowanie częściowego komunikatu odpowiedzi. Użycie wartości tego nagłówka i porównanie go z ogólnymi aplikacjami opóźnienia żądania może obliczyć obciążenie związane z opóźnieniem sieci. |
x-ms-total-server-time-ms | double | 130.512 | Powodzenie i niepowodzenie | Łączny czas , w milisekundach, że serwer usługi Azure Cosmos DB dla języka Gremlin musiał wykonać cały przechodzenie. Ten nagłówek jest zawarty w każdej częściowej odpowiedzi. Reprezentuje skumulowany czas wykonywania od początku żądania. Ostatnia odpowiedź wskazuje całkowity czas wykonywania. Ten nagłówek jest przydatny do rozróżniania klienta i serwera jako źródła opóźnienia. Możesz porównać czas wykonywania przechodzenia na klienta z wartością tego nagłówka. |
x-ms-status-code | długi | 200 | Powodzenie i niepowodzenie | Nagłówek wskazuje wewnętrzną przyczynę ukończenia lub zakończenia żądania. Zaleca się przyjrzenie wartości tego nagłówka i podjęcie działań naprawczych. |
x-ms-substatus-code | długi | 1003 | Tylko błąd | Azure Cosmos DB to wielomodelowa baza danych oparta na ujednoliconej warstwie magazynu. Ten nagłówek zawiera dodatkowe szczegółowe informacje o przyczynie niepowodzenia, gdy awaria występuje w niższych warstwach stosu wysokiej dostępności. Zaleca się przechowywanie tego nagłówka i używanie go podczas kontaktowania się z pomocą techniczną usługi Azure Cosmos DB. Wartość tego nagłówka jest przydatna dla inżyniera usługi Azure Cosmos DB w celu szybkiego rozwiązywania problemów. |
x-ms-retry-after-ms | string (TimeSpan) | "00:00:03.9500000" | Tylko błąd | Ten nagłówek jest ciągiem reprezentującym typ timeSpan platformy .NET. Ta wartość zostanie uwzględniona tylko w żądaniach, które zakończyły się niepowodzeniem z powodu wyczerpania aprowizowanej przepływności. Aplikacja powinna ponownie przesyłać przechodzenie po poinstruowanych okresach. |
x-ms-activity-id | string (Guid) | "A9218E01-3A3A-4716-9636-5BD86B056613" | Powodzenie i niepowodzenie | Nagłówek zawiera unikatowy identyfikator po stronie serwera żądania. Każde żądanie ma przypisany unikatowy identyfikator przez serwer do celów śledzenia. Aplikacje powinny rejestrować identyfikatory aktywności zwracane przez serwer w przypadku żądań, o których klienci mogą chcieć skontaktować się z pomocą techniczną. Personel pomocy technicznej usługi Azure Cosmos DB może znaleźć określone żądania według tych identyfikatorów w telemetrii usługi Azure Cosmos DB. |
Kody stanu
Poniżej wymieniono najczęściej kody zwracane dla x-ms-status-code
atrybutu stanu przez serwer.
Stan | Wyjaśnienie |
---|---|
401 | Komunikat "Unauthorized: Invalid credentials provided" o błędzie jest zwracany, gdy hasło uwierzytelniania nie jest zgodne z kluczem konta usługi Azure Cosmos DB. Przejdź do konta usługi Azure Cosmos DB dla języka Gremlin w witrynie Azure Portal i upewnij się, że klucz jest poprawny. |
404 | Równoczesne operacje, które próbują usunąć i zaktualizować tę samą krawędź lub wierzchołek jednocześnie. Komunikat o błędzie "Owner resource does not exist" wskazuje, że określona baza danych lub kolekcja jest niepoprawna w ramach parametrów połączenia w formacie /dbs/<database name>/colls/<collection or graph name> . |
409 | "Conflicting request to resource has been attempted. Retry to avoid conflicts." Taka sytuacja zwykle występuje, gdy wierzchołek lub krawędź z danym identyfikatorem już istnieje w grafie. |
412 | Kod stanu jest uzupełniany komunikatem "PreconditionFailedException": One of the specified pre-condition is not met o błędzie . Ten błąd wskazuje na optymistyczne naruszenie kontroli współbieżności między odczytywaniem krawędzi lub wierzchołka i zapisywaniem go z powrotem do magazynu po modyfikacji. Najbardziej typowe sytuacje, w których występuje ten błąd, to modyfikacja właściwości, na przykład g.V('identifier').property('name','value') . Aparat Gremlin odczytał wierzchołek, zmodyfikował go i zapisał go z powrotem. Jeśli istnieje inny przechodzenie uruchomione równolegle, próbując zapisać ten sam wierzchołek lub krawędź, jeden z nich otrzyma ten błąd. Aplikacja powinna ponownie przesłać przejście do serwera. |
429 | Żądanie zostało ograniczone i należy je ponowić po upłynięciu okresu określonego przez wartość x-ms-retry-after-ms |
500 | Komunikat o błędzie zawierający informację "NotFoundException: Entity with the specified id does not exist in the system." wskazuje, że utworzono ponownie bazę danych i/lub kolekcję z tą samą nazwą. Ten błąd zniknie w ciągu 5 minut, gdy zmiana będzie propagowana i unieważnia pamięci podręczne w różnych składnikach usługi Azure Cosmos DB. Aby uniknąć tego problemu, za każdym razem używaj unikatowych nazw baz danych i kolekcji. |
1000 | Ten kod stanu jest zwracany, gdy serwer pomyślnie przeanalizować komunikat, ale nie był w stanie wykonać. Zwykle wskazuje problem z zapytaniem. |
1001 | Ten kod jest zwracany po zakończeniu wykonywania przechodzenia przez serwer, ale nie można serializować odpowiedzi z powrotem do klienta. Ten błąd może wystąpić, gdy przechodzenie generuje złożony wynik, jest zbyt duży lub nie jest zgodny ze specyfikacją protokołu TinkerPop. Aplikacja powinna uprościć przechodzenie, gdy wystąpi ten błąd. |
1003 | "Query exceeded memory limit. Bytes Consumed: XXX, Max: YYY" jest zwracany, gdy przechodzenie przekracza dozwolony limit pamięci. Limit pamięci wynosi 2 GB na przechodzenie. |
1004 | Ten kod stanu wskazuje źle sformułowane żądanie grafu. Żądanie może być źle sformułowane, gdy nie powiedzie się deserializacji, typ niewartościowy jest deserializowany jako typ wartości lub nieobsługiwana operacja gremlin żądana. Aplikacja nie powinna ponowić próby żądania, ponieważ nie powiedzie się. |
1007 | Zazwyczaj ten kod stanu jest zwracany z komunikatem "Could not process request. Underlying connection has been closed." o błędzie . Taka sytuacja może wystąpić, jeśli sterownik klienta próbuje użyć połączenia, które jest zamykane przez serwer. Aplikacja powinna ponowić próbę przejścia w innym połączeniu. |
1008 | Serwer Usługi Azure Cosmos DB dla języka Gremlin może przerywać połączenia w celu ponownego równoważenia ruchu w klastrze. Sterowniki klienta powinny obsługiwać tę sytuację i używać tylko połączeń na żywo do wysyłania żądań do serwera. Czasami sterowniki klienta mogą nie wykryć, że połączenie zostało zamknięte. Gdy aplikacja napotka błąd, "Connection is too busy. Please retry after sometime or open more connections." powinna ponowić próbę przejścia na innym połączeniu. |
1009 | Operacja nie została ukończona w wyznaczonym czasie i została anulowana przez serwer. Zoptymalizuj przechodzenie, aby szybko uruchomić, filtrując wierzchołki lub krawędzie na każdym przeskoku przechodzenia w celu wąskiego zakresu wyszukiwania. Wartość domyślna limitu czasu żądania to 60 sekund. |
Przykłady
Przykładowa aplikacja kliencka oparta na Gremlin.Net, która odczytuje jeden atrybut stanu:
// Following example reads a status code and total request charge from server response attributes.
// Variable "server" is assumed to be assigned to an instance of a GremlinServer that is connected to Azure Cosmos DB account.
using (GremlinClient client = new GremlinClient(server, new GraphSON2Reader(), new GraphSON2Writer(), GremlinClient.GraphSON2MimeType))
{
ResultSet<dynamic> responseResultSet = await GremlinClientExtensions.SubmitAsync<dynamic>(client, requestScript: "g.V().count()");
long statusCode = (long)responseResultSet.StatusAttributes["x-ms-status-code"];
double totalRequestCharge = (double)responseResultSet.StatusAttributes["x-ms-total-request-charge"];
// Status code and request charge are logged into application telemetry.
}
Przykład przedstawiający sposób odczytywania atrybutu stanu z klienta Języka Java języka Gremlin:
try {
ResultSet resultSet = this.client.submit("g.addV().property('id', '13')");
List<Result> results = resultSet.all().get();
// Process and consume results
} catch (ResponseException re) {
// Check for known errors that need to be retried or skipped
if (re.getStatusAttributes().isPresent()) {
Map<String, Object> attributes = re.getStatusAttributes().get();
int statusCode = (int) attributes.getOrDefault("x-ms-status-code", -1);
// Now we can check for specific conditions
if (statusCode == 409) {
// Handle conflicting writes
}
}
// Check if we need to delay retry
if (attributes.containsKey("x-ms-retry-after-ms")) {
// Read the value of the attribute as is
String retryAfterTimeSpan = (String) attributes.get("x-ms-retry-after-ms"));
// Convert the value into actionable duration
LocalTime locaTime = LocalTime.parse(retryAfterTimeSpan);
Duration duration = Duration.between(LocalTime.MIN, locaTime);
// Perform a retry after "duration" interval of time has elapsed
}
}
}