نرم افزارهای مدیریت صف توزیع شده یک ابزار مناسب برای پیاده سازی برنامه های توزیع شده

by مجتبی بنائی - شنبه 08 شهریور 1393 - گروه : تخصصی - مشاهده : 4
برچسب‌ها: #تخصصی‌نرم‌افزار #RabbitMQ #تجربیات #تخصصی #کافکا

s: RabbitMQ | تجربیات | تخصصی | کافکا از سال گذشته که درگیر یک پروژه بین المللی در زمینه خواندن اخبار و بررسی محبوبیت هر خبر در شبکه های اجتماعی هستم تا امروز که چند روزی بیشتر به راه افتادن نسخه اول این سایت نمانده است، برای بخش پشت صحنه (Backend) که پیوسته باید سایت های خبری تمام خبرگزاریهای مطرح دنیا در تمام کشورها را چک کند (در حال حاضر ۵۴ کشور) و در کمتر از چند دقیقه اخبار جدید منتشر شده را به بانکهای  اطلاعاتی ما منتقل کند، سه پیاده سازی مختلف داشته ایم . تعداد بالای خبرگزاری ها و خواندن لحظه ای تمام اخبار به زبانهای مختلف، چالش بزرگ ما در این یکسال بوده است که چگونه با منابع محدود بتوانیم این کار را انجام دهیم . در روش اول از دیتابیس ردیس به عنوان صف مشترک بین سرورهای مختلف  استفاده کردیم و هر برنامه خبرخوان از سر صف چندین خبرگزاری را انتخاب می کرد و شروع به بررسی اخبار و پیدا کردن اخبار جدید و ارسال آنها به صفهای آمارگیری شبکه های اجتماعی می کرد . در این روش،‌الگوریتم ما قابلیت توزیع در شبکه را به راحتی داشت فقط کافی بود دیتابیس ردیس را در یک سرور جدید به اشتراک می گذاشتیم و خبرخوان ها به تعداد لازم کارشان را انجام میدادند .مشکلی که در این روش داشتیم ، نحوه مدیریت دسترسی همزمان برنامه ها به صف و توزیع عادلانه خبرگزاری ها بین آنها بود که با دانش اولیه اندک ما راه حل مناسبی برای آن پیدا نکردیم . در رهیافت بعدی ، مدیریت خبرخوان ها را خودمان بر عهده گرفتیم و توزیع خبرگزاری ها را بین این خبرخوان ها با کمک دیتابیس مانگو به گونه ای انجام دادیم که هر خبرخوان تعداد مشخصی خبرگزاری را بر عهده بگیرد به طوری که حداکثر تا سه دقیقه تمام خبرگزاری ها بررسی شوند و اگر یک خبرخوان کند عمل می کرد، تعدادی از خبرگزاریهای آنرا جدا کرده به یک خبرخوان جدید می دادیم. این الگوریتم در محیط تست و با تعداد کم خبرگزاریها،‌بسیار خوب عمل کرد که این امر باعث شد حواسمون به مقیاس پذیری الگوریتم نباشد اینکه بتوانیم به راحتی تعداد خبرگزاری ها یا تعداد سرورها را افزایش دهیم یا زمان مورد نظر برای سرعت خواندن اخبار جدید را  جابجا کنیم . مثلا یکی از مشکلاتی که گریبانگیر ما شد این بود که تعداد خبرگزاری ها که زیاد شد ، الگوریتم ما تعداد زیادی پروسس در لینوکس به عنوان خبر خوان ایجاد می کرد که این تعداد زیاد باعث افزایش زمان انتظار هر برنامه میشد که خود برنامه مدیریت توزیع‌ را مجبور می کرد برای دفعه بعد تعداد خبرخوان ها را بیشتر و تعداد خبرگزاری های هر یک را کم کند که این امر باز اوضاع را بدتر می کرد. نهایتا به جای سه دقیقه به بیست دقیقه در خواندن اخبار جدید بسنده کردیم . این بود که در سومین تلاش با ایده گرفتن از روش اول ، به دنبال  یک صف توزیع شده بودیم که به راحتی بین تعداد زیادی سیستم توزیع شود و مدیریت توزیع خبرگزاریها بین خبرخوان ها در شبکه را خودش برعهده بگیرد و اگر پیامی (یا یک خبرگزاری) پردازش نشد، به طور خودکار به خبرخوان دیگری ارسال شود و کارهایی ازاین قبیل که در تلاش دوم خودمان انجام داده بودیم و اکنون دنبال یک راه حل آماده و آزمایش شده بودیم . قبلا کافکا را به عنوان یک صف توزیع شده استفاده کرده بودیم که ما را اذیت کرده بود، این سری با خواندن تجربیات سایت Indix که کاری مشابه ما را انجام میداد، به سراغ صف توزیع شده RabbitMQ رفتم که بسیار خوب عمل کرد و کد نویسی ساده ای داشت در عین اینکه کل مدیریت عادلانه وحرفه ای توزیع پیام های صف (صف ما در اینجا لیست خبرگزاریهای آماده پردازش بود) را بین شبکه بر عهده گرفت و تنها وظیفه ما پرکردن این صف در بازه های زمانی معین و خواندن یک پیام از صف و پردازش آن با تعداد ثابتی خبرخوان در هر سرور بود که تا امروز بدون مشکل و مطابق با نیازهای ما عمل کرده است . خلاصه کلام اینکه برای طراحی یک الگوریتم که بتواند مقیاس پذیر باشد و در یک شبکه بزرگ هم به خوبی عمل کند ،‌نیاز به ابزارهای توزیع خودکار در شبکه داریم که صفهای توزیع شده امروزه این بستر را برای ما فراهم کرده اند که به جای تمرکز روی مباحث شبکه  و ارسال و توزیع پیام ، تنها پردازش پیام ها فکر کنیم و نگران مسایل دیگر نباشیم . البته سیستم های مدیریت فایل توزیع شده مانند HDFS‌ که ذخیره فایلها را هم به صورت خودکار و بدون دخالت ما در کل شبکه توزیع می کند ، هم می تواند در بعضی کاربردها مفید واقع شو د.

Comments