البيانات الضخمة وأنظمة البث

معماريات البث: Kafka و Kinesis والبث الحدثي

5 دقيقة للقراءة

فهم معماريات البث ضروري لأدوار هندسة البيانات الحديثة. يغطي هذا الدرس Apache Kafka و AWS Kinesis والمفاهيم الأساسية لأنظمة البيانات المدفوعة بالأحداث.

أساسيات البث الحدثي

المعالجة الدفعية مقابل البث

الجانب المعالجة الدفعية معالجة البث
الكمون ساعات إلى أيام ميلي ثانية إلى ثواني
البيانات مجموعات بيانات محدودة تدفق مستمر غير محدود
المعالجة مرة لكل دفعة مستمرة
الحالة عادة بدون حالة مع حالة
حالات الاستخدام ETL، التقارير، تدريب ML تحليلات الوقت الحقيقي، التنبيه، اكتشاف الاحتيال

نموذج البيانات المتدفقة

+----------+     +---------+     +------------+     +----------+
| المصادر  | --> | وسيط    | --> | محرك      | --> | المخرجات |
| (أحداث)  |     | الرسائل |     | المعالجة  |     |          |
+----------+     +---------+     +------------+     +----------+
                     |
                     v
              سجل أحداث دائم
              ومرتب

المفاهيم الرئيسية:

  • الأحداث: حقائق غير قابلة للتغيير حدثت في نقطة زمنية
  • المنتجون: التطبيقات التي تنشر الأحداث
  • المستهلكون: التطبيقات التي تشترك وتعالج الأحداث
  • المواضيع/التدفقات: فئات أو تغذيات الأحداث
  • الأقسام: تقسيمات فرعية للتوازي والترتيب

Apache Kafka بالتفصيل

معمارية Kafka

+------------------+     +------------------+     +------------------+
|    Producer 1    |     |    Producer 2    |     |    Producer 3    |
+--------+---------+     +--------+---------+     +--------+---------+
         |                        |                        |
         +------------------------+------------------------+
                                  |
                                  v
         +------------------------------------------------+
         |              Kafka Cluster                      |
         |  +--------+  +--------+  +--------+            |
         |  |Broker 1|  |Broker 2|  |Broker 3|            |
         |  +--------+  +--------+  +--------+            |
         |                                                 |
         |  Topic: orders (3 أقسام, RF=3)                 |
         |  +--------+  +--------+  +--------+            |
         |  |  P0    |  |  P1    |  |  P2    |            |
         |  |Leader  |  |Leader  |  |Leader  |            |
         |  +--------+  +--------+  +--------+            |
         +------------------------------------------------+
                                  |
         +------------------------+------------------------+
         |                        |                        |
         v                        v                        v
+--------+---------+     +--------+---------+     +--------+---------+
|   Consumer 1     |     |   Consumer 2     |     |   Consumer 3     |
| (القسم 0)        |     | (القسم 1)        |     | (القسم 2)        |
+------------------+     +------------------+     +------------------+
         |________________________|________________________|
                      Consumer Group: order-processors

سؤال المقابلة: "اشرح ضمانات الديمومة والترتيب في Kafka"

نموذج الإجابة:

"يوفر Kafka ضمانات قوية للديمومة والترتيب:

الديمومة:

  • الرسائل تُحفظ على القرص قبل التأكيد
  • عامل النسخ (RF) يحدد عدد النسخ الموجودة
  • مع RF=3 و acks=all، البيانات تنجو من فقدان وسيطين
  • ISR (النسخ المتزامنة) يضمن أن النسخ المحدثة فقط يمكنها أن تصبح قائدة

ضمانات الترتيب:

  • داخل القسم: ترتيب صارم مضمون (الرسائل تُعالج بترتيب الإزاحة)
  • عبر الأقسام: لا ضمان للترتيب
  • للحفاظ على الترتيب للأحداث المرتبطة، استخدم نفس مفتاح القسم

مثلاً، لضمان ترتيب جميع أحداث العميل:

# جميع الرسائل بنفس customer_id تذهب لنفس القسم
producer.send('orders',
              key=customer_id.encode(),
              value=order_data)
```"

### تكوين منتج Kafka

```python
from confluent_kafka import Producer

producer_config = {
    'bootstrap.servers': 'broker1:9092,broker2:9092',

    # إعدادات الديمومة
    'acks': 'all',                      # انتظر جميع نسخ ISR
    'retries': 3,                       # أعد المحاولة عند الفشل العابر
    'retry.backoff.ms': 100,

    # ضبط الأداء
    'batch.size': 16384,                # تجميع الرسائل (بايت)
    'linger.ms': 5,                     # انتظر امتلاء الدفعة
    'buffer.memory': 33554432,          # 32MB buffer
    'compression.type': 'snappy',       # ضغط الدفعات

    # مرة واحدة بالضبط
    'enable.idempotence': True,
    'transactional.id': 'my-transactional-producer'
}

producer = Producer(producer_config)

سؤال المقابلة: "كيف تعمل مجموعات المستهلكين في Kafka؟"

