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

هندسة البيانات / الأساسي: العقود والدفعات القابلة للإعادة / الدرس 6

الدفعات الحتمية والتشغيل بلا تكرار أثر

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

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

أهداف الدرس

  • شرح المدخل الحتمي وهوية منع التكرار.
  • تمييز المحاولة المعادة والحدث الجديد.

ليست الإعادة دفعة جديدة بالضرورة

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

صرح بتمثيل دفعة لا يعتمد ترتيب الوصول

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

python توحيد تمثيل دفعة محلي معلن
import hashlib
import json

def batch_digest(rows):
    ordered = sorted(rows, key=lambda row: row['event_id'])
    payload = json.dumps(ordered, sort_keys=True, separators=(',', ':')).encode('utf-8')
    return hashlib.sha256(payload).hexdigest()

rows = [{'event_id': 'e2', 'qty': 2}, {'event_id': 'e1', 'qty': 1}]
assert batch_digest(rows) == batch_digest(list(reversed(rows)))

لا يغير عكس الوصول البصمة بهذه السياسة دون ادعاء أصالة أو هوية عمل بلا تعارض.

امنع التكرار بهوية الحدث المطلوب

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

طبق الحدث المعاد مرة في وجهة معزولة

يستخدم برنامج SQLite الكامل في الذاكرة مفتاحاً أساسياً وDO NOTHING ليقبل تسليم الحدث الاصطناعي نفسه مرتين دون صفين، ويتحقق من المبلغ المحفوظ. تناسب السياسة فقط عندما يكشف اختلاف محتوى الهوية منفصلاً أو يعرف استحالته؛ وإلا أخفاه DO NOTHING. تتوفر UPSERT منذSQLite3.24.0، ويفحص المقرر بيئة التشغيل الفعلية قبل وسم الأمثلة بالقابلة للتشغيل. لا ينشئ البرنامج ملف قرص أو اتصالاً معداً أو خدمة، ويغلق قاعدة الذاكرة.

python عينة هوية بلا تكرار في ذاكرة SQLite
import sqlite3

db = sqlite3.connect(':memory:')
db.execute('CREATE TABLE event(id TEXT PRIMARY KEY, amount INTEGER NOT NULL)')
for _ in range(2):
    db.execute('INSERT INTO event VALUES(?,?) ON CONFLICT(id) DO NOTHING', ('e1', 25))
assert db.execute('SELECT COUNT(*),SUM(amount) FROM event').fetchone() == (1, 25)
db.close()

تنتج محاولتان صفاً ومجموع25، وتبقى معالجة المحتوى المتعارض متطلباً منفصلاً.

نسق الأثر المقبول مع التقدم

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

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

تضيف كل إعادة نسخة

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

تتخطى النقطة أثراً غير محفوظ

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

تعد البصمة إثبات ثقة الدفعة

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

اختبر فهمك

1. يدرج التحويل الحتمي عشرة صفوف كل إعادة. هل الوجهة آمنة للتكرار؟

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

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

2. لماذا يخفي DO NOTHING مشكلة مصدر خطرة؟

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

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

أهم ما تعلمته

  • الحتمية وسلامة التطبيق المعاد ضمانان مختلفان.
  • تجعل الهوية والتقدم المنسق الإعادة قابلة للمراجعة.

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