محتويات الدورة

GraphQL / المتوسط: السياسة والمصادر والعملاء / الدرس 9

التجميع والمحملات ومشكلة N+1

قلل عمل المصدر المتكرر مع عزل الطلب وترتيب المفاتيح ومعنى السجل المفقود.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تعرف تفرع المحللات وميز التجميع عن المخبأ العام.
  • أعد نتائج الدفعة غير المرتبة لترتيب المفاتيح المطلوبة.

قس نمط اتصالات المصدر الفعلي

قد تحل قائمة مقررات مؤلف كل مقرر مستقلاً فتجري اتصال القائمة واتصالاً لكل مرجع مؤلف ولو تكرر. هذه N+1 وليست خاصة بـGraphQL لكن التنفيذ الحقلي يسهلها. قس اتصالات المصدر وعدد المفاتيح لعملية ممثلة قبل العلاج. قد يناسب ربط أو واجهة دفعات أصلية أو محمل بعمر الطلب، ولا يلزم محمل لكل حقل.

أنشئ المحمل ضمن الطلب

تجمع أداة من نمط DataLoader المفاتيح المتوافقة وتحفظ النتائج عادة ضمن عمرها. ينشئ المصنع محملاً جديداً لكل طلب مصادق عليه. يجب أن تطبق دالة الدفعة المستأجر والظهور. قد يحتفظ المفرد العام بنتائج طلبية فيسرب بيانات أو يقدم قديماً. الجزء يوضح الواجهة ولا يشغل لغياب الحزمة والمصدر عمداً.

javascript حد محمل خاص بالطلب
function makeContext(principal, services, DataLoader) {
  return {
    principal,
    authorLoader: new DataLoader(keys =>
      services.authors.findVisibleInKeyOrder(keys, principal))
  };
}

يجب أن تعيد الخدمة نتيجة لكل مفتاح بالترتيب نفسه مع تمثيل الفقد أو الخطأ.

احفظ العدد والترتيب والأخطاء

قد يعيد المصدر صفوفاً بترتيب عشوائي ويحذف المفقود. لا تمرر المصفوفة مباشرة إذا توقع المستهلك مواضع المفاتيح. ابن فهرساً ثم ارسم التسلسل الأصلي إلى قيمه. حدد تمثيل المفقود والمحجوب دون تسريب الفرق. قد تختلف معالجة خطأ مفتاح عن انقطاع الدفعة كلها. راجع دلالات المخبأ والخطأ ولا تفترض إعادة كل فشل أو سلامة كل null.

تحقق من الربط بمفتاح أوسط مفقود

تستقبل العينة صفوفاً معكوسة وتفتقد a2، فيعيد الربط a1 ثم null ثم a3. وتحفظ موضع a1 المكرر المفيد لدالة دفعات عامة ولو أزال المحمل تكرار الطلب. يفترض الفهرس فرادة معرفات الصفوف المسموحة. على الموائم كشف التضارب وتطبيق الظهور قبل الفهرسة لا اعتبارها تفويضاً.

javascript نموذج ترتيب دفعات محلي
const keys = ["a1", "a2", "a3", "a1"];
const rows = [{id:"a3",name:"Mira"},{id:"a1",name:"Lina"}];
const byId = new Map(rows.map(row => [row.id, row]));
const ordered = keys.map(key => byId.get(key) ?? null);
console.assert(ordered[0].name === "Lina");
console.assert(ordered[1] === null);
console.assert(ordered[2].name === "Mira");
console.assert(ordered[3] === ordered[0]);

تفحص التأكيدات الربط المحلي فقط ولا تثبت تجميع قاعدة أو جدولة DataLoader مثبت.

أبطل ضمن العمر الصحيح

قد تغير طفرة مؤلفاً حفظ في سياق الطلب نفسه. امسح أو حدث المدخل وفق المكتبة والنتيجة؛ فالنجاح لا يحدث كل مخبأ سحرياً. بين الطلبات استخدم سياسة مشتركة صريحة بدلاً من تمديد الحفظ إلى مخبأ عام غير محدود. يقلل التجميع الاتصالات لا الصفوف والبايتات والمعالج بالضرورة. ما زالت الدفعات الكبيرة والتداخل تحتاج حدوداً ومهلاً وضبط طلب.

الأخطاء الشائعة وإصلاحها

تنسب الأسماء لمؤلفين خطأ

لماذا يحدث؟
أعيدت الصفوف بترتيب المصدر لا المفاتيح.
كيف تصلحه؟
فهرس الصفوف المسموحة واربط المفاتيح الأصلية.
كيف تتجنب تكراره؟
اختبر عكس الترتيب وفقد الوسط.

تعيد الطفرة بيانات مؤلف قديمة

لماذا يحدث؟
بقيت القيمة السابقة في محمل الطلب.
كيف تصلحه؟
امسح المدخل أو حدثه بعد نجاح مؤكد.
كيف تتجنب تكراره؟
اختبر قراءة وكتابة وقراءة في دورة طلب.

تنتهي مهلة دفعة ضخمة

لماذا يحدث؟
اختلط تقليل الاتصالات بتقييد العمل.
كيف تصلحه؟
قيد الدفعات والتصفح المتداخل.
كيف تتجنب تكراره؟
قس الصفوف والبايتات والمهل بجانب الاتصالات.

اختبر فهمك

1. يعيد المصدر a3 ثم a1 لمفاتيح a1,a2,a3. ماذا يعيد الموائم؟

اعرض الحل المشروح

يعيد قيمة a1 ثم نتيجة فقد a2 ثم a3 بالترتيب وبالطول نفسه. يفسد رد صفين فقط الارتباط. فهرس بالمفتاح وارسم الأصل، واختبر اتساق سياسة المفقود والمحجوب.

2. لماذا مشاركة DataLoader بين كل الطلبات خطرة ولو أسرعت؟

اعرض الحل المشروح

قد تعتمد القيمة على الهوية والمستأجر والنسخة والسياسة الأولى، فيتلقاها آخر بلا إعادة تحقق ويصعب الإبطال. استعمل نطاق الطلب وصمم أي مخبأ مشترك بمتطلبات هوية وحداثة ووصول صريحة.

أهم ما تعلمته

  • تحفظ الدفعة ترتيب المفاتيح وطولها.
  • لا يلغي تقليل الاتصالات العزل والحداثة والحدود.

المراجع الرسمية