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

Apache Kafka / المتقدم: المعالجة الذرية وتصميم التعافي / الدرس 14

حالة Streams والنوافذ والبيانات المتأخرة

ربط قرارات بنية Kafka Streams بالمفاتيح والزمن والحالة المحلية والتعافي.

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

أهداف الدرس

  • التمييز بين أحداث KStream وتحديثات KTable.
  • شرح زمن الحدث وعضوية النافذة وسياسة الوصول المتأخر.

يجيب التدفق والجدول عن سؤالين مختلفين

Kafka Streams مكتبة عميل لبناء بنى معالجة فوق Kafka. يمثل KStream سلسلة سجلات، بينما يمثل KTable تحديثات حالة بالمفتاح. يختلف عد كل أحداث حالة الطرود عن عد الطرود الحالية في كل حالة؛ إذ يحتاج الثاني حساب الاستبدال والسحب عند التغير. يؤثر الاختيار في التجميع والتحديثات الناتجة. قد تدعم موضوعات changelog استعادة مخازن الحالة، لكن الدليل المحلي ليس خطة التعافي كلها. تحتاج هوية التطبيق وأسماء البنية وتوافق الموضوعات الداخلية إدارة دورة حياة مقصودة.

اختيار الساعة قبل النافذة

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

حساب حدود نافذة متعاقبة معلنة

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

python عضوية محلية لنافذة نصف مفتوحة
def window_start(timestamp_s, width_s=10):
    return (timestamp_s // width_s) * width_s
assert window_start(0) == 0
assert window_start(9) == 0
assert window_start(10) == 10
print(window_start(9), window_start(10))
الناتج المتوقع
0 10

حاويات العشر ثوان اتفاق حسابي معلن وليست اختبار تشغيل Streams.

تحديد مفتاح التجميع ومعنى الناتج

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

python عد محلي للأحداث حسب المستودع والنافذة
from collections import Counter
events = [('D1', 2), ('D1', 9), ('D2', 10)]
counts = Counter((depot, timestamp // 10 * 10) for depot, timestamp in events)
assert counts[('D1', 0)] == 2
assert counts[('D2', 10)] == 1
print(counts[('D1', 0)], counts[('D2', 10)])
الناتج المتوقع
2 1

يعد كل حدث معطى مرة؛ ولا ينفذ سماحاً أو سياسة تكرار.

مراجعة تغير البنية بوصفه ترحيل حالة

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

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

عد تحديث الحالة كياناً مستقلاً جديداً.

لماذا يحدث؟
اعتبار تحديث الجدول حدث إلحاق مستقل.
كيف تصلحه؟
اختر سلوك KTable أو KStream وفق سؤال العمل.
كيف تتجنب تكراره؟
اختبر الاستبدال والحذف في التجميع.

عدم نهائية النافذة مع تقدم الساعة الجدارية وحدها.

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

استعادة حالة بمعنى غير متوافق بعد ترقية.

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

اختبر فهمك

1. هل ينتمي الزمن 10 إلى [0,10) أم [10,20)؟

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

ينتمي إلى [10,20) لأن الحد الأعلى مستبعد والأدنى مشمول. يضع ذلك كل زمن في حاوية واحدة. لا يحدد الحساب وحده قبول سجل متأخر بعد تجاوز زمن التدفق للنافذة وفترة السماح.

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

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

تمثل النتيجة مستودعاً خلال فترة محددة. استخدام المستودع وحده قد يجعل الفترة الجديدة تستبدل السابقة في وجهة بالمفتاح. أدرج هوية فترة ثابتة وحدد هل القيم بدائل كاملة أم زيادات حتى لا تفسد الإعادة والتحديثات التقرير.

أهم ما تعلمته

  • يحدد الزمن والمفتاح ودلالات التدفق والجدول النتيجة.
  • تحتاج تغيرات البنية ذات الحالة تخطيط التعافي والتوافق.

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