ایندکس داده ها با استفاده از Debezium بر روی Typesense برای ایجاد سرویس جستجوی سریع | CDC pipeline
۲ شهریور ۱۴۰۴
با استفاده از Debezium تغییرات اطلاعات رو از دیتابیس اصلی می خوانیم و بر روی RabbitMQ قرار می دهیم و در نهایت یک سرویس indexer ایجاد می کنیم تا مسیج هایی که روی RabbitMQ قرار گرفته اند را پردازش و اطلاعات را بر روی Typesense ایندکس کند.
در این قسمت از یک سرویس پیش ساخته کوچک برای مدیریت وبلاگ استفاده می کنیم و با استفاده از CDC یک سرچ سریع بر روی این پروژه پیاده سازی میکنیم.
معرفی اولیه
سرویس ما یک وبلاگ ساده است که قابلیت ایجاد, حذف و ویرایش محتوا را به ما میدهد. این پروژه از Golang به عنوان زبان بکند و از PostgreSQL به عنوان دیتابیس اصلی استفاده میکند. ما با استفاده از CDC میتوانیم تغییرات اطلاعات را از جدول blog بخوانیم و این تغییرات را بر روی دیتابیس typesense ذخیره کنیم.
سورس کد نهایی پروژه را میتوانید در گیت هاب ببینید و دانلود کنید. برای اجرای پروژه ابتدا با استفاده از ترمینال به پوشه پروژه بروید و سپس با استفاده از Docker با اجرای دستور زیر , پروژه را اجرا کنید:
و در نهایت میتوانید پروژه را با استفاده از دستور زیر خاموش کنید:
اگر با داکر آشنا نیستید یا اون رو نصب نکردید بهتره که ابتدا داکر را نصب کنید و همچنین فرصت خوبی خواهد بود تا کمی با داکر آشنا شوید.
و اگر روی سیستم makefile دارید میتونید درون پوشه پروژه دستور های زیر را برای راه اندازی و خاموش کردن سرویس ها استفاده کنید:
معماری پروژه
قبل از شروع به پیاده سازی ساختار نهایی چیزی که میخواهیم داشته باشیم رو بررسی کنیم.
ما در مجموع از ابزاری زیر استفاده خواهیم کرد تا پروژه خودمون رو بسازیم:
از PostgreSQL به عنوان دیتابیس اصلی برای ذخیره سازی و نگهداری محتوا استفاده میکنیم.
از دیتابیس Typesense برای ایندکس کردن full text محتوا به منظور استفاده در سرچ استفاده می کنیم. بدین صورت اپلیکیشن ما میتونه خیلی سریع محتوای مورد نظر را جستجو کند و نتایج را برای کاربرهای اپلیکیشن ما فراهم کند.
از RabbitMQ به عنوان صف یا queue استفاده می کنیم. بدین صورت تغییراتی که روی دیتابیس اصلی انجام می شوند را درون این صف (queue) قرار می دهیم و سپس با پردازش مسیج های درون صف, اطلاعات را روی Typsense بروز رسانی می کنیم.
بدین صورت بدون اینکه فشاری به دیتابیس اصلی ما وارد شود تمامی اطلاعات را روی Typesense به صورت آنی ایندکس خواهیم کرد.
از Debezium برای خواندن لاگ های PostgreSQL و تبدیل لاگ ها به مسیج بر روی RabbitMQ استفاده میکنیم. بدین صورت تغییراتی که بر روی اطلاعات در PostgreSQL انجام می دهیم به صورت مسیج هایی درون RabbitMQ ذخیره میشوند.
یک اپلیکیشن indexer میسازیم که مسیج های نوشته شده بر روی RabbitMQ را بخواند و بر اساس این مسیج ها اطلاعات را بر روی Typsense ایندکس و آپدیت کند.
اپلیکیشن اصلی ما که وظایف آن به دو قسمت اصلی تقسیم میشوند:
عملکرد های مرتبط با دشبورد برای مدیریت پست های بلاگ که اطلاعات را بر روی دیتابیس اصلی (در اینجا PostgreSQL) ذخیره و بروز رسانی میکند.
عملکردهای عمومی از جمله صفحه اصلی, ادامه مطلب پست ها و جستجو درون مطالب که اطلاعات را از Typesense میخوانند و نمایش میدهند.
شکل کلی اپلیکیشن ما به صورت زیر خواهد بود:
راه اندازی Debezium بر روی PostgreSQL
برای راه اندازی Debezium بر روی Postgres طبق مستندات نیازمند انجام مراحل زیر هستیم:
- فعالسازی WAL (write ahead log) در PostgreSQL
- اجرا کردن Debezium
فعالسازی WAL در PostgreSQL
برای اینکار میتوانیم یک فایل با پسوند conf در مسیر /etc/postgresql/
بسازیم. مثلا من این فایل با نام postgresql.conf
به صورت /etc/postgresql/postgresql.conf
میسازم.
سپس تنظیمات زیر را درون آن قرار میدهیم:
اجرا کردن Debezium
ما برای اجرا کردن debezium از debezium-server استفاده میکنیم و طبق مستندات تنظیمات را برای اتصال به RabbitMQ و خواندن لاگ های PostgreSQL انجام میدهیم. تمامی این تنظیمات را میتوان با استفاده از متغیرهای محیطی نیز انجام داد. ما متغیرهای محیطی زیر را به debezium-server پاس میدهیم:
بعد از اجرا شدن Debezium باید بتوانیم پیام هایی که به RabbitMQ اجرا می شوند را در دشبورد RabbitMQ ببینیم.
در نمودار بالا میتونیم ببینیم که در یک بازه زمانی کوتاه 60 مسیج در ثانیه به RabbitMQ ارسال شده اند. در ادامه یک سرویس ایجاد میکنیم که این مسیج ها پردازش کند و نتیجه را بر روی Typesense ایندکس کند.
نکته: در صورتی که از پروژه ی ایجاد شده در گیت هاب ما استفاده میکنید, بعد از اجرای پروژه میتونید به آدرس
http://localhost:15672/
برید و با یوزرنیم admin و پسوورد admin123 وارد شوید.
ایجاد سرویس Indexer
این سرویس مسئول پردازش مسیج هایی است که Debezium بر روی RabbitMQ مینویسد. پردازش هر مسیج شامل ایجاد , ویرایش یا حذف ایندکس می شود.
اگر کاربر محتوای جدیدی ایجاد کند آن محتوا به صورت مسیج بر روی RabbitMQ قرار میگیرد و سپس سرویس indexer با پردازش این مسیج یک ایندکس جدید بر روی Typesense ایجاد میکند.
اگر کاربر محتوای فعلی را ویرایش کند این ویرایش به صورت یک مسیج بر روی RabbitMQ قرار میگیرد و سپس سرویس ایندکسر با پردازش این مسیج , محتوای ایندکس شده ی فعلی را بر روی Typesense بروز رسانی میکند.
و در نهایت در صورت حذف محتوا , با پردازش مسیج قرار گرفته بر روی RabbitMQ ایندکس متناظر با آن مسیج از روی typesense حذف می شوند.
با توجه به کدهای بالا ما بر حسب نوع مسیجی که در RabbitMQ قرار گرفته عملیات ایجاد , ویرایش یا حذف ایندکس را در Typesense انجام می دهیم. کدهای کامل را میتوانید درون گیتهاب ببینید.
با اجرا کردن سرویس indexer باید داده ها درون Typesense ایندکس شوند و نتیجه را میتوان درون دشبورد typesense دید.
برای مثال در تصویر میبینیم که 290 آیتم در کالکشن posts ایندکس شده اند.
سپس اپلیکیشن اصلی ما میتواند در بین اطلاعات ایندکس شده جستجو انجام دهد و نتایج را به کاربران نمایش دهد:
نکته: در صورتی که از پروژه ی ایجاد شده در گیت هاب ما استفاده میکنید, بعد از اجرای پروژه میتونید به آدرس
http://localhost:8085/
برید تا سرویس وبلاگ رو ببینید.
در تصویر بالا درون سرچ هرچیزی را که جستجو کنیم درصورت وجود داشتن, لیست مطالب مرتبط به ما نمایش داده خواهد شد.
قسمت قبل: ایندکس داده ها با استفاده از Maxwell بر روی Typesense برای ایجاد سرویس جستجوی سریع | CDC pipeline