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

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

التسلسل وتطور المخططات

جمع ترميز البايتات ومعنى الحدث وتوافق القارئ في عقد مراجع واحد.

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

أهداف الدرس

  • شرح مسؤوليات المسلسل وفاك التسلسل.
  • مراجعة الإضافات والقيم الغائبة وتغيرات المعنى غير المتوافقة.

يخزن الوسيط بايتات وبيانات سجل وصفية

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

التحقق من المعنى بعد فك التسلسل

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

python تحقق محلي من حمولة بإصدار
import json
event = json.loads('{"version":1,"weight_g":1250}')
assert event['version'] == 1
assert type(event['weight_g']) is int
assert event['weight_g'] >= 0
print(event['weight_g'])
الناتج المتوقع
1250

تتحقق التأكيدات من البيانات المعلنة وتستبعد القيمة المنطقية للوزن.

الإضافة ليست متوافقة تلقائياً

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

اختبار القراء القدامى والجدد ببيانات ثابتة

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

python قيمة افتراضية صريحة للحقل الغائب
def depot_of(event):
    return event.get('depot', 'unknown')

assert depot_of({'version': 1}) == 'unknown'
assert depot_of({'version': 2, 'depot': 'D2'}) == 'D2'
print(depot_of({'version': 1}))
الناتج المتوقع
unknown

يختار الغياب وحده unknown؛ أما None الصريحة فتبقى كما هي وفق العقد.

نشر القراء قبل الاعتماد على المعنى الجديد

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

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

حمولة JSON صحيحة تحمل وحدة وزن خاطئة.

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

كسر تغيير مسلسل المفتاح لترتيب الكيان.

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

فشل الإعادة بإصدار قديم غائب عن الحركة الحية.

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

اختبر فهمك

1. هل إضافة depot مطلوب آمنة لكل القراء والسجلات السابقة؟

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

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

2. لماذا يستخدم فحص weight_g التعبير type(value) is int؟

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

لأن العقد الصارم يستبعد القيم المنطقية رغم وراثة bool من int في Python. يستبعد فحص النوع الدقيق True وFalse. هذه نقطة تحقق خاصة باللغة؛ ويجب أن تحدد المخططات النطاق العددي والقيم الخالية والوحدات مستقلة عن تفاصيل الوراثة.

أهم ما تعلمته

  • يحتاج توافق البايتات والمعنى التجاري اختبارات.
  • يطيل التاريخ المحتفظ به التزامات دعم المخططات.

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