Apache Airflow / دليل حلول تحريري

إنشاء الإعادة مخرجات مكررة أو آثاراً خارجية متكررة

تتبع قسم العمل وحد النشر غير المؤكد قبل إصلاح النتائج التاريخية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

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

افهم الأسباب المحتملة

  • قد تضيف المهمة البيانات في كل محاولة، أو تنشئ هوية عملية جديدة، أو تقرأ أحدث مدخل متغير، أو تعيد نشراً خارجياً نجح لكن فقد إقراره. لا تكفي حالة التنسيق وحدها للتمييز بين هذه النتائج؛ بل تلزم أدلة المصدر والعملية والوجهة.

مقارنة المحاولات بعمليات العمل

اجمع الفترة المقصودة وإصدار بيان المصدر وإصدار الحساب ومفتاح عملية الوجهة لكل محاولة. تعرف run_id وأرقام المحاولات تاريخ التنفيذ، بينما يعرف مفتاح العمل النتيجة التي ينبغي أن توجد مرة واحدة وفق عقد الوجهة. ميّز إصدارين مشروعين من تقرير واحد عن نسختين غير مقصودتين للإصدار نفسه. وافحص تغير المصدر أيضاً؛ فقد تعيد مهمة تقرأ latest حساب نتيجة مختلفة، لا مجرد نسخة مطابقة البايتات. احفظ الآثار الأصلية والأعداد قبل تعديل أي شيء، ووثق الإصدار المرجعي الذي ينبغي أن يستخدمه القراء اللاحقون.

تحديد موضع الفشل حول النشر

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

اختيار استبدال قابل للتكرار أو إصدارات صريحة

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

python نموذج محلي لهوية تقرير ثابتة
rows = [('P1', 200), ('P2', 300)]
reports = {}
for _ in range(2):
    reports[('2026-10-01', 'v1')] = tuple(rows)
assert len(reports) == 1
assert len(reports[('2026-10-01', 'v1')]) == 2
print(len(reports), len(reports[('2026-10-01', 'v1')]))
الناتج المتوقع
1 2

يبقي تطبيقان محليان تقريراً واحداً بصفين؛ ولا يثبت ضمان وجهة دائمة.

المصالحة قبل مرور تاريخي آخر

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

تحقق من نجاح الإصلاح

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

امنع تكرار المشكلة

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

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