MongoDB / المتقدم: التشغيل الموزع والقابل للتعافي / الدرس 17
النوافذ وتدفقات التغيير والنتائج المصانة
احسب تحليلاً لكل وثيقة وصمم معالجة تغيير قابلة للاستئناف دون وعد أثر خارجي واحد تلقائي، وحد المسارات والنتائج المشتقة.
في هذه الصفحة
أهداف الدرس
- استخدام التقسيم والترتيب ونوافذ الوثائق صراحة.
- شرح رموز الاستئناف وهوية التسليم ودورة النتائج.
تضيف النافذة سياقاً دون إزالة التفاصيل
تحسب $setWindowFields منذ5.0 عبر وثائق مرتبطة مع حفظ التفاصيل. يحدد التقسيم المجموعات وsortBy الحساب والنافذة جواره. استخدم معرفاً ثابتاً للتعادل وفرزاً نهائياً للعرض. قد يكلف الحساب الكثير لتقرير صغير فحد المصدر وافحص التنفيذ.
احسب مجموعاً تراكمياً مستنتجاً
تستخدم العينة ثلاثة مقادير وتسلسلاً فريداً فتعطي النافذة5 و13 و15 وتبقي التفاصيل خلاف $group. تحتاج $documents الإصدار5.1 ونستهدف معاملات8.0. لا مجموعة دائمة أو زمن مرصود. حدد الغياب والنوع والتعادل قبل تطبيق مالي.
db.getSiblingDB('quay_lab').aggregate([
{ $documents: [{ seq: 1, amount: 5 }, { seq: 2, amount: 8 }, { seq: 3, amount: 2 }] },
{ $setWindowFields: { sortBy: { seq: 1 }, output: {
running: { $sum: '$amount', window: { documents: ['unbounded', 'current'] } }
} } },
{ $project: { _id: 0, seq: 1, running: 1 } },
{ $sort: { seq: 1 } }
]);
{ seq: 1, running: 5 }
{ seq: 2, running: 13 }
{ seq: 3, running: 15 }
النافذة تراكم وثائق مرتبة لا مدة ساعة.
يحتاج التدفق احتفاظاً وحالة مستهلك
ترصد التدفقات بنى النسخ والمجزأة المدعومة لا المنفردة العشوائية. احفظ رموز الاستئناف ببروتوكول معالجة ونقاط. التاريخ محدود وقد يلزم بناء جديد عند فقده. لا يعوض الرمز هوية العمل؛ قد يتكرر التسليم أو الأثر الخارجي بين التنفيذ والنقطة دون منع التكرار.
اجعل المستهلك محدوداً وصريحاً
يفترض المقطع مشغلاً ومقبض مجموعة اصطناعية. يفتح إدراجاً فقط ويعالج حدثاً واحداً ثم يغلق، وقد ينتظر فيحتاج سياسة إيقاف ومهلة. تمثل الدالة معالجة يعرفها التطبيق لا ضمان مرة واحدة منفذاً. لا تشغيل أو اتصال هنا ويجب توافق المشغل والخادم.
// Driver fragment: collection and processIdempotently are supplied by the application.
const stream = collection.watch([{ $match: { operationType: 'insert' } }]);
try {
for await (const event of stream) {
await processIdempotently(event._id, event.fullDocument);
break;
}
} finally { await stream.close(); }
يجب تنسيق الهوية والأثر والنقطة دواماً؛ لا يثبت الاسم الضمان.
للنتائج المادية والميزات المتخصصة عقود
تكتب $merge و$out النتائج فتحتاج منحاً وتفرداً وتعافياً. لـ $facet حدود لا تجعلها allowDiskUse تسرباً مطلقاً لحالتها. تتطلب البحث والمتجهات ميزات وفهارس مدعومة تختلف بالإصدار والمنتج والمستوى، فلا تفترض تساوي Community وAtlas. حدد المرجع وتأخر التحديث وإعادة البناء والمستهلك.
الأخطاء الشائعة وإصلاحها
يكرر المستهلك المستأنف أثراً خارجياً
- لماذا يحدث؟
- اختلطت النقطة بالتسليم المنسق بلا تكرار.
- كيف تصلحه؟
- احفظ الهوية وصمم التعافي بين الأثر والنقطة.
- كيف تتجنب تكراره؟
- اختبر الانهيار قبل حفظ النقطة وبعده.
ChangeStreamHistoryLost
- لماذا يحدث؟
- لم يعد تاريخ الاستئناف متاحاً.
- كيف تصلحه؟
- استخدم بناء أو تجهيزاً موثقاً من مصدر متسق.
- كيف تتجنب تكراره؟
- راقب التأخر مقابل التاريخ واختبر البناء.
لا تحل allowDiskUse حد $facet
- لماذا يحدث؟
- أُغفلت حدود المرحلة والنتيجة.
- كيف تصلحه؟
- حد المرحلة أو صممها وافحص القيود.
- كيف تتجنب تكراره؟
- راجع كل مرحلة لا خيار هروب عام.
اختبر فهمك
1. يرسل المستهلك بريداً وينهار قبل الرمز ثم يستأنف. ماذا يحدث؟
اعرض الحل المشروح
قد يعاد البريد. لا ينسق الاستئناف الخارج ذرياً مع الحالة. استخدم هوية دائمة وبروتوكول تسليم أو outbox واختبر النافذة؛ اسم الدالة متطلب حتى يثبت السلوك.
2. لماذا تختلف نافذة الوثائق التراكمية عن آخر ساعة؟
اعرض الحل المشروح
تشمل المعروضة كل السابق بغض النظر عن الزمن. تحتاج المدة مجالاً زمنياً مدعوماً وسياسة وقت ومتأخرات وتعادل. لا تسم التراكم معدل ساعة لوجود تواريخ؛ اختبر الحدود.
أهم ما تعلمته
- تحفظ النوافذ التفاصيل ويحتاج التدفق هوية وتعافياً.
- يجب التصريح بالكتابة المشتقة وحدود المرحلة.