نموذج الإجابة:

"مجموعات المستهلكين تمكّن المعالجة المتوازية والتحمل للأخطاء:

تعيين الأقسام:

  • كل قسم يُعيّن لمستهلك واحد بالضبط في المجموعة
  • إذا المستهلكون < الأقسام: بعض المستهلكين يتعاملون مع أقسام متعددة
  • إذا المستهلكون > الأقسام: المستهلكون الزائدون خاملون
  • الأمثل: المستهلكون = الأقسام لأقصى توازي

إعادة التوازن:

  • تُفعّل عند انضمام/مغادرة المستهلكين أو تغيير الأقسام
  • المنسق يعيد توزيع الأقسام بين المستهلكين
  • أثناء إعادة التوازن، المعالجة تتوقف (يؤثر على التوفر)"

AWS Kinesis

مقارنة Kinesis مقابل Kafka

الجانب Apache Kafka AWS Kinesis
النشر مُدار ذاتياً أو مُدار مُدار بالكامل
الاحتفاظ قابل للتكوين (غير محدود) 24 ساعة افتراضي، حتى 365 يوم
التقسيم Partitions Shards
الترتيب لكل قسم لكل Shard
التوسع إضافة أقسام (لا رجعة) تقسيم/دمج Shards
التسعير تكلفة البنية التحتية لكل shard-hour + البيانات
النظام البيئي Kafka Connect, KSQL Firehose, Analytics

سؤال المقابلة: "متى تستخدم Kinesis Data Firehose مقابل Data Streams؟"

نموذج الإجابة:

"الاختيار يعتمد على متطلبات المعالجة:

استخدم Kinesis Data Firehose عندما:

  • تحتاج توصيل بدون كود لـ S3، Redshift، Elasticsearch، أو Splunk
  • قرب الوقت الحقيقي مقبول (كمون 1-5 دقائق)
  • تريد توسع تلقائي بدون إدارة shards
  • التحويلات البسيطة (Lambda) كافية

استخدم Kinesis Data Streams عندما:

  • تحتاج كمون أقل من ثانية
  • منطق معالجة مخصص مطلوب
  • مستهلكون متعددون يحتاجون قراءة نفس التدفق
  • تحتاج قدرة إعادة التشغيل
  • معالجة تدفق معقدة مع Kinesis Data Analytics"

أنماط المعمارية المدفوعة بالأحداث

Event Sourcing

CRUD التقليدي:
+-------------+
|   Orders    |  <- الحالة الحالية فقط
| id | amount |
+----+--------+
| 1  | 150.00 |  <- لا تاريخ للتغييرات
+----+--------+

Event Sourcing:
+------------------------------------------+
|              Order Events                |
| event_id | order_id | type     | payload |
+----------+----------+----------+---------+
| E1       | O1       | Created  | $100    |
| E2       | O1       | Updated  | $150    |
| E3       | O1       | Shipped  | ...     |
+------------------------------------------+

الفوائد:

  • مسار تدقيق كامل
  • يمكن إعادة بناء الحالة في أي نقطة
  • يدعم الاستعلامات الزمنية
  • يمكّن إعادة تشغيل الأحداث للتصحيح

سؤال المقابلة: "صمم نظام اكتشاف احتيال في الوقت الحقيقي"

نموذج الإجابة:

"سأصمم هذا باستخدام معمارية بث:

المكونات:

  1. استيعاب الأحداث:
المعاملات --> Kafka Topic: transactions
                 (مقسم بـ user_id للترتيب)
  1. معالجة التدفق (Flink/Kafka Streams):
# قواعد اكتشاف الاحتيال
rules = [
    # القاعدة 1: فحص السرعة
    lambda events: len(events) > 10,  # >10 معاملات في النافذة

    # القاعدة 2: شذوذ المبلغ
    lambda events: max(e.amount for e in events) > 5 * avg_amount,
]
  1. محرك القرار:
+-----------+     +----------+     +------------+
| محرك      | --> | تسجيل    | --> | القرار     |
| القواعد   |     | نموذج ML |     | (حظر/      |
| (سريع)    |     | (دقيق)   |     |  علم/مرر) |
+-----------+     +----------+     +------------+

هدف الكمون: <100ms من المعاملة للقرار"

النقاط الرئيسية للمقابلات

  1. اعرف الأساسيات: المنتجون، المستهلكون، المواضيع، الأقسام، مجموعات المستهلكين
  2. افهم ضمانات الترتيب: الأقسام تمكّن الترتيب، وليس المواضيع
  3. دلالات التوصيل: مرة واحدة على الأكثر، مرة واحدة على الأقل، مرة واحدة بالضبط
  4. Kafka مقابل البدائل المُدارة: متى تستخدم Kafka مقابل Kinesis مقابل Pub/Sub
  5. أنماط مدفوعة بالأحداث: Event sourcing، CQRS، ومتى تطبقها

:::

اختبار

الوحدة 5: البيانات الضخمة وأنظمة البث

خذ الاختبار