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

هندسة البيانات / المتقدم: الصحة الموزعة والموثوقية / الدرس 14

دلالات التسليم والوجهات الداعمة للمعاملات

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

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

أهداف الدرس

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

يجب أن يحدد ادعاء «مرة واحدة» الأثر المعدود

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

ميّز محاولات التسليم من أحداث الأعمال الفريدة

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

python عد محلي لمحاولات التسليم والأحداث
deliveries = ['e1', 'e1', 'e2']
assert len(deliveries) == 3
assert len(set(deliveries)) == 2
assert deliveries.count('e1') == 2

تمثل المحاولات الثلاث هويتين فقط. لا يشمل النموذج محتوى الأحداث أو الديمومة.

اقرأ ضمانات المراسلة مع شروطها المسبقة

توثق Kafka المنتج الآمن للتكرار والمعاملات ضمن بروتوكولها المدعوم، بما فيه تنسيق السجلات ومواضع المستهلك المؤهلة. تعتمد الرؤية المعاملاتية على سلوك قارئ مناسب مثل read_committed. لا يحفظ ذلك تلقائياً مستودعاً بعيداً أو إخطار HTTP أو قاعدة تطبيق خارج الحد بصورة ذرية. تحقق من دعم الموصل والوجهة للإصدارات والإعدادات المختارة. لا يثبت الدرس وسيطاً أو عميلاً ولا يقدم إعداد Kafka قابلاً للنشر؛ يستخدم توثيق تصميم 4.1 للمصطلحات ونماذج محلية محدودة صراحة.

اعتمد هوية الحدث وأثره معاً داخل المعاملة المحلية

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

python معاملة محلية لهوية الحدث وأثره في ذاكرة SQLite
import sqlite3

db = sqlite3.connect(':memory:', isolation_level=None)
db.executescript('CREATE TABLE seen(id TEXT PRIMARY KEY); CREATE TABLE total(amount INTEGER); INSERT INTO total VALUES(0);')
for event_id, amount in [('e1', 25), ('e1', 25)]:
    db.execute('BEGIN')
    inserted = db.execute('INSERT INTO seen VALUES(?) ON CONFLICT(id) DO NOTHING', (event_id,)).rowcount
    if inserted == 1:
        db.execute('UPDATE total SET amount=amount+?', (amount,))
    db.execute('COMMIT')
assert db.execute('SELECT amount FROM total').fetchone()[0] == 25
assert db.execute('SELECT COUNT(*) FROM seen').fetchone()[0] == 1
db.close()

ينتج عن التسليمين حدث واحد ومجموع 25. ينتهي الضمان عند حدود المعاملة المحلية.

صمّم التعامل مع كل حد غير محسوم قبل تفعيل الإعادة

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

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

وصف وضع المنتج غير المكرر للأثر بأنه يضمن فوترة خارجية مرة واحدة.

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

اعتماد سجل منع التكرار دون اعتماد الأثر.

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

تحول إعادة حدث قديم إلى رسم مالي جديد.

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

اختبر فهمك

1. يعتمد مستهلك موضعه بعد إرسال بريد. هل يمكن لانهيار أن يكرر البريد؟

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

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

2. لماذا لا ينبغي تجاهل اختلاف المبلغ للهوية نفسها باعتباره إعادة عادية؟

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

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

أهم ما تعلمته

  • سمِّ الأثر وحدوده في كل ضمان تسليم.
  • تحتاج سلامة إعادة المعالجة هوية دائمة وقبولاً منسقاً.

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