Apache Kafka / الأساسي: السجلات والأقسام وتقدم القارئ / الدرس 1
الأحداث والموضوعات وبنية KRaft
تحديد موضع الحدث داخل Kafka والتمييز بين تخزين السجلات وسلوك العميل وبيانات العنقود الوصفية.
في هذه الصفحة
أهداف الدرس
- شرح مسؤوليات المنتجين والوسطاء والمتحكمات والمستهلكين.
- اختيار هوية الحدث والتمييز بين سجل الإلحاق والحالة الحالية.
الحدث يسجل واقعة
يعبّر الحدث عن واقعة، مثل قبول طرد اصطناعي في مستودع. تؤدي هوية الحدث ووقت حدوثه ومفتاحه التجاري وحمولته وظائف مختلفة: تميز الهوية الواقعة عن إعادة المحاولة، ويحدد المفتاح المعالجة المترابطة، ويشير الوقت إلى ساعة مختارة، وتحمل الحمولة تفاصيل الواقعة. يخزن Kafka سجلات متسلسلة، وتبقى هذه المعاني اتفاقاً تطبيقياً. حدد الجهة التي تصدر الواقعة وكيف تمثل التصحيحات بأحداث جديدة. تسهل إعادة تشغيل حدث parcel-created بأمان عندما يصف قراراً مكتملاً بدلاً من مطالبة كل قارئ ضمنياً بتنفيذ إجراء لا يمكن التراجع عنه.
فحص سجل اصطناعي
يفصل مثال JSON بين معرف الحدث ومعرف الطرد. قد تشترك واقعتان مختلفتان تخصان P17 في المفتاح التجاري، مع معرف حدث مختلف لكل منهما. أما إعادة إرسال الواقعة نفسها فتحافظ على evt-101. الحقول والترويسات اختيارات تطبيقية ولا تعني أن الوسيط يتحقق من مخطط البيانات. المثال تمثيل مقروء لبايتات قد يسلسلها المنتج، وليس صيغة بروتوكول Kafka. على القارئ رفض إصدارات الأحداث غير المدعومة بوضوح، وتجنب وضع عناوين شخصية في المفاتيح لأنها قد تظهر في السجلات ومؤشرات المراقبة والتحقيقات التشغيلية.
{"event_id":"evt-101","event_version":1,"key":"P17","type":"parcel-created","status":"accepted"}
يجمع المفتاح تاريخ الطرد، وتحدد event_id واقعة واحدة. صحة JSON لا تنشئ عقد مخطط داخل Kafka.
الفصل بين البيانات وبيانات الإدارة
يقدم الوسيط سجلات الأقسام للمنتجين والمستهلكين، بينما تدير متحكمات KRaft البيانات الوصفية عبر نصاب المتحكمات، ومنها تعريفات الموضوعات وقيادة الأقسام وتسجيل الوسطاء. نسخ البيانات الوصفية لا يعني أن كل متحكم يخزن سجلات التطبيق. يخدم قائد القسم حركة قسمه، وتنسخ النسخ التابعة سجله. يمكن جمع الأدوار في عروض صغيرة، لكن توزيعها في الإنتاج يحتاج تصميماً واضحاً للإتاحة والسعة. يعتمد هذا المقرر وثائق Apache Kafka 4.1؛ تستخدم سلسلة 4.x آلية KRaft، ولا تصف تعليمات ZooKeeper القديمة هذا الأساس.
نمذجة التاريخ والحالة المشتقة
يشتق المثال المحلي حالة الطرد الحالية من حدثين وفق ترتيبهما المعلن. يبقى الحدثان في التاريخ، رغم احتفاظ القاموس بالحالة الأخيرة للمفتاح فقط. يوضح ذلك كيف يخدم Kafka قراء مستقلين بإسقاطات مختلفة: قد يشتق أحدهم تقدم التسليم، بينما يحسب آخر وصول الطرود إلى المستودعات. قاموس Python ليس وسيطاً ولا معاملة موزعة ولا مخزن أحداث كاملاً؛ نتيجته الصغيرة توضح قاعدة الاشتقاق فقط. تحتاج إعادة التشغيل الفعلية أيضاً إلى معالجة الإصدارات والتكرار وافتراضات الترتيب وسياسة للأحداث المتعارضة مع الوقائع السابقة.
events = [('P17', 'accepted'), ('P17', 'sorted')]
current = {}
for key, status in events:
current[key] = status
assert len(events) == 2
assert current == {'P17': 'sorted'}
print(current['P17'])
sorted
ينتج عن واقعتين مدخل حالة واحد، دون استخدام خدمة Kafka.
تحديد حدود التشغيل
يفيد Kafka عندما يحل التاريخ المحتفظ به والقراء المستقلون مشكلة محددة. لا يستبدل تلقائياً قاعدة البيانات المرجعية، ولا يضمن نجاح بريد خارجي، ولا يغني عن تصميم العقود. ابدأ بتدفق اصطناعي محدود وحدد التأخر المقبول ومدة الاحتفاظ ومتطلبات التعافي. سجل إصدارات العملاء والوسطاء والميزات المفعلة معاً. لا يشغل هذا المحتوى وسيطاً ولا يهيئ تخزيناً ولا يتصل بنقطة نهاية مضبوطة. تبقى أمثلة الإعداد لاحقاً توضيحية، ويعتمد السلوك المتوقع دائماً على البيئة المعلنة.
الأخطاء الشائعة وإصلاحها
اعتبار المتحكم نسخة من جميع بيانات الموضوعات.
- لماذا يحدث؟
- الخلط بين نسخ البيانات الوصفية ونسخ الأقسام.
- كيف تصلحه؟
- ارسم نصاب المتحكمات منفصلاً عن مجموعة نسخ كل قسم.
- كيف تتجنب تكراره؟
- راجع أعطال مستوى البيانات ومستوى الإدارة بصورة مستقلة.
إعطاء إعادة المحاولة معرفاً جديداً واحتسابها مرتين.
- لماذا يحدث؟
- استبدال هوية الواقعة التجارية بهوية محاولة الطلب.
- كيف تصلحه؟
- احتفظ بمعرف الحدث الأصلي عند إعادة إرسال الواقعة نفسها.
- كيف تتجنب تكراره؟
- وثق موضع إنشاء معرفات الأحداث وحفظها.
تضمين ZooKeeper مكوناً مطلوباً في تصميم Kafka 4.1.
- لماذا يحدث؟
- تطبيق دليل إعداد قديم دون مراجعة الإصدار.
- كيف تصلحه؟
- استخدم وثائق KRaft المختارة وقيّم ترحيل الأنظمة القديمة منفصلاً.
- كيف تتجنب تكراره؟
- سجل أساس الوثائق وبيئة التشغيل بدقة.
اختبر فهمك
1. هل ينبغي أن يحمل parcel-created وparcel-sorted للطرد P17 معرف الحدث نفسه؟
اعرض الحل المشروح
لا؛ فهما واقعتان مختلفتان تحتاجان معرفين مختلفين، مع إمكان بقاء المفتاح P17. تحتفظ إعادة محاولة parcel-created بمعرفها الأصلي. بذلك يجمع المستهلك الوقائع حسب الطرد ويميز إعادة الإرسال دون اعتبار تغير الحالة اللاحق المشروع نسخة مكررة.
2. لماذا لا يثبت نجاح الاشتقاق المحلي التعافي بعد فقدان وسيط؟
اعرض الحل المشروح
يختبر القاموس تحويلاً حتمياً لبيانات في الذاكرة؛ ولا يحتوي سجلاً منسوخاً أو نصاب متحكمات أو تخزيناً دائماً أو بروتوكول عميل. يتطلب التعافي أدلة عن النسخ والإقرارات والبيانات المحتفظ بها، ولذلك يوصف هذا الفحص بأنه اختبار اشتقاق محلي فقط.
أهم ما تعلمته
- تؤدي هوية الحدث والمفتاح والطابع الزمني أغراضاً مختلفة.
- تحتاج إتاحة بيانات KRaft الوصفية وإتاحة بيانات الأقسام تحليلاً منفصلاً.