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

Apache Kafka / المتوسط: العقود والأعطال وقابلية الرصد / الدرس 11

الآثار الخارجية ونمط صندوق الصادر

تحليل الكتابة المزدوجة ووضع أدلة النقل الدائمة داخل المعاملة المرجعية.

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

أهداف الدرس

  • تحديد فجوة الكتابة المزدوجة بين قاعدة البيانات وKafka.
  • شرح تكرار ناقل الصادر وتحمل الوجهة للتكرار.

نجاح عمليتين لا يجعلهما معاملة واحدة

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

حفظ النية مع تغير الحالة

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

sql رسم توضيحي لمعاملة الصادر
BEGIN;
UPDATE lab_orders SET status = 'confirmed' WHERE id = 17;
INSERT INTO lab_outbox (event_id, aggregate_id, event_type)
VALUES ('evt-order-17', 17, 'order-confirmed');
COMMIT;

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

الناقل يحتاج تسليماً يتحمل التكرار

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

نمذجة نية مكررة عند الوجهة

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

python فحص محلي لاتساق الهوية
deliveries = [('evt-17', 'confirmed'), ('evt-17', 'confirmed'), ('evt-18', 'confirmed')]
unique = {}
for event_id, payload in deliveries:
    if event_id in unique:
        assert unique[event_id] == payload
    unique[event_id] = payload
assert len(unique) == 2
print(len(unique))
الناتج المتوقع
2

يجب تطابق حمولة النسخة المكررة؛ ولا يحاكي المثال معاملة دائمة.

المصالحة وفق تغطية العمل

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

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

طلب مثبت بلا حدث بعد تعطل.

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

نشر الناقل الحدث مرتين.

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

حمل المعرف نفسه حمولتين مختلفتين.

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

اختبر فهمك

1. هل يضمن الصادر إرسال بريد بعيد مرة واحدة تلقائياً؟

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

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

2. لماذا لا يكون تعليم منشور قبل الإرسال حلاً آمناً للتكرار؟

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

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

أهم ما تعلمته

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

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