رهبر گروه کانتینرها (بخش چهارم)

خب بعد از مطلب سوم که به تحلیل خیلی کلی پروژه پرداختیم، یک سری کد های اولیه و ساده ای رو پیاده کردم که بشه عملا عملکرد سیستم رو واقعی دید.

از بخش php پروژه که با لاراول و خیلی ساده نوشته شده شروع میکنیم:

اطلاعات رو از ریکوئست میگیریم و میریزیم تو پایگاه داده! همین

اما schema پایگاه داده مون به چه صورته:

id که کلید ایندکس گذاری داده هاست ولی باید عوض بشه به نظرم چون ممکنه بعدا برای جستجو روی user_name و … کار کنیم. ولی فعلا مهم نیست. user_name اسم کاربره، text متن ورودی کاربره، sended مشخص میکنه که پست ارسال شده یا نه تا حالا، sended_time میگه که چه زمانی دقیقا ارسال شده برای همه، show_period_in_seconds هم میگه قراره پست چند ثانیه نمایش داده بشه، و اون دوتای آخر هم زمان ساخت رکورد و آپدیت شدن رکورد رو نگه میدارن.

پس تا اینجا توسط laravel اطلاعات رو میگیریم (از کلاینت ها منطقا) و میریزیم تو دیتابیس. حالا مرحله بعد یک کد پایتونی داریم. یا دقیقترش یک job پایتونی که سیستم عامل هر n ثانیه اجراش میکنه. اما هدف خلقتش چیه؟ هدفش اینه که میره تو دیتابیس و یک سری سوال میپرسه و بر اساس جوابی که دیتابیس بهش میده وظیفه شو انجام میده. مصداق کامل مامور و معذور. اما بیاین ببینیم چیا میپرسه و چی بهش جواب داده میشه:

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

اما پایتون اطلاعات روز طریق بستر HTTP میفرسته به Socket Server هامون که اینجا از Socket I/O استفاده کردیم. چه کار کردیم؟ خیلی راحت یک کد خیلی خیلی ساده نوشتیم:

یک کد کوتاه و خیلی راحت و قابل فهم 🙂 یک http server و socket server داریم. روی http server به درخواست های سرویس پایتونیمون گوش میدیم. اگر اون بهمون چیزی بده متوجهش میشیم (بهمون post میکنه) و از طریق سوکت سرور به همه کلاینت های متصل به سرور اطلاعاتی که بهمون داده رو ارسال میکنیم.

تو فرانت اند چه کار میکنیم؟

به سوکت سرور وصل میشیم، هر وقت خبری بشه از سمت سرور،‌ آخرین اطلاعات رو میگیریم و نمایش میدیم. همین و بس. (تو این لحظه اطلاعات مربوط به تعداد پست های نمایش داده نشده رو چون سرور هنوز نمیفرسته من همینجوری نوشتم ۴۲. چرا ۴۲ حالا نوشتم؟ پاسخ)

البته در حین نوشتن این مطلب چند مدل دیگه برای پیاده سازی پروژه به ذهنم رسید که هم منطقی تر بود و هم بهینه تر، ولی چون نمیخوایم زیاد درگیر نوشتن خود کد ها بشیم، فعلا سعی میکنم رو این بخش زیاد نمونم و همینطوری بریم که زودتر به کوبرنیتز برسیم. ولی یک ریفکتور اساسی تو کدنویسی و معماری کل سرویس ها خواهیم داشت و یکی از مطالب آینده رو به توضیح بازنویسی معماری میپردازم. (البته حتما شما هم ایده های خوبی ممکنه داشته باشین که تو کامنت ها منتظر خوندنشون هستم تا ازتون چیز یاد بگیرم)


پروژه هم کامل تو گیت هاب هست و میتونید بخونید،‌ بهترش کنید و یا هر چیز دیگه. اگر مشکلی هم تو اجرا کردنش خوردین بهم بگین تو issues گیتهاب یا کامنت ها یا هر راه دیگه ای که دوست دارین.

امیدوارم هرکجا که هستید سالم و امیدوار باشید.

بازدیدها: 18

۲ دیدگاه

  1. به به
    من یکم بدقولی‌ کردم که واقعا عذر میخوام.
    ولی چیز خوبی‌میشه یک سری پست که تا الان خوب‌ رفته جلو و داره موضوع جدیدی رو بیان میکنه.

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

پاسخی بگذارید

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