Latest articles
JOURNAL INDEX
قواعد البيانات/2026.10.12/2 VIEWS/5 MIN READ

Change Data Capture (CDC): Reliable Data Sync and the Outbox Pattern

عبدالرحمن ربيع علي
Abdelrahman Rabie Ali Software Engineer & AI Builder

A practical guide to CDC approaches, transaction logs, triggers, polling, the Outbox pattern, duplicates, ordering, and recovery.

Change Data Capture (CDC): دليل عملي لمزامنة البيانات الموثوقة ونمط Outbox

تحتاج الأنظمة الحديثة إلى إبقاء أكثر من مكوّن على معرفة بالتغييرات نفسها: قاعدة تشغيلية، ومستودع تحليلات، ومحرك بحث، وخدمة إشعارات، أو نظام خارجي. المشكلة ليست نقل الصفوف فحسب؛ بل نقل التغييرات بالترتيب الصحيح، من دون فقد أحداث أو تكرار آثارها أو تحميل قاعدة الإنتاج باستعلامات استطلاع متواصلة. هنا تظهر تقنية Change Data Capture (CDC)، أي التقاط تغييرات البيانات، بوصفها طريقة لبناء تدفقات تحديث يمكن مراقبتها وإعادة تشغيلها.

يشرح هذا الدليل كيف تعمل CDC، ومتى تكون قراءة سجل المعاملات أفضل من المشغلات أو الاستطلاع الدوري، وكيف يتكامل نمط Outbox معها عندما تحتاج إلى نشر حدث من داخل معاملة أعمال. سنناقش التأخير، والترتيب، والتكرار، وإعادة المعالجة، والمخططات المتغيرة، والمراقبة، والأمن، ثم ننتهي بخطة تنفيذ واختبارات تشغيلية. الهدف ليس اختيار أداة بعينها، بل بناء مسار بيانات يمكن الوثوق به عندما تتأخر الشبكة أو يتوقف المستهلك أو يعاد تشغيل العامل.

تذكّر أن CDC ليست بديلًا عن تصميم البيانات الجيد ولا ضمانًا تلقائيًا للتسليم مرة واحدة فقط. إنها آلية لالتقاط التغيير؛ أما معنى الحدث، وسياسة التكرار، والتعافي، واتساق الأنظمة التابعة فتظل مسؤولية التصميم.

1. ما المقصود بالتقاط تغييرات البيانات؟

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

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

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

حالة الصف أم سجل الأحداث؟

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

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

2. الطرق الأساسية لتنفيذ CDC

الاستطلاع الدوري (Polling): يقرأ التطبيق الصفوف التي تغيرت منذ آخر علامة محفوظة، غالبًا باستخدام عمود مثل updated_at أو رقم متزايد. إنه واضح وسهل البدء، لكنه لا يلتقط الحذف دائمًا، وقد يفوّت تغييرات إذا كانت العلامة غير دقيقة أو كان ترتيب المعاملات مختلفًا عن ترتيب التوقيت. كما أن الاستطلاع المتكرر قد يزيد الحمل على قاعدة البيانات حتى عندما لا توجد تغييرات.

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

قراءة سجل المعاملات (Log-based CDC): تقرأ الأداة سجلًا مثل binlog في MySQL أو WAL في PostgreSQL، ثم تحول التغييرات الملتزمة إلى أحداث. غالبًا ما تقلل هذه الطريقة العبء الإضافي على استعلامات التطبيق وتلتقط الإدراج والتعديل والحذف، لكنها تتطلب إعدادًا صحيحًا للسجل والصلاحيات والاحتفاظ به والتعامل مع تطور المخطط وإعادة الاتصال.

لا توجد طريقة أفضل في كل الحالات. اختر الاستطلاع عندما يكون التأخير المقبول بالدقائق والحجم صغيرًا والبيانات قابلة للاستعلام الآمن. استخدم المشغلات عندما تحتاج إلى تسجيل بسيط داخل المعاملة وتستطيع ضبط أثرها. وفضّل CDC المعتمدة على السجل عندما تحتاج إلى تدفق واسع ومستمر وتملك القدرة على تشغيل ومراقبة موصل متخصص.

3. نمط Outbox: كيف تربط معاملة الأعمال بالحدث؟

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

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

لكن Outbox لا يجعل الإرسال «مرة واحدة بالضبط» تلقائيًا. قد ينشر العامل الرسالة ثم يتوقف قبل تسجيل نجاحها، فيعيد إرسالها بعد التشغيل. لهذا يجب أن تكون الرسائل قابلة للتكرار بأمان، وأن يستخدم المستهلك event_id ثابتًا لتسجيل ما عالجه. في الأنظمة الحساسة، يمكن أن يحفظ المستهلك معرف الحدث في جدول inbox داخل المعاملة نفسها التي تطبق أثره، ثم يتجاهل أي نسخة لاحقة من الحدث نفسه.

