Azure Cosmos DB لعناوين استجابة خادم Gremlin
ينطبق على: العفريت
تتناول هذه المقالة العناوين التي يقوم Azure Cosmos DB لخادم Gremlin بإرجاعها إلى المتصل عند تنفيذ الطلب. هذه العناوين مفيدة لاستكشاف أخطاء أداء الطلب وإصلاحها، وبناء التطبيق الذي يتكامل أصلا مع خدمة Azure Cosmos DB وتبسيط دعم العملاء.
ضع في اعتبارك أن الاعتماد على هذه الرؤوس يعني أنك تحد من إمكانية نقل تطبيقك إلى تطبيقات Gremlin الأخرى. في المقابل، تكتسب تكاملا أكثر إحكاما مع Azure Cosmos DB ل Gremlin. هذه الرؤوس ليست من معايير TinkerPop.
الرؤوس
الرأس | نوع | قيمة النموذج | عندما يتم تضمينها | الشرح |
---|---|---|---|---|
x-ms-request-charge | مزدوج | 11.3243 | النجاح والفشل | مقدار إنتاجية التجميع أو قاعدة البيانات المستهلكة في وحدات الطلب (RU/s أو RUs) لرسالة استجابة جزئية. هذا العنوان موجود في كل متابعة للطلبات التي تحتوي على أجزاء متعددة. إنه يعكس شحنة جزء معين من الاستجابة. فقط للطلبات التي تتكون من جزء استجابة واحد يتطابق هذا العنوان مع إجمالي تكلفة الاجتياز. ومع ذلك؛ بالنسبة لغالبية عمليات الاجتياز المعقدة تمثل هذه القيمة تكلفة جزئية. |
x-ms-total-request-charge | مزدوج | 423.987 | النجاح والفشل | مقدار إنتاجية التجميع أو قاعدة البيانات المستهلكة في وحدات الطلب (RU/s أو RUs) للطلب بالكامل. هذا العنوان موجود في كل متابعة للطلبات التي تحتوي على أجزاء متعددة. يشير إلى الرسوم التراكمية منذ بداية الطلب. تشير قيمة هذا العنوان في القطعة الأخيرة إلى رسوم الطلب الكاملة. |
x-ms-server-time-ms | مزدوج | 13.75 | النجاح والفشل | تم تضمين هذا العنوان لأغراض استكشاف أخطاء وقت الاستجابة وإصلاحها. يشير إلى مقدار الوقت، بالمللي ثانية، الذي استغرقه Azure Cosmos DB لخادم Gremlin لتنفيذ رسالة استجابة جزئية وإنتاجها. يمكن أن يؤدي استخدام قيمة هذا العنوان ومقارنته بتطبيقات وقت استجابة الطلب الكلي إلى حساب مقدار عبء زمن انتقال الشبكة. |
x-ms-total-server-time-ms | مزدوج | 130.512 | النجاح والفشل | إجمالي الوقت، بالمللي ثانية، الذي استغرقه Azure Cosmos DB لخادم Gremlin لتنفيذ اجتياز كامل. يتم تضمين هذا العنوان في كل إجابة جزئية. يمثل وقت التنفيذ التراكمي منذ بداية الطلب. يشير الرد الأخير إلى إجمالي وقت التنفيذ. هذا العنوان مفيد للتمييز بين العميل والخادم كمصدر لوقت الاستجابة. يمكنك مقارنة وقت تنفيذ الاجتياز على العميل بقيمة هذا العنوان. |
x-ms-status-code | طويل | 200 | النجاح والفشل | يشير العنوان إلى السبب الداخلي لإكمال الطلب أو إنهائه. يَنصح التطبيق بالنظر في قيمة هذا العنوان واتخاذ الإجراءات التصحيحية. |
x-ms-substatus-code | طويل | 1003 | الفشل فقط | Azure Cosmos DB هي قاعدة بيانات متعددة النماذج مبنية على طبقة التخزين الموحدة. يحتوي هذا العنوان على رؤى إضافية حول سبب الفشل عند حدوث الفشل داخل طبقات أقل من مكدس الإتاحة العالية. ينصح التطبيق بتخزين هذا العنوان واستخدامه عند الاتصال بدعم عملاء Azure Cosmos DB. قيمة هذا العنوان مفيدة لمهندس Azure Cosmos DB لاستكشاف الأخطاء وإصلاحها بسرعة. |
x-ms-retry-after-ms | سلسلة (TimeSpan) | "00:00:03.9500000" | الفشل فقط | هذا العنوان عبارة عن سلسلة تمثيل لنوع NET.TimeSpan. سيتم تضمين هذه القيمة فقط في الطلبات الفاشلة بسبب استنفاد سعة النقل المتوفرة. يجب إعادة إرسال الطلب مرة أخرى بعد فترة زمنية محددة. |
x-ms-activity-id | سلسلة (دليل) | "A9218E01-3A3A-4716-9636-5BD86B056613" | النجاح والفشل | يحتوي العنوان على معرف فريد من جانب الخادم للطلب. يتم تعيين معرف فريد لكل طلب بواسطة الخادم لأغراض التتبع. يجب أن تسجل التطبيقات معرّفات النشاط التي يتم إرجاعها بواسطة الخادم للطلبات التي قد يرغب العملاء في الاتصال بدعم العملاء بشأنها. يمكن لموظفي دعم Azure Cosmos DB العثور على طلبات محددة بواسطة هذه المعرفات في بيانات تتبع الاستخدام لخدمة Azure Cosmos DB. |
تعليمات الحالة البرمجية
يتم سرد معظم الرموز الشائعة التي يتم إرجاعها لسمة الحالة x-ms-status-code
بواسطة الخادم أدناه.
الحالة | الشرح |
---|---|
401 | يتم إرجاع رسالة "Unauthorized: Invalid credentials provided" الخطأ عندما لا تتطابق كلمة مرور المصادقة مع مفتاح حساب Azure Cosmos DB. انتقل إلى Azure Cosmos DB لحساب Gremlin في مدخل Microsoft Azure وتأكد من صحة المفتاح. |
404 | العمليات المتزامنة التي تحاول حذف وتحديث نفس الحافة أو العنوان في وقت واحد. تشير رسالة الخطأ "Owner resource does not exist" إلى أن قاعدة البيانات المحددة أو المجموعة غير صحيحة في معلمات الاتصال بتنسيق/dbs/<database name>/colls/<collection or graph name> . |
409 | "Conflicting request to resource has been attempted. Retry to avoid conflicts." يحدث هذا عادةً عند وجود رأس أو حافة ذات معرف بالفعل في الرسم البياني. |
412 | يكتمل رمز الحالة برسالة الخطأ "PreconditionFailedException": One of the specified pre-condition is not met . يشير هذا الخطأ إلى انتهاك متفائل للتحكم في التزامن بين قراءة حافة أو قمة العنوان وإعادة كتابتها إلى المتجر بعد التعديل. أكثر المواقف شيوعًا عند حدوث هذا الخطأ هي تعديل الخاصية؛ على سبيل المثال g.V('identifier').property('name','value') . كان محرك Gremlin يقرأ العنوان ويعدله ويعيد كتابته. إذا كان هناك اجتياز آخر يعمل بالتوازي في محاولة لكتابة نفس العنوان أو الحافة؛ فسوف يتلقى أحدهما هذا الخطأ. يجب على التطبيق إرسال الاجتياز إلى الخادم مرة أخرى. |
429 | تم تقييد الطلب ويجب إعادة المحاولة بعد القيمة في x-ms-retry-after-ms |
500 | تشير رسالة الخطأ التي تحتوي على "NotFoundException: Entity with the specified id does not exist in the system." إلى إعادة إنشاء قاعدة بيانات و/أو مجموعة بالاسم نفسه. سيختفي هذا الخطأ في غضون 5 دقائق مع انتشار التغيير وإبطال ذاكرات التخزين المؤقت في مكونات Azure Cosmos DB المختلفة. لتجنب هذه المشكلة استخدم قاعدة بيانات وأسماء مجموعة فريدة في كل مرة. |
1000 | يتم إرجاع رمز الحالة هذا عندما نجح الخادم في تحليل رسالة ولكن لم يكن قادرًا على التنفيذ. عادة ما يشير إلى وجود مشكلة في الاستعلام. |
1001 | يتم إرجاع هذا الرمز عندما يكمل الخادم تنفيذ الاجتياز ولكنه يفشل في إجراء تسلسل للرد على العميل. يمكن أن يحدث هذا الخطأ عندما ينتج عن الاجتياز نتيجة معقدة تكون كبيرة جدًا أو لا تتوافق مع مواصفات بروتوكول TinkerPop. يجب أن يبسط التطبيق الاجتياز عندما يواجه هذا الخطأ. |
1003 | يتم إرجاع "Query exceeded memory limit. Bytes Consumed: XXX, Max: YYY" عندما يتجاوز الاجتياز حد الذاكرة المسموح به. حد الذاكرة هو 2 غيغابايت لكل عملية مسح. |
1004 | يشير رمز الحالة هذا إلى طلب رسم بياني غير صحيح. يمكن أن يكون الطلب مشوهًا عندما يفشل في إلغاء التسلسل، أو يتم إلغاء تسلسل نوع غير ذي قيمة كنوع قيمة أو طلب عملية gremlin غير مدعومة. يجب ألا يعيد التطبيق محاولة الطلب لأنه لن ينجح. |
1007 | عادةً ما يتم إرجاع رمز الحالة هذا مع رسالة الخطأ "Could not process request. Underlying connection has been closed." . يمكن أن يحدث هذا الموقف إذا حاول برنامج تشغيل العميل استخدام اتصال يتم إغلاقه بواسطة الخادم. يجب على التطبيق إعادة محاولة الاجتياز على اتصال مختلف. |
1008 | يمكن ل Azure Cosmos DB لخادم Gremlin إنهاء الاتصالات لإعادة توازن نسبة استخدام الشبكة في نظام المجموعة. يجب على برامج تشغيل العملاء التعامل مع هذا الموقف واستخدام الاتصالات المباشرة فقط لإرسال الطلبات إلى الخادم. في بعض الأحيان قد لا تكتشف برامج تشغيل العميل أن الاتصال قد تم إغلاقه. عندما يواجه التطبيق خطأً؛ "Connection is too busy. Please retry after sometime or open more connections." يجب أن يعيد الاجتياز على اتصال مختلف. |
1009 | لم تكتمل العملية في الوقت المخصص وتم إلغاؤها بواسطة الخادم. قم بتحسين عمليات الاجتياز للتشغيل بسرعة عن طريق تصفية الرؤوس أو الحواف على كل قفزة اجتياز لتضييق نطاق البحث. مهلة الطلب الظاهري هو 60 ثانية. |
العينات
نموذج تطبيق عميل مبني على Gremlin.Net يقرأ سمة حالة واحدة:
// 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.
}
مثال يوضح كيفية قراءة سمة الحالة من عميل Gremlin Java:
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
}
}
}