خانه / کلان داده / ابزار و کتابخانه ها / لزوم استفاده از صف های توزیع شده در برنامه های مقیاس پذیر
DistributedQueue

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

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

۳ نظرات

  1. شاید با یه فیلد Locck  تو پایگاه داده MongoDB و استفاده از Transaction ها برای قفل کردن اون خبرگذاری هم می‌شد این کار رو انجام داد.

    البته خب من چون با جزئیات پروژه تون آشنا نیستم شاید این راه حل‌م درست بنظر نیاد.فقط به ذهنم رسید خواستم باهاتون در میون بذارم.
    مهندسی داده :
    در زمینه مانگو دی بی خیلی اطلاعات تخصصی ندارم و ممکنه این راه حل شما هم برای این موضوع مفید باشه اما کلیت صف های توزیع پذیر جزء لاینفک معماری های اطلاعاتی و ساختارهای پردازش داده امروزی هستند.

    • سلام در مورد صف توزیع شده اطلاعات بیشتری اگه بزارید ممنون میشم

      مهندسی داده :
      ممنون از تماس شما . اگر دقیق تر می فرمودید که چه نیاز فنی ای دارید راحت تر می توانستیم راهنماییتان کنیم . اینکه نمونه کد یا معماری سیستم های موجود یا فریمورک و کتابخانه خاصی مدنظرتان هست یا نه ؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Time limit is exhausted. Please reload CAPTCHA.