Freigeben über


Azure Cosmos DB for Gremlin: Serverantwortheader

GILT FÜR: Gremlin

In diesem Artikel werden Header behandelt, die der „Azure Cosmos DB for Gremlin“-Server bei der Anforderungsausführung an den Aufrufer zurückgibt. Diese Header sind nützlich für die Problembehandlung der Anforderungsleistung, beim Erstellen von Anwendungen, die sich nativ in den Azure Cosmos DB-Dienst integrieren lassen, und bei der Vereinfachung des Kundensupports.

Beachten Sie, dass Sie die Portierbarkeit Ihrer Anwendung auf andere Gremlin-Implementierungen einschränken, wenn Sie eine Abhängigkeit von diesen Headern schaffen. Andererseits erhalten Sie eine engere Integration in Azure Cosmos DB for Gremlin. Diese Header sind kein TinkerPop-Standard.

Header

Header type Beispielwert Wenn eingebunden Erklärung
x-ms-request-charge double 11,3243 Erfolg und Fehler Menge des Sammlungs- oder Datenbankdurchsatzes, der in Anforderungseinheiten (RU/s oder RUs) für eine Teilantwortnachricht verbraucht wird. Dieser Header ist in jeder Fortsetzung für Anforderungen vorhanden, die aus mehreren Blöcken bestehen. Er gibt die Kosten eines bestimmten Antwortblocks wieder. Nur bei Anforderungen, die aus einem einzelnen Antwortblock bestehen, stimmt dieser Header mit den Gesamtkosten des Durchlaufs überein. Bei der Mehrzahl komplexer Durchläufe stellt dieser Wert jedoch partielle Kosten dar.
x-ms-total-request-charge double 423,987 Erfolg und Fehler Menge des Sammlungs- oder Datenbankdurchsatzes, der in Anforderungseinheiten (RU/s oder RUs) für die gesamte Anforderung verbraucht wird. Dieser Header ist in jeder Fortsetzung für Anforderungen vorhanden, die aus mehreren Blöcken bestehen. Gibt die kumulierten Kosten seit dem Beginn der Anforderung an. Der Wert dieses Headers im letzten Block gibt die gesamten Anforderungskosten an.
x-ms-server-time-ms double 13,75 Erfolg und Fehler Dieser Header ist für die Behandlung von Latenzproblemen enthalten. Er gibt die Zeitspanne in Millisekunden an, die der „Azure Cosmos DB for Gremlin“-Server benötigt hat, um eine Teilantwortnachricht auszuführen und zu generieren. Wenn Sie den Wert dieses Headers verwenden und ihn mit den allgemeinen Anwendungen für die Latenzzeit von Anforderungen vergleichen, können Sie den Mehraufwand für Netzwerklatenz berechnen.
x-ms-total-server-time-ms double 130,512 Erfolg und Fehler Die Gesamtzeit in Millisekunden, die der „Azure Cosmos DB for Gremlin“-Server benötigt hat, um den gesamten Durchlauf auszuführen. Dieser Header ist in jeder Teilantwort enthalten. Er stellt eine kumulative Ausführungszeit seit dem Start der Anforderung dar. Die letzte Antwort gibt die Gesamtausführungszeit an. Dieser Header ist hilfreich, um zwischen Client und Server als Quelle von Latenz zu unterscheiden. Sie können die Ausführungszeit für den Durchlauf auf dem Client mit dem Wert dieses Headers vergleichen.
x-ms-status-code long 200 Erfolg und Fehler Der Header gibt den internen Grund für den Abschluss oder die Beendigung der Anforderung an. Der Anwendung wird empfohlen, den Wert dieses Headers zu überprüfen und Korrekturmaßnahmen zu ergreifen.
x-ms-substatus-code long 1003 Nur Fehler Bei Azure Cosmos DB handelt es sich um eine Datenbank mit mehreren Modellen, die auf der vereinheitlichten Speicherschicht basiert. Dieser Header enthält zusätzliche Erkenntnisse über die Fehlerursache beim Auftreten von Fehlern in den unteren Schichten des Hochverfügbarkeitsstapels. Der Anwendung wird empfohlen, diesen Header zu speichern und zu verwenden, wenn Kontakt mit dem Azure Cosmos DB-Kundensupport aufgenommen wird. Der Wert dieses Headers ist für die schnelle Problembehandlung durch einen Azure Cosmos DB-Techniker nützlich.
x-ms-retry-after-ms string (TimeSpan) "00:00:03.9500000" Nur Fehler Dieser Header ist eine Zeichenfolgendarstellung eines .NET TimeSpan-Typs. Dieser Wert ist nur in Anforderungen enthalten, die aufgrund der bereitgestellten Durchsatzauslastung fehlgeschlagen sind. Die Anwendung sollte den Durchlauf nach einem angegebenen Zeitraum erneut übermitteln.
x-ms-activity-id string (Guid) "A9218E01-3A3A-4716-9636-5BD86B056613" Erfolg und Fehler Der Header enthält einen eindeutigen serverseitigen Bezeichner für eine Anforderung. Jeder Anforderung wird vom Server ein eindeutiger Bezeichner zu Nachverfolgungszwecken zugewiesen. Anwendungen sollten Aktivitätsbezeichner protokollieren, die vom Server für Anforderungen zurückgegeben werden, zu denen sich Kunden möglicherweise an den Kundensupport wenden möchten. Azure Cosmos DB-Supportmitarbeiter können bestimmte Anforderungen durch diese Bezeichner in der Azure Cosmos DB-Diensttelemetrie ermitteln.

Statuscodes

Die häufigsten Codes, die vom Server für das Statusattribut x-ms-status-code zurückgegeben werden, sind unten aufgeführt.

