طراحی و معماری سایت خبرخوان

قصد دارم معماری یک نرم افزار خبرخوان را که با crawl کردن یه سری سورس مشخص Feed های خودش را محیا میکند و در اختیار کاربر قرار میدهد را در این پست با شما به اشتراک بگذارم.

این نرم افزار، فرضا چندین سایت دیگر (مانند Twitter، دیجیاتو، دیجی کالا و ...) را برای یافتن پست هایشان Crawl میکند و در وب سایت خود پست میکند. کاربران با ثبت نام و مشخص کردن دسته بندی های مورد علاقه خود، به پست های مرتبط از سورس های متعدد دسترسی پیدا میکنند. هم چنین با لایک کردن پست ها، نشان میدهند چه محتوایی برایشان جالب بوده و این محتوا نیز در صفحه Feed آنها به نمایش در می آید.

بعد از مشخص کردن نیازمندی های سیستم، برویم سراغ طراحی سیستم.

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



دیتا مدل (Data Model)

News Reader Data Model
News Reader Data Model

به نظرم خیلی نیاز نیست راجع به دیتا مدل صحبت بکنم.

چندتا نکته رو صرفا اشاره میکنم:

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

معماری کرالر ها (Crawlers)

از اونجایی که Crawl کردن یک سایت کار ساده ای نیست و این سیستم باید تعداد زیادی سایت رو در زمان کم کرال کنه تا بتونه محتوای خوب و آپدیتی رو به کاربر نشون بده، پس یه معماری مناسب نیاز داریم.

از اونجایی که قبلا گفتم سایت هایی که کرال میکنیم از قبل مشخص هست، از کلاس CrawlContentProcessor برای کرال کردن استفاده میکنیم (نمودار سمت راست).

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

چرا این بخش رو جدا کردم؟ چون نتورک استیبل نیست. یک سایت کند هست، یک سایت بالا نمیاد و غیره، ما دیتا این سایتا رو درواقع برای مدت زمان مشخصی کش میکنیم تا CrawlContentProcessor بتونه با سرعت بیشتری کارش رو انجام بده.

اگر توجه کرده باشید، یه متد تو CrawlContentProcessor هست که مشخص میکنه این آدرس قبلا کرال شده و پردازش شده یا نه.

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

دوست داشتید این پست رو به اشتراک بذارید تا دوستامونم بیان و نظر بدن.

ممنونم