Apache Kafka / المتقدم: المعالجة الذرية وتصميم التعافي / الدرس 13
المعاملات والعزل ومنع المالك القديم
ربط مخرجات Kafka بإزاحات القراءة مع تحديد حدود الذرية بدقة.
في هذه الصفحة
أهداف الدرس
- شرح المعرفات المعاملية ورؤية التثبيت ومنع المنتج القديم.
- تمييز ذرية المسار داخل Kafka عن الآثار الخارجية.
قد تشمل معاملة واحدة المخرجات والتقدم
يمكن لتدفق قراءة وتحويل وإنتاج أن يكتب المخرجات والإزاحات التالية للمجموعة في معاملة Kafka واحدة. يجعل التثبيت العمل مرئياً وفق البروتوكول، ويبقي الإلغاء مخرجاته خارج قراءة read_committed. يربط ذلك المخرجات بالتقدم فلا تعرض الإعادة تحويلاً جزئياً. لا يشمل بريداً أو طلب HTTP أو معاملة قاعدة بيانات عشوائية. حدد هذه الحدود عند ذكر المعالجة مرة واحدة. تبقى الآثار الخارجية محتاجة بروتوكول وجهة خاصاً، حتى مع إعداد معاملة Kafka إعداداً سليماً واستئناف المعالج بأمان.
إسناد هوية لمواضع المنتج المنطقية
يحدد transactional.id المنتج المعاملي عبر الاستئناف ويسمح بمنع النسخة الأقدم. يجب ألا تشترك نسخ نشطة عرضاً في المعرف، بينما يحتاج بديل الموضع المنطقي نفسه استراتيجية هوية متسقة. يضعف تغيير المعرف عشوائياً كل تشغيل علاقة الاستئناف المقصودة. يفصل جزء الإعداد إعداد المستهلك عن المنتج لأن transactional.id يخص المنتج. تبقى التهيئة والبدء والإرسال وربط الإزاحات والتثبيت والإلغاء بحاجة معالجة صحيحة للواجهة. ليس الجزء برنامج معاملة قابلاً للتنفيذ.
# Consumer properties
enable.auto.commit=false
isolation.level=read_committed
# Producer properties
transactional.id=lab-parcel-slot-0
تفصل التعليقات إعداد عميلين؛ وما زالت واجهات المعاملة مطلوبة.
قراءة المثبت لا تعني قراءة أحدث بايت دائماً
يستبعد مستهلك read_committed سجلات المعاملات الملغاة، وتقيد المعاملات الجارية ما يراه. قد تعيق معاملة مفتوحة الإزاحة المستقرة الأخيرة مع تقدم النهاية الفيزيائية للسجل. يبدو ذلك توقفاً في القراءة بينما المشكلة منتج معاملي طويل العمر أو فاشل. تخضع السجلات غير المعاملية لقواعد رؤيتها أيضاً؛ فلا تفترض أن كل سجل أنتج بمعاملة. راقب مدة المعاملات ونتائجها بدلاً من اعتبار العزل زر أداء. يغير خفض العزل لإخفاء التأخر السجلات التي قد تراها التطبيقات اللاحقة.
فصل سجلات البيانات المثبتة والملغاة
تسمي القائمة المحلية ثلاثة سجلات بحسب نتيجة المعاملة وتختار المثبت فقط. توضح توقع استبعاد المخرجات الملغاة دون تنفيذ علامات السجل أو الإزاحة المستقرة أو منسق Kafka. يبقى سجلان مثبتان ولا يدخل الثالث النتيجة. يحتاج اختبار عميل كامل أيضاً التعطل أثناء التثبيت وانتهاء مهلة المعاملة وإعادة الإسناد. لا تختبر هذه الأمثلة سلوك التشغيل ذاك عمداً. احصر ادعاء النموذج في تصفية التسميات المعطاة حتى لا يخلط القارئ تعبير قائمة Python بشهادة معاملات.
records = [('tx-a', 'committed', 'P17'), ('tx-b', 'aborted', 'P18'), ('tx-c', 'committed', 'P19')]
visible = [value for _, outcome, value in records if outcome == 'committed']
assert visible == ['P17', 'P19']
print(visible)
['P17', 'P19']
يصفي نتائج معلنة ولا يحاكي منسق Kafka أو تنفيذ العزل.
معالجة المنع بوصفه فقدان ملكية
لا ينبغي للمنتج الممنوع متابعة الكتابة كأنه ما زال يملك الموضع المعاملي. افصل حالته النهائية عن أخطاء يدعم عندها إلغاء المعاملة وإعادتها. اتبع توثيق واجهة العميل؛ فالتقاط كل استثناء ثم إعادة commit ليس تعافياً موثوقاً. حدد العمل داخل المعاملة ليسهل فهم المهل وإعادة التوازن. أدخل Kafka 4.0 بروتوكول معاملات أحدث بسلوك مرتبط بالإصدار، فراجع توافق العميل والوسيط معاً. لا يغير الدرس مستويات ميزات ولا يشغل منتجاً ولا يدعي اختبار معاملة حقيقية.
الأخطاء الشائعة وإصلاحها
منتجان نشطان يمنع أحدهما الآخر مراراً.
- لماذا يحدث؟
- اشتراكهما بمعرف معاملي لموضع منطقي واحد.
- كيف تصلحه؟
- صحح ربط النسخ بالمواضع وأوقف المالك القديم.
- كيف تتجنب تكراره؟
- اختبر قواعد الهوية عند الاستئناف والنشر المتزامن.
تكرار رسم خارجي رغم معاملات Kafka.
- لماذا يحدث؟
- وقوع الرسم خارج حدود ذرية Kafka.
- كيف تصلحه؟
- استخدم بروتوكول الوجهة المتحمل للتكرار والهوية الأصلية.
- كيف تتجنب تكراره؟
- حدد الأنظمة الداخلة في كل ادعاء ذرية.
تأخر read_committed مع نمو نهاية السجل.
- لماذا يحدث؟
- احتمال تقييد معاملة مفتوحة للرؤية المستقرة.
- كيف تصلحه؟
- اربط حالة المعاملة ومدتها قبل تغيير العزل.
- كيف تتجنب تكراره؟
- راقب مدة المعاملة ونتائجها النهائية.
اختبر فهمك
1. هل يلغي abortTransaction بريداً أرسل بين بدء المعاملة وتثبيتها؟
اعرض الحل المشروح
لا؛ لا يتحكم Kafka بالمزود الخارجي عبر معاملة المنتج. قد يبقى البريد مرسلاً مع إلغاء المخرجات. استخدم نية تسليم تقرؤها خدمة تتحمل التكرار أو بروتوكولاً مدروساً، واحفظ الهوية عبر المحاولات وردود المزود غير المؤكدة.
2. لماذا لا يكون المعرف المعاملي العشوائي الجديد دائماً سياسة جيدة؟
اعرض الحل المشروح
للمعرف غرض في الاستئناف والملكية، يشمل منع النسخ القديمة للموضع نفسه. قد يقطع التغيير العشوائي تلك العلاقة. وفي الوقت نفسه تحتاج المواضع النشطة المتزامنة معرفات مختلفة. صمم الربط لدورة النشر بدلاً من اختيار التفرد بلا معنى للملكية.
أهم ما تعلمته
- تربط معاملات Kafka المخرجات والتقدم المدعومين داخله.
- تراجع العزل ومدة المعاملة وهوية الملكية معاً.