فید اینستاگرام بستری برای اشتراک گذاری و ارتباط با افراد و چیزهایی است که برای شما مهم هستند. وقتی اینستاگرام را باز میکنید یا فید خود را بهروزرسانی میکنید، عکسها و ویدیوهایی که فکر میکنیم به آنها علاقهمند خواهید بود در بالای صفحه نمایش داده میشوند.
فید خبری مجموعه ای از آیتم های حاوی متن، تصاویر یا ویدیوهایی است که توسط نهادهای دیگر در سیستم ایجاد شده و برای خواندن شما هدف قرار می گیرند. این همیشه در حال تغییر است، در حالی که سازمان های دیگر در حال ایجاد پست های تازه هستند.
در این پست از نزدیک به طراحی سیستم فید اینستاگرام خواهیم پرداخت. بنابراین، بیایید شروع کنیم.
1 الزامات
ضرورت عملکردی
- فید خبری کاربر از پست های سایر نهادهای موجود در سیستم ایجاد می شود که کاربر دنبال کرده یا به آن علاقه مند است.
- متن، عکس و ویدیو همگی در پستها یافت میشوند.
- فید اخبار کاربر باید با پست های جدید ایجاد شده توسط دیگران به روز شود.
معیار غیر کارکردی
- ایجاد فیدهای خبری باید در زمان واقعی انجام شود. کاربر نهایی باید تنها 12 ثانیه تاخیر را تجربه کند.
- الحاق یک پست جدید: پس از ارسال پست جدید به سیستم، نباید بیش از 5 ثانیه طول بکشد تا یک پست جدید در درخواست فید خبری ظاهر شود.
2. برآورد ظرفیت
- تا مارس 2021، جمعیت جهان تنها 7.8 میلیارد نفر است. این نشان می دهد که 21٪ از جمعیت جهان یک DAU فیس بوک (کاربر فعال روزانه) و 32٪ یک فیس بوک MAU (کاربر ماهانه فعال) (کاربر فعال ماهانه) هستند. فوق العادست.
- بیایید وانمود کنیم سیستمی که در حال ساخت آن هستیم 1 میلیارد DAU دارد تا کارها را آسان تر کنیم.
- فرض کنید شخصی 500 نفر یا کسب و کار را در فیس بوک دنبال می کند. یک گروه یا یک صفحه ممکن است یک موجودیت در نظر گرفته شود.
ترافیک تخمینی
فرض کنید یک کاربر به طور متوسط روزانه 10 بار فید اخبار را دانلود می کند. بنابراین تقریباً 116 هزار QPS و 1e10 درخواست در روز است.
تخمین ذخیره سازی
فرض کنید به طور متوسط 500 پست از فید خبری هر کاربر را برای بازیابی سریع در حافظه نگه می داریم و هر پست 1 کیلوبایت حجم دارد. بنابراین 500 کیلوبایت برای هر کاربر، 500 ترابایت برای همه DAU ها، و 5000 کامپیوتر با 100 گیگابایت رم.
3. API برای سیستم ها
userId (GUID): کاربری که فید خبری او واکشی می شود.
فیلدهای زیر در پارامتر گزینه های اختیاری موجود است:
- afterPostId (GUID): فید اخبار را از پست زیر دریافت کنید. اگر مشخص نیست، آخرین پست ها را دریافت کنید.
- count (تعداد): حداکثر تعداد پست هایی که هر درخواست می تواند برگرداند. در صورتی که هیچ یک از آنها ارائه نشود، پشتیبان یک عدد حداکثر پیش فرض را تعیین می کند.
- excludeReplies (بولی): از درج پاسخ ها در فید خبری جلوگیری می کند.
- JSON برگشتی حاوی لیستی از موارد فید خبری است.
4. طراحی پایگاه داده
اشخاص
- کاربر
- entityId، نام، توضیحات و مهر زمانی همگی فیلدهای الزامی هستند.
- فیلدهای زیر مورد نیاز است: PostId، عنوان، متن، شناسه نویسنده، و زمان.
- مهر زمان، آدرس اینترنتی و شناسه رسانه
روابط
- سایر کاربران یا نهادها می توانند توسط یک کاربر دنبال شوند. (m:n)
- نویسنده-پست: هم کاربران و هم نهادها می توانند پست ایجاد کنند. فرض کنید فقط کاربران می توانند برای سادگی پست ایجاد کنند. (1:n؛ authorId قابل جاسازی است).
- هر پست با نوعی رسانه همراه است. (1:n)
5. طراحی سطح بالا
معماری
گردش کار
تولید خوراک
هنگامی که جی درخواست جریان اخبار خود را می کند، سیستم موارد زیر را انجام می دهد:
- شناسه همه افراد و چیزهایی را که جی دنبال می کند، بازیابی کنید.
- پستهای انبوه: با توجه به آن شناسهها، جدیدترین، محبوبترین و مرتبطترین پستها را دریافت کنید.
- پست ها را با توجه به ارتباط و زمان بندی آنها رتبه بندی کنید.
- کش: فیدهای ایجاد شده را ذخیره کنید و 20 پست برتر را برای جی ارسال کنید.
- وقتی جی خواندن 20 پست اول را تمام کرد، درخواست دیگری برای دریافت 20 پست بعدی ارسال می شود.
توزیع خوراک
فرض کنید جی آیوش را دنبال می کند و آیوش هر چیز جدیدی را پست می کند. فید خبری جی باید توسط سیستم به روز شود:
- شناسه فالوورهای آیوش را بازیابی کنید.
- افزودن مقالات جدید: پست Aayush را به جمع اخبار دنبال کنندگان آن شناسه ها اضافه کنید.
- پست ها را با توجه به ارتباط و زمان بندی آنها رتبه بندی کنید.
- حافظه پنهان پست رتبه بندی را به روز کنید.
- هنگام انتشار پست های جدید باید به دنبال کنندگان اطلاع داده شود.
اجزاء
اتصالات کاربران توسط وب سرورها حفظ می شود.
رویه های ذکر شده در بالا توسط سرور برنامه اجرا می شوند.
کش و پایگاه داده:
- کاربر/نهاد پایگاه داده رابطه ای
- پایگاه داده رابطه ای (پست)
- ویژگی تصویر/ویدیو: Aayush storge
- ابرداده پایگاه داده رابطه ای
خدمات شخصی سازی شده:
- تولید خوراک
- اطلاع رسانی فیدها
6. طراحی دقیق
تولید خوراک
Fan-out خواندن اجرای ساده:
مشکلات این پیاده سازی نامرتب عبارتند از:
- کاربرانی که تعداد زیادی دوست/فالوور دارند کاهش قابل توجهی را متوجه خواهند شد زیرا ما باید تعداد زیادی پست را غربال، ادغام و رتبه بندی کنیم.
- هنگامی که کاربر صفحه خود را بارگذاری می کند، ما خط زمانی را می سازیم. این می تواند کند باشد و تاخیر زیادی داشته باشد.
- هر بهروزرسانی وضعیت منجر به بهروزرسانی فید برای همه دنبالکنندگان برای بهروزرسانیهای زنده میشود. این می تواند باعث تاخیرهای قابل توجهی در سرویس تولید خبرفید ما شود.
میتوانیم گاهشماری را از قبل تولید کنیم و آن را در حافظه ذخیره کنیم تا کارایی را افزایش دهیم.
تولید آفلاین (نوشتن هوادار)
ما می توانیم سرورهای اختصاصی داشته باشیم که دائماً اخبار کاربران را ایجاد و در حافظه ذخیره می کنند. ما فقط می توانیم فید اخبار را از محل از پیش تولید شده و ذخیره شده هر زمان که کاربر بخواهد ارائه کنیم.
فید کاربر باید چند مورد در حافظه ذخیره شود؟
بر اساس رفتار استفاده خود سازگار شوید.
آیا باید یک فید خبری برای همه کاربران ایجاد کنیم (و آن را در حافظه حفظ کنیم)؟
- برای افرادی که زیاد وارد سیستم نمی شوند.
- کش مبتنی بر LRU یک رویکرد ساده است.
- راه حل بهتر این است که بفهمید کاربران چگونه وارد می شوند. چه زمانی است؟ در مورد کدام روزهای هفته صحبت می کنید؟
انتشار خوراک
Fanout فرآیند ارسال یک پست برای همه دنبال کنندگان شما است.
خواندن Fanout (کشش)
هنگامی که شما یک فید خبری درخواست می کنید، سیستم یک درخواست خواندن دریافت می کند. Fanout read یک درخواست خواندن برای همه دنبال کنندگان شما ارسال می کند و از آنها می خواهد که محتوای آنها را بخوانند.
مزایا:
- روش نوشتن ارزان است.
- هنگام خواندن داده ها، استفاده از الگوریتم های مختلف تجمع آسان تر است.
منفی:
- برای فردی که فالوورهای زیادی دارد، عملیات خواندن نسبتاً گران است.
- کاربران تا زمانی که داده های تازه را نگیرند، نخواهند دید.
- هنگامی که به طور منظم جدیدترین پستها را دریافت میکنیم، یافتن آهنگ کشش مناسب دشوار است و اکثر درخواستهای کشش پاسخی خالی برمیگردانند و منابع را هدر میدهند.
نوشتن Fanout (فشار)
هنگامی که یک پست جدید ارسال می کنید، یک درخواست نوشتن به سیستم ارسال می شود. درخواست نوشتن برای همه دنبال کنندگان شما ارسال می شود تا فید خبری خود را با استفاده از fanout write به روز کنند.
در هر
- فرآیند خواندن ارزان است.
با
- برای کاربری با میلیون ها فالوور، نوشتن روش خیلی گران است
رتبه فید
الگوریتمهای رتبهبندی امروزی بهجای مرتب کردن فیدها بهصورت زمانی، علاوه بر این تلاش میکنند تا تضمین کنند که موارد با ارتباط بیشتر اولویتبندی میشوند.
- عواملی را انتخاب کنید که میتواند به شما در تصمیمگیری درباره مرتبط بودن یک مورد فید کمک کند، مانند تعداد لایکها، نظرات، و اشتراکگذاریها، زمانی که مورد آخرین بهروزرسانی شده است اگر مقاله حاوی عکس یا ویدیو باشد و غیره.
- امتیاز را بر اساس ویژگی ها محاسبه کنید.
- از امتیاز برای رتبه بندی پست ها استفاده کنید.
KPI هایی مانند حفظ کاربر، درآمد تبلیغات و غیره را تنظیم کنید تا ببینید سیستم رتبه بندی ما چقدر موثر است.
نتیجه
علیرغم این واقعیت که اینستاگرام یا تجارت اصلی آن فیس بوک یک شرکت بزرگ است، درک بهتری از آن دارد طراحی سیستم.
من تمام تلاشم را کردم تا خلاصهای از فید اینستاگرام در سطح بالایی ارائه دهم.
امیدوارم مفید بوده باشد و از آن به خوبی استفاده کنید.
پاسخ دهید