اختر بين Outbox وCDC وفق حدود الثقة والتعقيد. قد يقرأ موصل CDC جدول outbox من سجل المعاملات، فيجمع النمطين: تضمن معاملة التطبيق وجود الحدث، وتتكفل CDC بتوصيله. أما التقاط كل تغييرات الجداول مباشرة فيمكن أن يكون مناسبًا للتحليلات أو الفهرسة، لكنه لا يحدد وحده المعنى التجاري لكل تغيير. من المفيد مراجعة دليل عقود البيانات واختبارات الجودة عند تعريف بنية الأحداث وشروطها، ومراجعة شرح عزل المعاملات وMVCC لفهم حدود التزامن داخل المصدر.

مقالات ذات صلة

4. الترتيب والتكرار ونقاط الاستئناف

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

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

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

تطور المخطط والتوافق

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

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

5. المراقبة والتعافي والأمن

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

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

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

الأمن والخصوصية

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

6. خطة تنفيذ عملية

  1. حدد الهدف: اكتب متطلبات التأخير، والحجم، والحذف، والترتيب، والاحتفاظ، والتعافي.
  2. عرّف الحدث: اختر معرفًا ثابتًا، واسمًا واضحًا، وإصدار مخطط، وسياسة للحقول الحساسة.
  3. اختر الآلية: قارن الاستطلاع والمشغلات وقراءة السجل بحسب قدرة الفريق وحمل المصدر.
  4. صمم المستهلك: اجعله قابلًا لإعادة المحاولة، وطبق إزالة التكرار، وتعامل مع الأحداث القديمة والحذف.
  5. اختبر الاستعادة: جرّب الانقطاع واللقطة وإعادة التشغيل وتطور المخطط قبل الإنتاج.
  6. أضف الرصد: راقب التأخير والأخطاء والتراكم والموارد ونقاط الاستئناف.

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

7. كيف تقيس نجاح التدفق؟

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

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

مشاهد توضيحية للبنية والتشغيل

رفوف خوادم مضاءة تمثل البنية التحتية التي تنقل تغييرات قواعد البيانات بين الأنظمة

المصدر: Pexels — المصور panumas nikhomkhai — ترخيص Pexels License.

محطة عمل أمام رفوف الخوادم توضح البيئة التشغيلية التي تدعم معالجة الأحداث وتوزيعها

المصدر: Pexels — المصور Brett Sayles — ترخيص Pexels License.

أضواء الخوادم في مركز البيانات ترمز إلى مراقبة تدفق البيانات واستمرارية المعالجة

المصدر: Pexels — المصور panumas nikhomkhai — ترخيص Pexels License.

رفوف خوادم مضاءة تمثل البنية التحتية لنقل تغييرات قواعد البيانات بين الأنظمة

المصدر: Pexels، المصور panumas nikhomkhai، ترخيص Pexels License.

محطة عمل أمام رفوف الخوادم توضح البيئة التشغيلية التي تدعم معالجة الأحداث وتوزيعها

المصدر: Pexels، المصور Brett Sayles، ترخيص Pexels License.

أضواء الخوادم في مركز البيانات ترمز إلى مراقبة تدفق البيانات واستمرارية المعالجة

المصدر: Pexels، المصور panumas nikhomkhai، ترخيص Pexels License.

مقالات ذات صلة

SHARE Share this article
عبدالرحمن ربيع علي
Written by

Abdelrahman Rabie Ali

Software Engineer & AI Builder

Full-stack software engineer and graphic designer with 4+ years building modern web applications using PHP, JavaScript, HTML, and CSS. Strong UI/UX background and advanced use of AI tools to boost development efficiency, automation, and decision-making.

Article tags

#Change Data Capture #CDC #Data Engineering #Outbox Pattern #Data Pipelines #Databases
RELATED / READ NEXT

Related articles

All articles
تقسيم قواعد البيانات Partitioning وSharding: كيف تختار الاستراتيجية المناسبة للتوسع والأداء
2026.10.08 · 31 VIEWS

Database Partitioning and Sharding: How to Choose the Right Strategy for Scale and Performance

Read article
عزل المعاملات وMVCC في قواعد البيانات: دليل عملي لمنع التعارضات والـDeadlocks
2026.10.06 · 20 VIEWS

Database Transaction Isolation and MVCC: A Practical Guide to Concurrency and Deadlocks

Read article
استراتيجيات فهرسة MySQL الحديثة: كيف تختار الفهارس المركبة وتمنع بطء الاستعلامات
2026.10.05 · 21 VIEWS

Modern MySQL Indexing Strategies: Composite Indexes, Trade-offs, and Query Performance

Read article
فهم EXPLAIN في MySQL وLaravel: دليل عملي لاكتشاف الاستعلامات البطيئة وتحسينها
2026.10.02 · 30 VIEWS

Understanding EXPLAIN in MySQL and Laravel: A Practical Guide to Finding Slow Queries

Read article
COMMENTS

Comments

Be the first to comment on this article.

Add your comment

Your comment appears after review.

جروب فيسبوك محتوى مموّل جروب فيسبوك انضم الي جروب مجتمع مبرمجي المستقبل انضم الان