بازگشت به کتابخانهکتابخانه12.4CDC: ردیابی تغییرات دیتابیس
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 12.4فصل ۱۲زیر کاپوت دیتابیس و معماری داده

CDC: ردیابی تغییرات دیتابیس

  • ~۱۲ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

وقتی سفارشی در Postgres عوض می‌شود، ده سیستم دیگر باید بفهمند: ایندکس جستجو، کش، انبار داده، سرویس نوتیفیکیشن. به‌جای اینکه اپلیکیشن به همه خبر بدهد (dual-write خطرناک)، دیتابیس خودش جریان تغییرات را بیرون می‌دهد — این همان Change Data Capture است.

سه راه گرفتن تغییرات

روشایدهحقیقت تلخ
Pollingهر چند ثانیه SELECT روی ستون updated_atرکوردهای حذف‌شده دیده نمی‌شوند؛ دو باره‌خوانیِ جدول؛ تأخیر
Triggerروی هر تغییر در جدول، رکورد به جدول رویداد بنویسبار اضافه روی مسیر نوشتن دیتابیس
Log-basedخواندن WAL/binlog خودِ دیتابیس و تبدیل به رویداداستاندارد طلایی: بدون بار روی کوئری‌ها، بدون جاافتادن حتی DELETE

ابزار مرجع Debezium است: به WAL ی Postgres یا binlog ی MySQL وصل می‌شود و هر تغییر را به‌صورت رویداد در Kafka منتشر می‌کند. حالا هر مصرف‌کننده‌ای — Elasticsearch ،Redis ،Warehouse — با سرعت خودش از منبع حقیقت تغذیه می‌شود.

سه کاربرد که قبلاً دیده‌ای و حالا پیوند می‌خورد

  • Outbox relay (فصل ۵): رویداد در جدول outbox می‌نشیند؛ CDC همان جدول را خوانده و به Kafka می‌برد — الگوی Outbox بدون relay دست‌ساز.
  • همگام‌سازی ایندکس جستجو: نوشتن در DB، چند ثانیه بعد در Elasticsearch — سازگاری نهاییِ مهندسی‌شده به‌جای dual-write.
  • باطل‌سازی کش: رویداد تغییر رکورد → حذف کلید متناظر در Redis؛ دقیق‌تر از TTL حدسی.
  • ساخت Read Model برای CQRS: جریان تغییرات، نماهای خواندنی را به‌روز نگه می‌دارد.

ریزنکته‌ها

  • ترتیب: رویدادهای یک رکورد باید مرتب برسند — کلید پارتیشن Kafka را primary key بگذار.
  • تغییر schema (افزودن ستون) باید از مسیر CDC هم عبور کند — schema registry (فصل ۱۳) اینجا هم لازم است.
  • Snapshot اولیه: قبل از دنبال‌کردن لاگ، یک dump سازگار از وضعیت فعلی می‌گیری و بعد به نقطه‌ای از لاگ وصل می‌شوی.

به زبان ساده

CDC یعنی به‌جای اینکه برنامه به چند جا بنویسد، از لاگ تغییرات دیتابیس پخش می‌کنیم؛ هر تغییر خودبه‌خود به ایندکس جستجو، کش و انبار داده می‌رسد.

مثال واقعی

وقتی قیمت کالا در دیتابیس عوض می‌شود، CDC همان لحظه به Elasticsearch و کش خبر می‌دهد؛ لازم نیست برنامه‌نویس یادش باشد سه جا را هماهنگ کند.

دانش‌سنجی

آزمون درس

۴ Q
01
مزیت Log-based CDC بر Polling؟
02
چرا کلید پارتیشن رویدادهای CDC را primary key رکورد می‌گذاریم؟
03
CDC دقیقاً کدام مشکل Outbox را حل می‌کند؟
04
برای sync کردن ایندکس Elasticsearch با DB اصلی، بهترین الگو؟