Change Data Capture چیست؟

Image تحقیقات

Change Data Capture چیست؟

سلام

در این مقاله قصد دارم شما رو با مفهوم CDC و کاربردهای آن آشنا کنم.

با من در ادامه همراه باشید.

من قصد دارم در این مقاله با استفاده از یک مثال عملی شما رو خیلی راحت تر با این مفهموم آشنا کنم.

 

طراحی زیرساخت یک شبکه اجتماعی

فرض کنید قصد طراحی یک سرویس شبکه اجتماعی را داریم.

در ابتدای امر ساختار کل سرویس ما چیزی شبیه به تصویر زیر خواهد بود:

Traditional Application

همانطور که از این ساختار پیداست، نرم افزار ما از دو قسمت App و DB تشکیل شده است. در این ساختار برنامه ی ما در صورت نیاز داده های خود را در داخل دیتابیس درج کرده و در مواقع مورد نیاز این داده ها را مجددا از این دیتابیس فراخوانی می کند.

حالا فرض کنید بعد از گذشت مدتی از کارکرد این سرویس ما با یک چالش جدید روبرو میشویم.

چالش: بخش جستجو در شبکه اجتماعی ما به دلیل بالا رفتن داده های متنی بسیار کند شده است. 

بعد از بررسی چالش به این نتیجه میرسیم که باید از یک Search Engine مثل ElasticSearch در کنار دیتابیس رابطه ای استفاده کنیم و جستجو متون را در این ابزار به دلیل بالا بودن سرعت آن انجام دهیم.

ساختار سرویس ما به شکل زیر تغییر می کند:

Complex App

خوب تصمیم میگیریم از این لحظه زمانی که کاربران اقدام به ارسال پست می کنند این پست را هم در DB و هم در ElasticSearch نگه داری کنیم. به عبارت دیگر تمام اکشن های نرم افزار ما که قصد درج، ویرایش و حذف داده در Elastic و MySQL را دارند در لحظه به صورت Atomic باید داده ها را در هر دو Data Store تغییر دهند.

بعد از گذشت مدتی سرویس با چالش جدیدی روبرو می شود.

چالش: ما قصد ترسیم گراف ارتباطی بین کاربران مختلف سرویس را داریم اما به دلیل پیچیده شدن query در MySQL و همچنین کندی آن مجبور به راه اندازی ابزار جدیدی در سرویس برای بهبود این چالش میشیم.

بعد از تحقیق و بررسی به این نتیجه میرسیم که از ابزار Neo4j برای رفع این چالش استفاده کنیم.

ساختار سرویس را به شکل زیر تغییر میدهیم.

خوب از این لحظه هر زمانی که تغییری در نوع ارتباط کاربران صورت گرفت این تغییر هم در MySQL و هم در neo4j می بایست صورت بگیرد.

اما این پایان کار نیست.

ما دو چالش اخیر رو برطرف کردیم اما چند چالش دیگر به وجود آمد:

اولین چالش ما کند شدن App ما هستش. زمانی که کاربر پستی ارسال می کند و یا تغییری در در لیست دوستان آن صورت می گیرد بعد از ثبت این تغییرات، اکشن ما مستلزم انجام این تغییرات در حداقل دو Data Store می باشد و این رفتار هم باعث کندی در اکشن و هم بزرگ شدن اکشن می شود.

چالش دوم اما در ارتباط با lost شدن داده می باشد. اگر اکشن ما به هر دلیلی در لحظه داده را در MySQL ثبت کند اما در هنگام درج آن در Elastic یا Neo4j به خطا بخورد این داده lost می شود. حال ممکن هست ما مواردی برای جلوگیری از lost شدن داده مثل retry کردن و یا ذخیره آن در فضای دیگری برای تلاش مجدد در آینده داشته باشیم اما هر دوی اینها زمان بر و پیچیده خواهد بود.

 

اما راه حل چیست؟

یک راه ساده برای رهایی از این مشکل راه اندازی سرویس های دیگری برای خواندن لحظه ای داده ها از MySQL  و اعمال تغییرات آن در Elastic و Neo4j می باشد.

 

ما در این روش برای هر کدوم از ابزار های ElasticSearch و Neo4j کدی طراحی و پیاده سازی کردیم که هر چند ثانیه به دیتابیس اصلی SELECT بزنه و آخرین تغییرات را با استفاده از Auto_Increment شناسایی و در داخل این ابزار ها ذخیره سازی کنه.

اما مشکل این روش چیست؟

بزرگترین مشکل این روش مدیریت تغییرات داده ها در دیتابیس توسط برنامه نویس می باشد. تصور کنید داده ای که قبلا در دیتابیس درج شده و در Elastic ایندکس شده بار دیگر تغییر کند. در این صورت کد اجرایی ما متوجه این تغییر نخواهد شد مگر با روش های دستی و مدیریت آن توسط برنامه نویس.

 

CDC

CDC به گروهی از نرم افزار ها (کامپوننت ها) در دیتابیس ها گفته می شود که وظیفه آنها Track کردن تغییرات دیتابیس ها و انتقال این تغییرات به محیطی دیگر می باشد.

به معنای ساده تر تصور کنید به جای اینکه اسکریپت ما تغییرات داده ها را با استفاده از SELECT و یا تریک های برنامه نویسی متوجه شود، این تغییرات را از طریق یک کانال امن دریافت کند.

خوب اگر بخواهیم CDC رو در مثال سرویس شبکه احتماعی ببینیم معماری ما به شکل زیر تغییر پیدا خواهد کرد:

در این روش تمامی تغییرات در دیتابیس MySQL به صورت اتوماتیک توسط ابزار CDC شناسایی شده و به ابزار های دیگر ما یعنی Elastic و Neo4j منتقل می شود.

در پست آینده شما رو با انواع ابزارهای CDC در MySQL  آشنا خواهم کرد.

موفق باشید.