Udostępnij za pośrednictwem


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 meto 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
    }
  }
}

Następne kroki