GraphQL / دليل حلول تحريري
تشخيص بطء العمليات وترتيب الدفعات والبيانات القديمة
ميز زيادة عمل المصدر عن خطأ ربط مواضع الدفعة أو عمر المخبأ، ثم أصلح السبب المثبت قبل تعديل المهلة.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد يزداد بطء قائمة المقررات مع حجم الصفحة، أو تظهر أسماء مؤلفين تحت بطاقات لا تخصهم، أو يظل العرض قديماً رغم نجاح التحرير. قد تجتمع هذه الأعراض لكن أسبابها ليست واحدة. لا يثبت انخفاض عدد اتصالات المصدر صحة إسناد السجلات أو حداثتها، وقد تخفي زيادة المهلة خللاً في عقد القائمة أو المخبأ بدلاً من إصلاحه.
افهم الأسباب المحتملة
- تشمل الأسباب المحتملة تفرع محللات N+1، ونتائج دفعات غير مرتبة، وانزياح المواضع عند حذف مفتاح مفقود، وقوائم متداخلة أكبر من حدودها، ونتائج محفوظة بعد طفرة، وخلط صفحات ذات مرشحات مختلفة، أو محمل طلب يعيش طوال عمر العملية العامة. حدد الوثيقة الدقيقة وحدود متغيراتها ودورة هوية المستدعي قبل نسبة كل تأخير إلى قاعدة البيانات.
عد العمل واتبع سلسلة الاعتماد
استخدم التتبعات المتاحة ضمن نطاق التحقيق، أو عداد خدمة اصطناعية، لتسجيل حجم القائمة، وعدد مفاتيح المؤلفين الفريدة، وحجم الدفعة، وعدد اتصالات المصدر، ومدة المسار الحرج. اتصال لجلب القائمة يتبعه اتصال مؤلف لكل عنصر يوحي بنمط N+1، بينما قد تعني دفعة ضخمة واحدة أن المشكلة في حدود العمل. افحص الاختيارات المتداخلة وحدود الوسائط الفعلية؛ فصغر الصفحة الخارجية لا يمنع تضاعف العمل في الداخل. لا تبدأ باختبارات حمل أو تفريغ بيانات واسع. تكفي معرفات العمليات والأعداد الآمنة غالباً لتحديد الموائم الذي يضاعف العمل.
افحص ترتيب الدفعة قبل نجاح تقليل الاتصالات
يجب أن تعيد دالة الدفعة نتيجة واحدة لكل مفتاح مطلوب، وبالترتيب الأصلي للمفاتيح. تعيد المصادر الصفوف عادة بترتيبها الخاص وقد تحذف السجلات المفقودة. ابن فهرساً للنتائج المسموح بها، ثم اربط كل مفتاح أصلي بنتيجته أو بحالة الفقد الموثقة. تعكس العينة المحلية ترتيب الصفوف وتفتقد المفتاح الأوسط عمداً، ويمكن فحصها دون محرك GraphQL أو خدمة مصدر. لا تجعل الفهرسة بديلاً عن تصفية نطاق المستأجر، واكشف هويات المصدر المكررة على نحو غير متوقع بدلاً من السماح لآخر صف باستبدال سابقه بصمت.
const keys = ["a1","a2","a3"];
const rows = [{id:"a3",name:"Mira"},{id:"a1",name:"Lina"}];
const byId = new Map(rows.map(row => [row.id,row]));
const names = keys.map(key => byId.get(key)?.name ?? null);
console.assert(JSON.stringify(names) === JSON.stringify(["Lina",null,"Mira"]));
يحفظ المفتاح المفقود a2 موضعاً صريحاً بقيمة null. بذلك لا تنزاح نتيجة a3 إلى الموضع الثاني وتنسب خطأ إلى المقرر الذي ينتظر a2.
سم الطبقة القديمة وأبطلها بدقة
حدد الطبقة التي تعيد القيمة القديمة: حفظ نتائج داخل الطلب، أم مخبأ خادم مشترك، أم مخبأ HTTP، أم حالة عميل موحدة. بعد نجاح طفرة مؤكد، امسح مدخل محمل الطلب المعني أو حدثه وفق عقد المكتبة. قد يؤدي رد الكيان المحدث إلى تصحيح مراجع العميل، لكنه لا يصلح تلقائياً عضوية قائمة مرشحة أو ترتيبها. يمكن لتعديل العنوان أن ينقل السجل عبر حد الصفحة. أعد قراءة الاستعلام المحدود المتأثر أو حدثه بسياسة مراجعة، بدلاً من مسح كل المخابئ أو وصل صفحات تنتمي إلى مرشحات غير متوافقة.
احفظ العزل والمواعيد والميزانيات
أنشئ المحملات المعتادة ضمن نطاق الطلب بعد المصادقة، وأدرج أبعاد هوية المستأجر التي يحتاجها مصدرها حتى لا تختلط بيانات المستأجرين. قيد أحجام دفعات المصدر وحدود التصفح، وشارك موعداً نهائياً واحداً عبر العملية. انتهاء مهلة العميل لا يثبت إلغاء عمل المصدر، وقد تضخم سياسات الإعادة المتراكبة الحادث. بعد الإصلاح المحدد، قارن عدد الاتصالات وهويات السجلات المعادة والأخطاء الجزئية وتحرير الموارد معاً. يشغل هذا الدليل منطق ربط محلياً فقط، ولا يقيس قاعدة بيانات أو شبكة أو تنفيذ GraphQL حياً؛ ويحتاج دمج الإلغاء والمخبأ الفعلي إلى تحقق منفصل مأذون به.
تحقق من نجاح الإصلاح
استخدم صفحة اصطناعية ثابتة لتأكيد الارتباط الدقيق بين المقرر ومؤلفه، والسجلات المفقودة، والمراجع المكررة، وحد عدد الاتصالات. ثم اختبر القراءة والكتابة والقراءة، وتغيير المرشحات، وتعادل مفاتيح الترتيب، ومستأجرين متتابعين. قارن المسار الحرج بعد الإصلاح دون جمع فترات متداخلة كما لو كانت متسلسلة. احفظ دليلاً على صحة النتيجة وتقليل تضخم العمل معاً.
امنع تكرار المشكلة
- احتفظ بموائمات دفعات تحفظ الترتيب، ومصانع محملات بعمر الطلب، وسياسات مخبأ مناسبة لكل حقل. راجع الأجزاء المنشورة بحثاً عن تفرع قوائم خفي، واختبر حقول الطفرات التي تغير التصفية أو الترتيب. تتبع أدلة كلفة آمنة على مستوى العملية، وتجنب وصفات عامة لزيادة المهلة أو مسح المخبأ قد تحجب فشل العقد الأصلي.