Status Erklärung
401 Die Fehlermeldung "Unauthorized: Invalid credentials provided" wird zurückgegeben, wenn das Authentifizierungskennwort nicht mit dem Azure Cosmos DB-Kontoschlüssel übereinstimmt. Navigieren Sie im Azure-Portal zu Ihrem „Azure Cosmos DB for Gremlin“-Konto, und vergewissern Sie sich, dass der Schlüssel richtig ist.
404 Gleichzeitige Vorgänge, bei denen versucht wird, den gleichen Edge oder Vertex parallel zu löschen und zu aktualisieren. Mit der Fehlermeldung "Owner resource does not exist" wird darauf hingewiesen, dass die angegebene Datenbank oder Sammlung in den Verbindungsparametern im Format /dbs/<database name>/colls/<collection or graph name> fehlerhaft ist.
409 "Conflicting request to resource has been attempted. Retry to avoid conflicts." Dies tritt normalerweise auf, wenn ein Scheitelpunkt oder eine Kante mit einem Bezeichner bereits im Diagramm vorhanden ist.
412 Der Statuscode wird durch die Fehlermeldung "PreconditionFailedException": One of the specified pre-condition is not met ergänzt. Dieser Fehler ist ein Hinweis auf eine Verletzung der optimistischen Nebenläufigkeitskontrolle zwischen dem Lesen eines Edge oder Vertex und dem Zurückschreiben in den Speicher nach der Änderung. Die häufigsten Fälle, in denen dieser Fehler auftritt, sind Eigenschaftsänderungen, z.B. g.V('identifier').property('name','value'). Die Gremlin-Engine liest den Vertex, ändert ihn und schreibt ihn dann zurück. Wenn es einen weiteren Durchlauf gibt, der parallel ausgeführt wird und versucht, den gleichen Vertex oder Edge zu schreiben, erhält einer der Vorgänge diesen Fehler. Die Anwendung sollte den Durchlauf erneut an den Server übermitteln.
429 Die Anforderung wurde gedrosselt und sollte nach dem Zeitraum wiederholt werden, der mit dem Wert unter x-ms-retry-after-ms festgelegt ist.
500 Eine Fehlermeldung der Art "NotFoundException: Entity with the specified id does not exist in the system." weist darauf hin, dass eine neue Datenbank bzw. Sammlung mit dem gleichen Namen erstellt wurde. Dieser Fehler wird innerhalb von fünf Minuten entfernt, wenn die Änderung verbreitet wird, und Caches in den unterschiedlichen Azure Cosmos DB-Komponenten werden ungültig gemacht. Verwenden Sie immer eindeutige Namen für Datenbanken und Sammlungen, um dieses Problem zu vermeiden.
1000 Dieser Statuscode wird zurückgegeben, wenn der Server eine Nachricht erfolgreich analysiert hat, aber keine Ausführung erfolgen konnte. Dies weist in der Regel auf ein Problem mit der Abfrage hin.
1001 Dieser Code wird zurückgegeben, wenn der Server die Durchlaufausführung abschließt, die Antwort aber nicht zurück an den Client serialisiert. Dieser Fehler kann auftreten, wenn der Durchlauf ein komplexes Ergebnis generiert, das zu groß ist oder nicht der TinkerPop-Protokollspezifikation entspricht. Die Anwendung sollte den Durchlauf vereinfachen, wenn dieser Fehler auftritt.
1003 "Query exceeded memory limit. Bytes Consumed: XXX, Max: YYY" wird zurückgegeben, wenn der Durchlauf die zulässige Speichergrenze überschreitet. Die Speichergrenze beträgt 2 GB pro Durchlauf.
1004 Dieser Statuscode gibt eine falsch formatierte Graphanforderung an. Die Anforderung kann falsch formatiert sein, wenn die Deserialisierung fehlschlägt, der Nicht-Werttyp als Werttyp deserialisiert oder ein nicht unterstützter Gremlin-Vorgang angefordert wird. Die Anwendung sollte die Anforderung nicht wiederholen, da sie nicht erfolgreich sein wird.
1007 Dieser Statuscode wird normalerweise mit der Fehlermeldung "Could not process request. Underlying connection has been closed." zurückgegeben. Dieser Fall kann auftreten, wenn der Clienttreiber versucht, eine Verbindung zu verwenden, die vom Server geschlossen wird. Die Anwendung sollte den Durchlauf mit einer anderen Verbindung wiederholen.
1008 Der „Azure Cosmos DB for Gremlin“-Server kann Verbindungen beenden, um den Datenverkehr im Cluster auszugleichen. Clienttreiber sollten diesen Fall verarbeiten und nur aktive Verbindungen verwenden, um Anforderungen an den Server zu senden. Gelegentlich erkennen Clienttreiber ggf. nicht, dass die Verbindung geschlossen wurde. Wenn die Anwendung auf einen Fehler stößt ("Connection is too busy. Please retry after sometime or open more connections."), sollte sie den Durchlauf mit einer anderen Verbindung wiederholen.
1009 Der Vorgang wurde im vorgesehenen Zeitraum nicht abgeschlossen und vom Server abgebrochen. Optimieren Sie Ihre Durchläufe für eine schnelle Ausführung, indem Sie Vertices oder Edges bei jedem Hop des Durchlaufs filtern, um den Suchbereich einzugrenzen. Der Standardwert für das Anforderungstimeout ist 60 Sekunden.

Beispiele

Eine Clientbeispielanwendung auf Basis von Gremlin.Net, die ein Statusattribut liest:

// 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.
}

Ein Beispiel, das zeigt, wie ein Statusattribut aus dem Gremlin Java-Client gelesen werden kann:

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

Nächste Schritte