مشاركة عبر


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

الخطوات التالية